UIImage的drawInRect:平滑图像

16

我正在尝试使用UIImagedrawInRect:方法绘制图像。这是代码:

UIImage *image = [UIImage imageNamed:@"OrangeBadge.png"];

UIGraphicsBeginImageContext(image.size);

[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];

UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

问题在于生成的图像模糊。以下是源图像(左侧)和生成的图像(右侧)的比较:

源图像和模糊图像

我尝试了 CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), NO)CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), NO),但这并没有解决问题。

有什么想法吗?

先感谢您。

1个回答

30

如果您正在使用视网膜设备进行开发,可能问题与您的图形上下文的分辨率有关。请尝试使用以下方法:

UIGraphicsBeginImageContextWithOptions(size, NO, 2.0f);

这将启用Retina分辨率。另外,你的图片应该以@2x分辨率可用才能正常工作。

如果你想同时支持非Retina设备,可以使用:

if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0f);
} else {
    UIGraphicsBeginImageContext(newSize);
}

2
我不建议使用==来检查浮点数的相等性。你只需要将比例设置为0.f,框架就会处理剩下的部分。(参见https://dev59.com/UXE85IYBdhLWcg3wdDSz) - Mazyod
1
非常感谢!这解决了问题。 if ([UIScreen instancesRespondToSelector:@selector(scale)]) -- 这行代码用于支持 iOS3 吗?scale 属性是从 iOS 4.0 开始支持的。 - tonytony
@Mazyod 我理解的是否正确,即 0.0f 将使框架处理正确的比例,无论当前设备是视网膜屏幕还是非视网膜屏幕? - Timo
@Timo 是的!再次确认我链接的帖子以获取更多信息。 - Mazyod
3
我推荐使用[UIScreen mainScreen].scale代替硬编码的@2x,因为iPhone 6+的比例是3x。 - nemesis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接