运行 图像上的 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()
另请参阅我的回答:
我在使用 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()
另请参阅我的回答: