我正在尝试为我的 iOS 应用构建图像捕获,但我的 CGImage 结果总是出现颜色失真。这是相机预览,正确的颜色。
可乐是红色的,一切都好。
当我运行我的快照代码时,我得到了这个:
可乐是蓝色的……这是从哪里来的?
我尝试弄乱一些参数,但最终根本得不到任何图像。这是我的快照代码:
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = [cameraVideo bufRowBytes];
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, [cameraVideo bufDataPtr], [cameraVideo bufWidth]*[cameraVideo bufHeight]*4, NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentPerceptual;
CGImageRef imageRef = CGImageCreate( [cameraVideo bufWidth], [cameraVideo bufHeight], bitsPerComponent, bitsPerPixel,
bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
我无能为力,所以如果有人看到我做错了什么,请告诉我。
已修复
这是最终代码:
if (cameraVideo.ARPixelFormat == kCVPixelFormatType_32ARGB) {
bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
} else {
bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
}
最佳答案
看起来您的 R(红色)和 B(蓝色) channel 已互换。相机正在按 BGR 顺序填充缓冲区,但你告诉 CGImage
数据在 RGB
中命令。我相信您可以使用 kCGBitmapByteOrder...
之一来控制它CGBitmapInfo
中的常量.尝试设置 bitmapInfo
像这样:
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big;
如果这不起作用,请尝试另一个 kCGBitmapByteOrder...
常量( kCGBitmapByteOrder32Little
、 kCGBitmapByteOrder16Big
、 kCGBitmapByteOrder16Little
)。
编辑
Apple 的 SquareCam 示例项目有一个名为 SquareCam/SqareCamViewController.m
的文件(是的,文件名中的“Square”拼写错误)。它包含以下代码:
sourcePixelFormat = CVPixelBufferGetPixelFormatType( pixelBuffer );
if ( kCVPixelFormatType_32ARGB == sourcePixelFormat )
bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
else if ( kCVPixelFormatType_32BGRA == sourcePixelFormat )
bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
else
return -95014; // only uncompressed pixel formats
您可能想做同样的事情。
关于iphone - CGImageCreate 中的颜色失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920836/