首页 文章

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

提问于
浏览
1

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

我的问题是CIImage的extent属性是否返回像素或点?根据documentation,它说的很少,它's working space coordinates. Does this mean there'无法从CIImage获取像素/点,我必须转换为UIImage以使用.size属性来获取点数?

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

2 回答

  • 3

    我会尽我所能回答 .

    如果您的源是 UIImage ,则其 size 将与范围相同 . 但是,请问,这不仅仅是 source 图像 .

    通过CIFilter运行某些东西意味着你正在操纵事物 . 如果你所做的只是操纵颜色,它的大小/范围不应该改变(与创建你自己的_595727相同 - 它按像素逐个工作) .

    但是,根据CIFilter,您可能正在改变大小/范围 . 某些过滤器会创建蒙版或平铺 . 这些实际上可能具有无限的程度!其他(模糊是一个很好的例子)样本周围的像素,所以它们的范围实际上增加,因为他们采样"pixels"超出源图像的大小 . (自定义这些是 CIWarpKernel . )

    是的,相当多 . 把这带到底线:

    • 过滤器在做什么?是否需要简单地检查一个像素的RGB并做一些事情?然后UIImage大小应该是输出CIImage范围 .

    • 滤镜是否会产生一些取决于像素周围像素的东西?然后输出CIImage范围略大 . 多少可能取决于过滤器 .

    • 有些过滤器可以产生与输入无关的内容 . 其中大多数可能没有真正的范围,因为它们可以是无限的 .

    分数是UIKit和CoreGraphics一直使用的 . 像素?在某些时候,CoreImage会这样做,但它是低级别的(除非你想编写自己的内核),你不应该在乎 . 范围通常 - 但请记住以上 - 等同于UIImage大小 .

    EDIT

    许多图像(特别是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之前对图像执行此操作 .

  • 2

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

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

相关问题