首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在图像上运行CIFilter会在上面和下面创建一个不想要的偏移量。

在图像上运行CIFilter会在上面和下面创建一个不想要的偏移量。
EN

Stack Overflow用户
提问于 2018-04-10 16:29:37
回答 1查看 829关注 0票数 2

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

在本例中,我只需使用一个UIImage,应用CIPixellate,固定方向,然后在全屏UIImageView中显示该图像,其中背景颜色为红色,以演示该问题(将背景颜色设置为默认颜色‘清除’会产生白色偏移。下面是UIImageView的设置。

通过调试,我知道这个问题发生在应用CIFilter的某个地方,并且它与UIImageView无关,如果我只是在没有过滤器的情况下传递图像,那么这个问题就不会发生。

作为参考,下面是我用来对图像进行像素化的代码:

代码语言:javascript
复制
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
    }
}

这里发生了什么事?有办法阻止这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 20:02:46

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

叫这个方法..。通过从原始图像的边缘重复像素颜色来创建无限范围的图像。

代码语言:javascript
复制
...
let ciImage = CIImage(cgImage: self.cgImage!).clampedToExtent()

也见我在这里的回答:https://stackoverflow.com/a/49309714/2331445

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49758676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档