在Retina屏幕上使用CGContextDrawImage绘制的图像为什么会出现像素化?

11
我需要将图像绘制到CALayer中,因为我需要对其执行各种效果、动画和滤镜。当我简单地将图像绘制到CGContext中时,无论我做什么,它总是呈现出像素化的效果...那么在Retina屏幕上绘制的正确方式是什么?
这是我现在正在做的事情:
CGImageRef plateImage = [[UIImage imageNamed:@"someImage"] CGImage];
CGFloat width = CGImageGetWidth(plateImage), height = CGImageGetHeight(plateImage);
CGFloat scale = [[UIScreen mainScreen] scale];

NSLog(@"Scale: %f\nWidth: %f\nHeight: %f", scale, width, height);
CGContextTranslateCTM(_context, 0, height / scale);
CGContextScaleCTM(_context, 1.0, -1.0);

CGContextDrawImage(_context, CGRectMake(0, 0, width / scale, height / scale), plateImage);
3个回答

27

我曾经遇到过同样的问题,但是解决方案似乎并没有起作用。

UIGraphicsBeginImageContext()被证明是导致问题的原因。我在这里发布我的解决方案,以供未来遇到相同问题的用户参考。

从iOS 4.0开始,您应该使用:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

而不是

UIGraphicsBeginImageContext(size);

如果您不想要像素化的图像。


谢谢!我不能说我理解为什么它能工作,但它确实可以。 - anonymouse
2
值得注意的是,我将此与被接受的答案结合使用,获得了最佳结果: UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale); - bplattenburg

20

您需要适当设置图层的内容比例。

myLayer.contentsScale = [UIScreen mainScreen].scale

啊啊啊!我在CG文档中到处寻找 - 没想到这是一个图层问题!谢谢你! - shein

0

更新了 @Tieme 的 Swift 4 解决方案

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

替代

UIGraphicsBeginImageContext(size)

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