我正在使用CIImage,虽然我知道它不是线性图像,但它确实包含了一些数据。
我的问题是CIImage的范围属性是否返回像素或点数?根据{{3}},它说的很少,它的工作空间坐标。这是否意味着无法从CIImage获取像素/点,我必须转换为UIImage以使用.size属性来获取点数?
我有一个具有一定大小的UIImage,当我使用UIImage创建一个CIImage时,范围以点的形式显示。但是如果我通过缩放它的CIFilter运行CIImage,我有时会得到以像素值返回的范围。
答案 0 :(得分:5)
我会尽我所能回答。
如果您的来源为UIImage
,则其size
将与范围相同。但请注意,这不是UIImageView(大小以点为单位)。我们只是谈论来源图片。
通过CIFilter运行某些东西意味着你在操纵东西。如果你所做的只是操纵颜色,它的大小/范围不应该改变(与创建你自己的CIColorKernel
相同 - 它逐个像素地工作)。
但是,根据CIFilter,您可能正在改变大小/范围。某些过滤器会创建蒙版或平铺。这些实际上可能具有无限的范围!其他(模糊是一个很好的例子)样本周围的像素,所以他们的范围实际上增加,因为他们采样"像素"超出源图像的大小。 (自定义这些是CIWarpKernel
。)
是的,相当多。把它带到底线:
点是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之外,它还有一个比例尺;与屏幕分辨率一起,它为我们提供了从点到像素的转换。