我注意到使用Core Image缩小图像似乎会产生一些瑕疵,并且生成的图像看起来并不像相机预览那样清晰。代码非常基础。
// `transform` is a CGAffineTransform object
transform = CGAffineTransformScale(transform, scale, scale);
CIImage *transformedImage = [image imageByApplyingTransform:transform];
有没有办法控制插值质量?
答案 0 :(得分:2)
我研究了几种技术,并找到了几种产生输出图像的方法,我很满意。保持Core Image可以更方便,它可以优化一系列图像处理,而不是在Core Graphics之间来回跳转。
我使用Lanczos Scale Transform滤镜来平滑缩小图像:
// `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则产生了一些文物。