在图像上运行CIFilter会在上方和下方创建不需要的偏移

时间:2018-04-10 16:29:37

标签: ios swift uiimageview core-image cifilter

我在使用CIFilter时遇到问题,它会在输出的图像上方和下方应用偏移/边框。它可以在下面的例子中看到。

enter image description here

在这个示例中,我只是采用UIImage,应用CIPixellate,修复方向,然后在全屏UIImageView中以背景颜色红色显示此图像以演示问题(设置背景)颜色为默认颜色'清除'产生白色偏移。以下是UIImageView的设置。

UIImageView settings

通过调试我知道在应用CIFilter时问题出现并且它与UIImageView无关,如果我只是在没有过滤器的情况下传递图像,则不会发生此问题。

供参考,以下是我用来对图像进行像素化的代码:

extension UIImage {
    func pixellate(amount: Int) -> UIImage? {
        let ciImage = CIImage(cgImage: self.cgImage!)

        let filter = CIFilter(name: "CIPixellate")
        filter?.setValue(ciImage, forKey: kCIInputImageKey)
        filter?.setValue(amount, forKey: kCIInputScaleKey)
        guard let outputImage = filter?.outputImage else { return nil }

        var pixellatedImage: UIImage?

// Fix the orientation of the newly processed image
        let context = CIContext()
        if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
            let processedImage = UIImage(cgImage: cgimg)

            let portraitImage = UIImage(cgImage: processedImage.cgImage!, scale: 1.0, orientation: UIImageOrientation.right)
            pixellatedImage = portraitImage
        }

        return pixellatedImage
    }
}

这里发生了什么?反正有没有阻止这个?

1 个答案:

答案 0 :(得分:2)

许多图像滤镜必须在计算目标像素时包含相邻像素。当然,这会在边缘引起问题。一种可能性是在边缘重复像素。 Apple提供了一种方便的方法: 的 clampedToExtent

  

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

...
let ciImage = CIImage(cgImage: self.cgImage!).clampedToExtent()

另见我的回答:https://stackoverflow.com/a/49309714/2331445