如何修复 Core Image 的 CILanczosScaleTransform 滤镜边框工件?
How can I fix a Core Image's CILanczosScaleTransform filter border artifact?
我想为 iOS 实现图像缩小算法。在阅读到 Core Images 的 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)
}
它运行良好,但我得到了一个经典的边界伪像,这可能是由于算法的像素邻域基础。我在 Apple 的文档中找不到任何关于此的内容。 有没有比渲染更大的图像然后裁剪边框更聪明的方法来解决这个问题?
您可以使用 imageByClampingToExtent
。
Calling this method ... creates an image of infinite extent by repeating
pixel colors from the edges of the original image.
你可以这样使用它:
...
guard let ciImage = CIImage(image: image)?.clampedToExtent() else {
fatalError("Couldn't create CIImage from image in input")
}
在此处查看更多信息:Apple Doc for clampedtoextent
我想为 iOS 实现图像缩小算法。在阅读到 Core Images 的 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)
}
它运行良好,但我得到了一个经典的边界伪像,这可能是由于算法的像素邻域基础。我在 Apple 的文档中找不到任何关于此的内容。 有没有比渲染更大的图像然后裁剪边框更聪明的方法来解决这个问题?
您可以使用 imageByClampingToExtent
。
Calling this method ... creates an image of infinite extent by repeating pixel colors from the edges of the original image.
你可以这样使用它:
...
guard let ciImage = CIImage(image: image)?.clampedToExtent() else {
fatalError("Couldn't create CIImage from image in input")
}
在此处查看更多信息:Apple Doc for clampedtoextent