You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何直接调用UIImage.FromBundle正常,转CGImage后生成的UIImage模糊?

为什么转CGImage再创建UIImage会导致图片模糊?

这问题我之前帮好几个开发者踩过坑,核心原因其实和UIImage的scale属性直接相关!

先搞懂两种加载方式的区别

  • 当你用UIImage.FromBundle("myresource")加载图片时,系统会自动做Retina屏适配:它会根据当前设备的屏幕缩放因子(比如iPhone的2x/3x),自动匹配对应的@2x/@3x资源文件,同时给生成的UIImage设置对应的Scale值(2.0或3.0)。这样系统渲染图片时,会用这个Scale值来计算实际显示的像素,所以画质完美。
  • 但当你通过markerImage.CGImage获取CGImage对象时,这个CGImage只保存了原始的像素数据,不携带任何缩放比例信息。如果直接用new UIImage(markerImage.CGImage)创建新的UIImage,系统会默认把它的Scale设为1.0——这就相当于把一张2倍/3倍的Retina图,当成1倍图来渲染,系统会强行把它拉伸到屏幕的物理像素,自然就变得模糊了。

解决办法也很简单

只需要在创建新UIImage的时候,手动传入原图片的Scale和Orientation参数就行:

UIImage markerImage = UIImage.FromBundle("myresource");
return new UIImage(markerImage.CGImage, markerImage.Scale, markerImage.Orientation);

这样新生成的UIImage就继承了原图片的缩放比例,系统渲染时就会用正确的逻辑处理,画质就和直接FromBundle加载的一样清晰了。

补充:PNG图片的情况

你提到的PNG图用UIImage(image: CGImage)创建后画质差,也是同一个道理——CGImage本身不带Scale信息,默认用1.0的Scale渲染,在Retina屏上自然会模糊,同样用上面的方法带上原Scale就能解决。

内容的提问来源于stack exchange,提问作者zuko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:18:00