我想为iOS实现一个图像缩小算法。在读了核心图像的
CILanczosScaleTransform
非常适合它,我通过以下方式实现了它:
public func resizeImage(_ image: UIImage, targetWidth: CGFloat) -> UIImage? {
assert(targetWidth > 0.0)
let scale = Double(targetWidth) / Double(image.size.width)
guard let ciImage = CIImage(image: image) else {
fatalError("Couldn't create CIImage from image in input")
}
guard let filter = CIFilter(name: "CILanczosScaleTransform") else {
fatalError("The filter CILanczosScaleTransform is unavailable on this device.")
}
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(scale, forKey: kCIInputScaleKey)
guard let result = filter.outputImage else {
fatalError("No output on filter.")
}
guard let cgImage = context.createCGImage(result, from: result.extent) else {
fatalError("Couldn't create CG Image")
}
return UIImage(cgImage: cgImage)
}
它工作得很好,但我得到了一个经典的边界伪影,可能是由于该算法的像素邻域基。我在苹果的文档中找不到任何关于这方面的信息。
有什么比渲染更大的图像然后裁剪边界来解决此问题更聪明的方法吗?