ios - 在图像上运行 CIFilter 会在上方和下方产生不需要的偏移

标签 ios swift uiimageview core-image cifilter

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

enter image description here

在这个例子中,我只是简单地获取一个 UIImage,应用 CIPixellate,固定方向,然后在全屏 UIImageView 中以红色背景色显示该图像来演示问题(将背景颜色设置为默认颜色“clear”会产生白色偏移。以下是 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
    }
}

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

最佳答案

许多图像过滤器必须将邻近像素纳入目标像素的计算中。当然,这会导致边缘出现问题。一种可能性是在边缘重复像素。苹果提供了一种便捷的方法来做到这一点: 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()

另请参阅我的回答:https://stackoverflow.com/a/49309714/2331445

关于ios - 在图像上运行 CIFilter 会在上方和下方产生不需要的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758676/

相关文章:

ios - Swift - 具有不同方法名称的多个扩展但仍然不起作用

ios - 使用数据模型 'relate' 到其他模型(创建关系)

swift - 这是否是快速进行竞争条件的正确方法?

Swift 3 - SIGABRT 错误 - numberOfComponentsInPickerView :]: unrecognised selector sent to instance

ios - 关于使用矩形图像创建圆形 UIImageView 的问题

ios - 在当前上下文 Storyboard上呈现 View Controller

ios - 无法在 Xcode (iPad) 中更改模态视图的呈现和过渡样式

ios - 如何获取所选图像的 'file' 的名称

ios - 在 iOS 中拆分 UIImageView

ios - 无法在 flickr ios 上上传视频