首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGImageCreate与CGColorSpaceCreateDeviceGray在iOS12上

CGImageCreate与CGColorSpaceCreateDeviceGray在iOS12上
EN

Stack Overflow用户
提问于 2018-10-23 00:49:24
回答 2查看 871关注 0票数 1

我使用CGImageCreate和CGColorSpaceCreateDeviceGray将缓冲区(CVPixelBufferRef)转换为灰度图像。它的速度非常快,直到iOS 12.现在返回的图像为空。

代码如下所示:

代码语言:javascript
复制
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秒。

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-10-23 03:27:52

根据石英2D编程指南中支持的像素格式的列表,iOS不支持每像素32位的灰度空间。甚至在macOS上,32 bpp灰色也需要使用kCGBitmapFloatComponents (和浮点数据)。

你的数据真的是32 bpp吗?如果是的话,它是浮动的吗?你用于bitmapInfo的是什么?

我不希望CGImageCreate()“转换”一个缓冲区,包括灰度。您提供的参数正在告诉它如何解释数据。如果你不使用浮点成分,我怀疑它只是取其中一个颜色通道,并将其解释为灰度,而忽略了其他成分。所以,这不是一个适当的灰度转换。

Apple的建议是创建一个正确表示图像的图像;创建一个具有您希望的颜色空间、像素布局和位图信息的位图上下文;将前者绘制到后者;并从上下文中创建最终图像。

票数 0
EN

Stack Overflow用户

发布于 2019-01-07 01:39:43

我终于找到了一个适合我的解决办法。请注意,CVPixelBuffer是从摄像机来的。

  • 将摄像机输出像素格式更改为 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange (AVCaptureVideoDataOutput)
  • 从YpCbCr中提取Y平面
  • 用Y平面构建一个CGImage

代码:

代码语言:javascript
复制
// 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平面复制到单个平面?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52939593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档