【问题标题】:Running a CIFilter on an image creates an undesired offset above and below在图像上运行 CIFilter 会在上方和下方创建不需要的偏移量
【发布时间】:2018-09-20 08:54:15
【问题描述】:

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

在此示例中,我只是获取 UIImage,应用 CIPixellate,固定方向,然后以全屏显示此图像 UIImageView,背景颜色为红色以演示问题(将背景颜色设置为默认值color '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
    }
}

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

【问题讨论】:

    标签: ios swift uiimageview core-image cifilter


    【解决方案1】:

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

    调用这个方法...创建一个无限大的图像 从原始图像的边缘重复像素颜色。

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

    也可以在这里查看我的回答:https://stackoverflow.com/a/49309714/2331445

    【讨论】:

    • 这正是问题所在,非常感谢您的解决方案。
    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2017-03-06
    • 2020-03-02
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多