代码之家  ›  专栏  ›  技术社区  ›  Mick F

如何修复核心图像的CILanczosScaleTransform过滤器边界伪影?

  •  1
  • Mick F  · 技术社区  · 7 年前

    我想为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)
    }
    

    它工作得很好,但我得到了一个经典的边界伪影,可能是由于该算法的像素邻域基。我在苹果的文档中找不到任何关于这方面的信息。 有什么比渲染更大的图像然后裁剪边界来解决此问题更聪明的方法吗?

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mick F    7 年前

    您可以使用 imageByClampingToExtent

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

    您可以这样使用它:

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

    请参见此处的更多信息: Apple Doc for clampedtoextent