Ios 获取未压缩的图像数据
我正在尝试获取Ios 获取未压缩的图像数据,ios,swift,image-processing,core-image,ciimage,Ios,Swift,Image Processing,Core Image,Ciimage,我正在尝试获取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, colorS
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
数据?如您所见,ciContext.JPEG表示法将图像数据压缩为JPEG,并为您提供一个数据
对象,该对象可以作为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(\uimage:CIImage,to buffer:CVPixelBuffer)
进行渲染。我认为Core ML直接支持CVPixelBuffer
输入,因此这可能是更好的选择。如您所见,ciContext.JPEG表示法将图像数据压缩为JPEG,并为您提供一个数据
对象,该对象可以原样作为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(\uimage:CIImage,to buffer:CVPixelBuffer)
进行渲染。我认为Core ML直接支持CVPixelBuffer
输入,因此这可能是更好的选择。您知道JPEG是压缩图像数据的格式吗?嘿@MartinR,谢谢您的回复!是的,但是当拍摄一张普通的.jpg图像时,我可以计算原始数据(宽度xheightxchannelsx4)。但是当创建CIIMage时,我没有得到相同的值,或者至少计算出442368“WidthxHeightxChannelsx4”不是原始数据。这就是如果要以另一种不进行压缩(而不是jpeg)的格式存储图像所需的字节数。原始jpeg数据为1331字节。ciImageData.count
是jpeg压缩图像的大小。图像压缩的目的是使用比原始图像大小更少的字节。@Sweeper感谢您的澄清。有道理。是否可以获取CIImage的原始数据(未压缩)?我正在尝试向一个需要192x192(RGB)的ML模型提供数据,当尝试向其提供此CIImage时,它说提供的数据计数1379必须与所需计数442368匹配。
您知道JPEG是压缩图像数据的格式吗?嘿@MartinR,感谢您的响应!是的,但是当拍摄一张普通的.jpg图像时,我可以计算原始数据(宽度xheightxchannelsx4)。但是当创建CIIMage时,我没有得到相同的值,或者至少计算出442368“WidthxHeightxChannelsx4”不是原始数据。这就是如果要以另一种不进行压缩(而不是jpeg)的格式存储图像所需的字节数。原始jpeg数据为1331字节。ciImageData.count
是jpeg压缩图像的大小。图像压缩的目的是使用比原始图像大小更少的字节。@Sweeper感谢您的澄清。有道理。是否可以获取CIImage的原始数据(未压缩)?我正在尝试输入一个预期为192x192(RGB)的ML模型,当尝试使用此CIImage输入时,它表示提供的数据计数1379必须与所需计数442368匹配。
嘿,弗兰克!世界上最好的感觉从你那里得到答案哈哈:)运行你的代码会导致崩溃:线程28:EXC_BAD_ACCESS(code=1,address=0x700086C5597)
另外,我切换了Skype地址,我想在我们公司之间再次合作:)再次添加我:admin@socialkit.comRoi,我忘记了使用unsafemtablebytes的调用。我更新了我的答案。现在在操场上对我很管用。太棒了!Works:)问题:使用此方法或使用CIContext创建CGImage,哪个比访问CGImage的底层数据更快?它们可能具有相同的性能,但“渲染到位图”方法正是您想要的。核心图形可能会增加元数据、兼容性等方面的开销。嘿,弗兰克!世界上最好的感觉从你那里得到答案哈哈:)运行你的代码会导致崩溃:线程28:EXC_BAD_ACCESS(code=1,address=0x700086C5597)
另外,我切换了Skype地址,我想在我们公司之间再次合作:)再次添加我:admin@socialkit.comRoi,我忘记了使用unsafemtablebytes的调用。我更新了我的答案。现在在操场上对我很管用。太棒了!Works:)问题:使用此方法或使用CIContext创建CGImage,哪个比访问CGImage的底层数据更快?它们可能具有相同的性能,但“渲染到位图”方法正是您想要的。核心图形可能会增加元数据、兼容性等方面的开销。