【问题标题】:getting uncompressed CIImage data获取未压缩的 CIImage 数据
【发布时间】:2020-12-11 15:15:42
【问题描述】:

我正在尝试获取CIImage 解压缩数据。 目前我发现获取压缩数据的唯一方法是使用CIContext,如下所示:

let ciContext = CIContext()

let ciImage = CIImage(color: .red).cropped(to: .init(x: 0, y: 0, width: 192, height: 192))

guard let ciImageData = ciContext.jpegRepresentation(of: ciImage, colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!, options: [:]) else {
    fatalError()
}

print(ciImageData.count) // Prints 1331

是否有可能(尽可能高效地)获得未压缩的CIImage 数据?

【问题讨论】:

  • 你知道JPEG是一种压缩图像数据的格式吗?
  • 嘿@MartinR,感谢您的回复!是的,但是在拍摄常规 .jpg 图像时,我可以计算原始数据 (WidthxHeightxChannelsx4)。但是在创建 CIIMage 时,我没有得到相同的值,或者至少计算到 442368
  • "WidthxHeightxChannelsx4" 不是原始数据。如果您要以另一种不进行压缩的格式而不是 jpeg 存储图像,这就是需要多少字节。原始 jpeg 数据 1331 字节。
  • ciImageData.count 是 JPEG 压缩图像的大小。图像压缩的真正目的是使用比原始图像大小更少的字节。
  • @Sweeper 谢谢你的澄清。说得通。是否可以获得 CIImage 的原始数据(未压缩)?我正在尝试提供一个预期为 192x192 (RGB) 的 ML 模型,并且在尝试使用 CIImage it says Provided data count 1379 must match the required count 442368. 提供它时

标签: ios swift image-processing core-image ciimage


【解决方案1】:

如您所见,ciContext.jpegRepresentation 将图像数据压缩为 JPEG,并为您提供了一个 Data 对象,该对象可以作为 JPEG 文件原样写入磁盘(包括图像元数据)。

您需要使用不同的CIContext API 直接渲染到(未压缩的)位图数据:

let rowBytes = 4 * Int(ciImage.extent.width) // 4 channels (RGBA) of 8-bit data
let dataSize = rowBytes * Int(ciImage.extent.height)
var data = Data(count: dataSize)
data.withUnsafeMutableBytes { data in
    ciContext.render(ciImage, toBitmap: data, rowBytes: rowBytes, bounds: ciImage.extent, format: .RGBA8, colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!)
}

或者,您可以创建一个具有正确大小和格式的CVPixelBuffer,并使用CIContext.render(_ image: CIImage, to buffer: CVPixelBuffer) 渲染到该文件中。我认为 Core ML 直接支持 CVPixelBuffer 输入,所以这可能是更好的选择。

【讨论】:

  • 嘿弗兰克!从你那里得到答案是世界上最好的感觉,哈哈 :) 运行你的代码会导致崩溃:Thread 28: EXC_BAD_ACCESS (code=1, address=0x7000086c5597)
  • 另外,我切换了 Skype 地址,我想再次在我们公司之间进行合作 :) 再次添加我:admin@socialkit.com
  • Roi,我忘记了withUnsafeMutableBytes 电话。我更新了我的答案。它现在在操场上对我有用。
  • 太棒了!有效 :) 问题:使用这种方法,或者使用 CIContext 创建 CGImage,比访问 CGImage 的底层数据更快?
  • 它们可能具有相同的性能,但“渲染到位图”方法正是您想要的。 Core Graphics 可能会为元数据、兼容性等增加一些开销。
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多