我正在使用一个CIImage,虽然我知道它不是一个线性图像,但它确实保存了一些数据。
我的问题是 CIImage 的范围属性是否返回像素或点?根据文档,它说得很少,它是工作空间坐标。这是否意味着无法从 CIImage 获取像素/点,我必须转换为 UIImage 才能使用 .size 属性来获取点?
我有一个特定大小的 UIImage,当我使用 UIImage 创建 CIImage 时,范围以磅为单位显示。但是,如果我通过缩放它的 CIFilter 运行 CIImage,我有时会得到以像素值返回的范围。
我会尽我所能回答。
如果您的源是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 之前,我对图像执行此操作。
我建议你把它们想象成点。没有比例,也没有屏幕(CIImage不是绘制的东西),所以没有像素。
由CGImage支持的UIImage是绘图的基础,除了CGImage之外,它还有一个比例;连同屏幕分辨率,这为我们提供了从点到像素的转换。