如何在iOS中缩小图像,使其抗锯齿但不模糊?

6
我尝试了流行的UIImage+Resize类别,并使用不同的插值设置。我尝试了通过CG方法和CIFilters进行缩放。然而,我无法获得一个既不模糊又没有锯齿状伪影的缩小图像。是否有其他解决方案或第三方库,可以让我获得非常清晰的图像?
在iPhone上肯定是可能的,因为例如Photos应用程序会在缩小图像时显示清晰的图像。
4个回答

6
你说了CG,但并未说明你的方法。
使用绘制或位图上下文:
CGContextSetInterpolationQuality(gtx, kCGInterpolationHigh);
CGContextSetShouldAntialias(gtx, true); << default varies by context type
CGContextDrawImage(gtx, rect, image);

确保您的视图及其层次不再重新调整图像大小。我在这方面获得了良好的结果。可能其他视图正在影响您的视图或上下文。如果看起来不好,请在隔离环境中尝试以检查是否有任何东西扭曲了您的视图/图像。
如果您要绘制位图,则需要使用目标尺寸创建位图,然后再进行绘制。
最理想的情况是,您将保持纵横比。
还要注意,这可能会非常耗费CPU资源 - 反复绘制/缩放高质量的图像将花费很长时间,因此您可能需要创建一份调整大小的副本(使用CGBitmapContext)。

我一直在使用UI Graphics Context并通过drawInRect或drawAtPoint进行绘制,以及其他方法。然而,你让我重新审视了我的代码,我意识到实际上是由于我的代码的另一个方面导致了问题。 - akaru
是的 - 在图形上下文设置方面明确一些是个好主意,因为它们和图形系统的其他方面可能会有很大的差异。 - justin

4

这是我编写的例程,用于实现此操作。但是,根据您缩放原始图像的程度,可能会有一些轻微模糊。我正在对程序截屏图像进行缩放。

- (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize {

    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

0

0

当图像被缩小时,通常建议应用一些锐化处理。

问题是,在iOS上,Core Image尚未实现锐化滤镜(CISharpenLuminanceCIUnsharpMask),因此您需要自己编写代码。或者向苹果公司施压,要求他们在iOS上也实现这些滤镜。

然而,锐化亮度和反遮罩模糊滤镜都是相当高级的滤镜,在以前的项目中,我发现即使是一个简单的3x3内核也会产生明显可见且令人满意的结果。

因此,如果你想在像素级别工作,你可以从图形上下文中获取图像数据,位掩码到R、G和B值,并像1999年那样编写图形代码。不过这有点像重复造轮子。

也许有一些标准的图形库可以做到这一点(例如ImageMagick)。


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