我会尽力回答。
如果您的来源是UIImage
, its size
将与程度相同。但是请注意,这不是 UIImageView(其大小以磅为单位)。我们只是在谈论source image.
通过 CIFilter 运行某些内容意味着您正在操纵某些内容。如果你所做的只是操纵color,其大小/范围不应更改(与创建自己的CIColorKernel
- 它是逐像素工作的)。
但是,根据 CIFilter,您may well改变大小/范围。某些过滤器会创建蒙版或图块。这些实际上可能有一个extent那是无限的!其他(模糊是一个很好的例子)对周围的像素进行采样,因此它们的范围实际上会增加,因为它们对超出源图像大小的“像素”进行采样。 (根据定制,这些是CIWarpKernel
.)
是的,相当多。归根结底:
- 过滤器在做什么?它是否需要简单地检查像素的 RGB 并执行某些操作?那么 UIImage 大小应该是输出 CIImage 范围。
- 滤镜是否会产生依赖于像素周围像素的东西?那么输出的CIImage范围稍微大一些。多少可能取决于过滤器。
- 有些过滤器会产生一些与输入无关的东西。其中大多数可能没有真正的范围,因为它们可能是无限的。
UIKit 和 CoreGraphics 始终使用点。像素?在某些时候 CoreImage 会这样做,但它在某种程度上是低级的(除非您想编写自己的内核),您不应该关心。范围通常可以(但请记住上述内容)等同于 UIImage 大小。
EDIT
许多图像(尤其是 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!
}
}
Usage:
image = image.resizeToBoundingSquare(640)
在此示例中,3200x2000 的图像尺寸将缩小为 640x400。或者图像尺寸 320x200 会放大到 640x400。我在渲染图像之前和创建要在 CIFilter 中使用的 CIImage 之前对图像执行此操作。