我尝试过流行的UIImage + Resize类别,并使用不同的插值设置。我尝试通过CG方法和CIFilters进行扩展。但是,我永远不会得到一个缩小尺寸的图像,它既不会看起来有点柔和,也不会充满锯齿状的伪影。是否有其他解决方案或第三方库可以让我获得非常清晰的图像?
必须可以在iPhone上使用,因为例如,照片应用程序即使在缩小图像时也会显示清晰的图像。
答案 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(尚未)实现锐化过滤器(CISharpenLuminance
,CIUnsharpMask
),因此您必须自己动手。或者唠叨Apple,直到他们在iOS上实现这些过滤器。
然而,锐化亮度和非锐化掩模是相当先进的滤镜,在之前的项目中,我发现即使是简单的3x3内核也能产生清晰可见且令人满意的结果。
因此,如果你想在像素级别工作,你可以从图形上下文中获取图像数据,比特掩盖R,G和B值以及类似于1999年的代码图形。它但是,有点像重新发明轮子。
也许有一些标准的图形库可以做到这一点(ImageMagick?)