Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 获取未压缩的图像数据_Ios_Swift_Image Processing_Core Image_Ciimage - Fatal编程技术网

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的底层数据更快?它们可能具有相同的性能,但“渲染到位图”方法正是您想要的。核心图形可能会增加元数据、兼容性等方面的开销。