为何直接调用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
相关产品推荐
相关产品推荐

