【问题标题】:How can I fix a Core Image's CILanczosScaleTransform filter border artifact?如何修复 Core Image 的 CILanczosScaleTransform 过滤器边框伪影?
【发布时间】:2018-08-15 06:31:04
【问题描述】:

我想为 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 的文档中找不到任何关于此的内容。 有没有比渲染更大的图像然后裁剪边框更聪明的方法来解决这个问题?

【问题讨论】:

    标签: ios image-processing core-graphics core-image lanczos


    【解决方案1】:

    您可以使用imageByClampingToExtent

    调用此方法...通过重复创建无限范围的图像 原始图像边缘的像素颜色。

    你可以这样使用它:

    ...
    guard let ciImage = CIImage(image: image)?.clampedToExtent() else {
        fatalError("Couldn't create CIImage from image in input")
    }
    

    在此处查看更多信息:Apple Doc for clampedtoextent

    【讨论】:

    • 那 + 一些 CGRect 大小正确(即floorcalls)= ✌️ — 谢谢@Stephan
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 2012-05-27
    • 1970-01-01
    • 2014-05-19
    • 2014-08-16
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多