我会尽力给出最好的答案。
如果您的源是UIImage,则其大小将与范围相同。但请注意,这不是UIImageView(其中大小以点为单位)。我们只谈论源图像。
通过CIFilter运行一些东西意味着您正在操作它们。如果你所做的只是操作颜色,则其大小/范围不应改变(与创建自己的CIColorKernel
相同 - 它逐像素工作)。
但是,根据CIFilter,您可能会更改大小/范围。某些滤镜创建掩码或平铺。这些实际上可能具有无限的范围!其他过滤器(模糊是一个很好的例子)对周围的像素进行采样,因此它们的范围实际上会增加,因为它们采样超出源图像大小的“像素”。 (自定义方式这些是CIWarpKernel
。)
是的,相当多。归纳如下:
- 滤镜在做什么?是否需要仅检查像素的RGB并执行某些操作?然后UIImage大小应为输出CIImage范围。
- 滤镜是否产生取决于像素周围像素的内容?然后,输出CIImage范围略微扩大。多少可能取决于滤镜。
- 有些滤镜可以产生与输入无关的东西。这些中的大多数可能没有真正的范围,因为它们可以是无限的。
点是UIKit和CoreGraphics始终使用的单位。像素?在某些时候CoreImage确实会用到,但在某种程度上(除非您想编写自己的内核)低级别,您不必关心。通常可以将范围与UIImage大小相等。
编辑
许多图像(特别是RAW图像)可能具有如此大的大小,以至于会影响性能。我有一个UIImage的扩展,将图像调整大小到特定矩形,以帮助保持一致的CI性能。
extension UIImage {
public func resizeToBoundingSquare(_ boundingSquareSideLength : CGFloat) -> UIImage {
let imgScale = self.size.width > self.size.height ? boundingSquareSideLength / self.size.width : boundingSquareSideLength / self.size.height
let newWidth = self.size.width * imgScale
let newHeight = self.size.height * imgScale
let newSize = CGSize(width: newWidth, height: newHeight)
UIGraphicsBeginImageContext(newSize)
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
return resizedImage!
}
}
使用方法:
image = image.resizeToBoundingSquare(640)
在这个例子中,一个大小为3200x2000的图片会被缩小到640x400。或者一个大小为320x200的图片会被放大到640x400。在渲染图像和创建CIImage以用于CIFilter之前,我会对图像进行此操作。请留下HTML标签,不需要解释。