我使用CGImageCreate和CGColorSpaceCreateDeviceGray将缓冲区(CVPixelBufferRef)转换为灰度图像。它的速度非常快,直到iOS 12.现在返回的图像为空。
代码如下所示:
bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
CGDataProviderRef provider = CGDataProviderCreateWithData((void *)i_PixelBuffer,
sourceBaseAddr,
sourceRowBytes * height,
ReleaseCVPixelBuffer);
retImage = CGImageCreate(width,
height,
8,
32,
sourceRowBytes,
CGColorSpaceCreateDeviceGray(),
bitmapInfo,
provider,
NULL,
true,
kCGRenderingIntentDefault);
CGDataProviderRelease(provider);这是iOS 12中已知的一个bug吗?如果这个函数不再支持设备灰色,那么您能建议我另一种方法吗?
注意,4K图像的转换时间应该小于0.1秒。
提前感谢!
发布于 2018-10-23 03:27:52
根据石英2D编程指南中支持的像素格式的列表,iOS不支持每像素32位的灰度空间。甚至在macOS上,32 bpp灰色也需要使用kCGBitmapFloatComponents (和浮点数据)。
你的数据真的是32 bpp吗?如果是的话,它是浮动的吗?你用于bitmapInfo的是什么?
我不希望CGImageCreate()“转换”一个缓冲区,包括灰度。您提供的参数正在告诉它如何解释数据。如果你不使用浮点成分,我怀疑它只是取其中一个颜色通道,并将其解释为灰度,而忽略了其他成分。所以,这不是一个适当的灰度转换。
Apple的建议是创建一个正确表示图像的图像;创建一个具有您希望的颜色空间、像素布局和位图信息的位图上下文;将前者绘制到后者;并从上下文中创建最终图像。
发布于 2019-01-07 01:39:43
我终于找到了一个适合我的解决办法。请注意,CVPixelBuffer是从摄像机来的。
代码:
// some code
colorSpace = CGColorSpaceCreateDeviceGray();
sourceRowBytes = CVPixelBufferGetBytesPerRowOfPlane(i_PixelBuffer, 0);
sourceBaseAddr = (unsigned char*)CVPixelBufferGetBaseAddressOfPlane(i_PixelBuffer,0);
bitmapInfo = kCGImageByteOrderDefault;
// some code
CGContextRef context = CGBitmapContextCreate(sourceBaseAddr,
width,
height,
8,
sourceRowBytes,
colorSpace,
bitmapInfo);
retImage = CGBitmapContextCreateImage(context);
// some code您还可以查看以下相关文章:420 YpCbCr8双平面视频到YUV420 ?/如何将Y和Cbcr平面复制到单个平面?
https://stackoverflow.com/questions/52939593
复制相似问题