UIImage在缩放时变得模糊。为什么?(iOS 5.0)

UIImage在缩放时变得模糊。为什么?(iOS 5.0),ios,uiimage,scale,Ios,Uiimage,Scale,UIImage在缩放时总是变得模糊。如果使其保持清晰,我该怎么办 - (UIImage *)rescaleImageToSize:(CGSize)size { CGRect rect = CGRectMake(0.0, 0.0, size.width, size.height); UIGraphicsBeginImageContext(rect.size); [self drawInRect:rect]; // scales image to rect UIIm

UIImage在缩放时总是变得模糊。如果使其保持清晰,我该怎么办

- (UIImage *)rescaleImageToSize:(CGSize)size {
    CGRect rect = CGRectMake(0.0, 0.0, size.width, size.height);
    UIGraphicsBeginImageContext(rect.size);
    [self drawInRect:rect];  // scales image to rect
    UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resImage;
}
试一试:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

在绘制之前获得高质量的插值。

在放大图像的特殊情况下,想要保留任何锐角,需要关闭图像插值。如果你的图像是像素艺术,这就是你想要的。在大多数其他情况下,情况并非如此

UIGraphicsBeginImageContext(rect.size);

// Turn off interpolation to keep the scaled image from being blurred.
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

[self drawInRect:rect];  // scales image to rect
UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
如果要缩小比例,简单地使用kCGInterpolationHigh绘制也不是最好的选择。这很好,但稍微尖锐一点

编辑:从iOS 5.1开始,CILanczosScaleTransform不可用。有关您可以使用的高质量缩放例程,请参阅我的另一个答案。

首先,确保在缩放之前将尺寸四舍五入
drawInRect:
在这种情况下会模糊原本可用的图像。要舍入到最接近的整数值,请执行以下操作:

size.width = truncf(size.width);
size.height = truncf(size.height);
对于某些任务,您可能希望取而代之的是向下取整(floorf)或向上取整(ceilf)

CilanczosCaleTransform不可用 然后,无视我之前对CILanczosScaleTransform的建议。虽然iOS 5.0中提供了部分核心映像,但Lanczos缩放功能不可用。如果它真的可用,就利用它。对于在Mac OS上工作的人,它是可用的,请使用它

vImage标度 但是,在中有一种高质量的缩放算法。下图显示了使用它的方法(VimageScaleImage)与不同上下文插值选项的比较。还要注意,这些选项在不同的缩放级别下的行为是如何不同的

在此基础上,它保留了最多的线条细节:

在这一点上,比较左下角的树叶:

在此基础上,比较右下角的纹理:

不要在手机上使用;它会创建奇怪的缩放瑕疵:

尽管其上有有趣的舍入效果:

演出 毫不奇怪,kCGImageInterpolationHigh是最慢的标准图像插值选项。这里实现的VimageScaleImage更慢。为了将分形图像缩小到其原始大小的一半,UIImageInterpolationHigh花费了110%的时间。缩减到四分之一,花费了340%的时间

如果在模拟器中运行它,您可能会有不同的想法;在那里,它可以比kCGImageInterpolationHigh快得多。据推测,vImage多核优化使其在桌面上具有相对优势

代码
我用VImage尝试了@Dondragmer的答案,但结果的质量不够好(我正在缩小图像的比例为1/10)

不过,这个解决方案对我有效:

基本上,它只是说在视网膜显示器上,您需要使用视网膜参数创建图形上下文:

UIGraphicsBeginImageContextWithOptions(size, NO, 2.0f);

@水有人,这是你能得到的最好的了。另外,Quartz2D使用双线性,因为它实时性更快。质量低于双三次曲线。如果你想要更高的质量,你可能需要使用你自己的插值算法。你有没有给我举一个关于CilanczosCaleTransform的例子?@shuiyouren:我没有举一个CilanczosCaleTransform的例子,因为我不知道你是否需要它。请将两幅图像附加到原始帖子:缩放前的图像和缩放后的图像。然后有人可能会告诉你需要什么算法。@shuiyouren:很抱歉问了这个不可能的问题。不管怎样,我已经描述了你需要CilanczosCaleTransform的情况。你能确认这些都适用于你的问题吗?我认为CilanczosCaleTransform可以解决这个问题,我试图寻找有关如何使用CilanczosCaleTransform的说明{PhotoScrollerNetwork感谢代码中的属性://谢谢::-)上面或下面的内容对我都不起作用,但这一次,我被困了2天,向上投票,向上投票,向上投票,为原创,干杯!!!
UIGraphicsBeginImageContextWithOptions(size, NO, 2.0f);