如何在iOS中缩小图像,消除锯齿但不柔软?

时间:2012-02-02 17:45:53

标签: ios graphics ios5 core-graphics core-image

我尝试过流行的UIImage + Resize类别,并使用不同的插值设置。我尝试通过CG方法和CIFilters进行扩展。但是,我永远不会得到一个缩小尺寸的图像,它既不会看起来有点柔和,也不会充满锯齿状的伪影。是否有其他解决方案或第三方库可以让我获得非常清晰的图像?

必须可以在iPhone上使用,因为例如,照片应用程序即使在缩小图像时也会显示清晰的图像。

4 个答案:

答案 0 :(得分:6)

你说CG,但没有说明你的方法。

使用绘图或位图上下文:

CGContextSetInterpolationQuality(gtx, kCGInterpolationHigh);
CGContextSetShouldAntialias(gtx, true); << default varies by context type
CGContextDrawImage(gtx, rect, image);

并确保您的视图及其图层不会再次调整图像大小。我对此有很好的结果。其他视图可能会影响您的视图或上下文。如果它看起来不太好,请单独尝试,以检查是否有什么东西扭曲了您的视图/图像。

如果要绘制位图,则使用目标尺寸创建位图,然后绘制到该位图。

理想情况下,您将保持宽高比。

另请注意,这可能会占用大量CPU资源 - 在HQ中反复绘制/缩放会花费大量时间,因此您可能需要创建一个调整大小的副本(使用CGBitmapContext)。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您正在寻找CGContextSetInterpolationQuality。

您应该尝试添加此类别 http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

答案 3 :(得分:0)

缩小图像时,应用一些锐化通常是个好主意。

问题是,iOS上的Core Image(尚未)实现锐化过滤器(CISharpenLuminanceCIUnsharpMask),因此您必须自己动手。或者唠叨Apple,直到他们在iOS上实现这些过滤器。

然而,锐化亮度和非锐化掩模是相当先进的滤镜,在之前的项目中,我发现即使是简单的3x3内核也能产生清晰可见且令人满意的结果。

因此,如果你想在像素级别工作,你可以从图形上下文中获取图像数据,比特掩盖R,G和B值以及类似于1999年的代码图形。它但是,有点像重新发明轮子。

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