Ios 在映像上运行CIFilter会在上面和下面创建不需要的偏移

Ios 在映像上运行CIFilter会在上面和下面创建不需要的偏移,ios,swift,uiimageview,core-image,cifilter,Ios,Swift,Uiimageview,Core Image,Cifilter,我在使用CIFilter时遇到了一个问题,它在输出图像的上方和下方应用了偏移/边框。可以在下面的示例中看到 在本例中,我只是拍摄一幅UIImage,应用Cipixellae,确定方向,然后在背景颜色为红色的全屏UIImageView中显示该图像,以演示问题(将背景颜色设置为默认颜色“clear”会产生白色偏移。下面是UIImageView的设置 通过调试,我知道问题发生在应用CIFilter时的某个地方,它与UIImageView无关,如果我只是在不使用过滤器的情况下传递图像,则不会发生此问

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

在本例中,我只是拍摄一幅UIImage,应用
Cipixellae
,确定方向,然后在背景颜色为红色的全屏
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
    }
}

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

许多图像过滤器必须在计算目标像素时包含相邻像素。当然,这会导致边缘出现问题。一种可能是在边缘重复像素。苹果提供了一种方便的方法: 抓取扩展

调用此方法…通过 从原始图像的边缘重复像素颜色


另请参见我的回答:

这正是问题所在,非常感谢您的解决方案。
...
let ciImage = CIImage(cgImage: self.cgImage!).clampedToExtent()