在变换 CIImage 时设置插值算法/质量



我注意到使用Core Image缩小图像似乎会产生一些伪影,并且生成的图像看起来不像相机预览那样清晰。代码非常基本。

// `transform` is a CGAffineTransform object
transform = CGAffineTransformScale(transform, scale, scale);
CIImage *transformedImage = [image imageByApplyingTransform:transform];

有没有办法控制插值质量?

我研究了几种技术,并找到了几种生成我非常满意的输出图像的方法。留在Core Image中比在Core Graphics之间来回跳转要方便得多,它可以优化一系列图像处理。

我使用Lanczos缩放变换滤镜平滑地缩小图像:

// `image` is a CIImage
CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"];
scaleFilter setValue:image forKey:kCIInputImageKey];
[scaleFilter setValue:@(scale) forKey:kCIInputScaleKey];
CIImage *scaledImage = scaleFilter.outputImage;

另一个重要的事情是确保所有几何图形都是以像素而不是点计算的。与处理点相比,处理像素可生成质量明显更高的图像。

"锐化亮度"滤镜可以帮助定义调整大小的照片中的细节:

CIFilter *sharpenFilter = [CIFilter filterWithName:@"CISharpenLuminance"];
[sharpenFilter setValue:scaledImage forKey:kCIInputImageKey];
[sharpenFilter setValue:@(0.1) forKey:kCIInputSharpnessKey];
CIImage *sharpenedImage = sharpenFilter.outputImage;

最后,JPEG压缩级别确实对某些图像产生了影响。在0.9左右,它产生了相当清晰的图像,而0.75则有一些伪影。

最新更新