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

Running a CIFilter on an image creates an undesired offset above and below

我在使用 CIFilter 时遇到问题,它在输出的图像上方和下方应用了 offset/border。可以在下面的示例中看到。

在这个例子中,我只是获取了一个 UIImage,应用 CIPixellate,固定方向,然后全屏显示此图像 UIImageView,背景颜色为红色以演示问题(设置默认颜色 'clear' 的背景颜色会产生白色偏移。以下是 UIImageView.

的设置

通过调试我知道问题发生在应用 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
    }
}

这里发生了什么?有什么办法可以防止这种情况发生吗?

许多图像过滤器必须将相邻像素包括在目标像素的计算中。当然,这会导致边缘出现问题。一种可能性是在边缘重复像素。 Apple 提供了一种方便的方法来做到这一点: clampedToExtent

Calling this method ... creates an image of infinite extent by repeating pixel colors from the edges of the original image.

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

另请参阅我的回答: