CIImage范围是像素还是点?

kin*_*cac 4 core-image ios ciimage swift

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

我的问题是CIImage的scope属性是否返回像素或点?根据说明很少的文档,它是工作空间坐标。这是否意味着无法从CIImage获取像素/点,而我必须转换为UIImage才能使用.size属性来获取点?

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

dfd*_*dfd 5

我会尽力而为。

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

通过CIFilter运行某事物意味着您正在操纵事物。如果您要做的只是操作color,则其大小/范围不应更改(与创建自己的颜色相同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!
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

image = image.resizeToBoundingSquare(640)
Run Code Online (Sandbox Code Playgroud)

在此示例中,图像尺寸3200x2000将减小为640x400。否则图像尺寸或320x200将被放大到640x400。我在渲染图像之前以及创建要在CIFilter中使用的CIImage之前对图像执行此操作。