CIImage 以像素或点为单位的范围?

CIImage extent in pixels or points?

我正在使用 CIImage,虽然我知道它不是线性图像,但它确实保存了一些数据。

我的问题是 CIImage 的范围是 属性 returns 像素还是点?根据documentation,它说得很少,它正在工作space 坐标。这是否意味着无法从 CIImage 获取像素/点,我必须转换为 UIImage 才能使用 .size 属性 获取点?

我有一个特定大小的 UIImage,当我使用 UIImage 创建 CIImage 时,范围以磅为单位显示。但是如果我 运行 通过 CIFilter 缩放它的 CIImage,我有时会得到以像素值返回的范围。

我建议你把它们看作是点。没有比例尺也没有屏幕(CIImage 不是绘制的东西),所以没有像素。

由 CGImage 支持的 UIImage 是绘图的基础,除了 CGImage 它还有一个比例尺;连同屏幕分辨率,这使我们能够从点转换为像素。

我会尽量回答。

如果您的来源是 UIImage,其 size 将与范围相同。但是请注意,这不是 UIImageView(大小以磅为单位)。我们只是在谈论 source 图片。

运行 通过 CIFilter 的东西意味着你在操纵东西。如果你所做的只是操纵 color,它的 size/extent 不应该改变(与创建你自己的 CIColorKernel 相同 - 它是逐像素工作的) .

但是,根据 CI 过滤器,您 可能 正在更改 size/extent。某些过滤器会创建一个蒙版或图块。这些实际上可能有一个 extent 是无限的!其他人(模糊是一个很好的例子)对周围的像素进行采样,因此它们的范围实际上增加了,因为它们对超出源图像大小的 "pixels" 进行了采样。 (自定义方面,这些是 CIWarpKernel。)

是的,相当多。以此为底线:

  • 过滤器在做什么?是否需要简单地检查像素的 RGB 并执行某些操作?然后 UIImage 大小应该是输出 CIImage extent.
  • 滤镜是否会产生依赖于像素周围像素的东西?那么输出的CIImage extent稍微大一点。多少可能取决于过滤器。
  • 有一些过滤器可以在不考虑输入的情况下产生一些东西。其中大部分可能没有真正的范围,因为它们可以是无限的。

点是 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。我在渲染图像之前和创建要在 CIFilter 中使用的 CIImage 之前对图像执行此操作。