我想为 iOS 实现图像缩小算法。在阅读了 Core ImagesCILanczosScaleTransform
非常适合它之后,我通过以下方式实现了它:
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)
}
它运行良好,但我得到了一个经典的边界伪影,这可能是由于算法的像素邻域基础。我在 Apple 的文档中找不到任何关于此的内容。有没有比渲染更大的图像然后裁剪边框来解决这个问题更聪明的方法?