像素或点的CIImage范围?

时间:2017-03-28 23:52:25

标签: ios swift core-image ciimage

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

我的问题是CIImage的范围属性是否返回像素或点数?根据{{​​3}},它说的很少,它的工作空间坐标。这是否意味着无法从CIImage获取像素/点,我必须转换为UIImage以使用.size属性来获取点数?

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

2 个答案:

答案 0 :(得分:5)

我会尽我所能回答。

如果您的来源为UIImage,则其size将与范围相同。但请注意,这不是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。我在渲染之前和创建在CIFilter中使用的CIImage之前对图像执行此操作。

答案 1 :(得分:4)

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

由CGImage支持的UIImage是绘图的基础,除了CGImage之外,它还有一个比例尺;与屏幕分辨率一起,它为我们提供了从点到像素的转换。