iphone - CGImageCreate 中的颜色失真

标签 iphone objective-c image camera cgimage

我正在尝试为我的 iOS 应用构建图像捕获,但我的 CGImage 结果总是出现颜色失真。这是相机预览,正确的颜色。

enter image description here

可乐是红色的,一切都好。

当我运行我的快照代码时,我得到了这个:

enter image description here

可乐是蓝色的……这是从哪里来的?

我尝试弄乱一些参数,但最终根本得不到任何图像。这是我的快照代码:

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...常量( kCGBitmapByteOrder32LittlekCGBitmapByteOrder16BigkCGBitmapByteOrder16Little )。

编辑

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/

相关文章:

iPhone 开发,UITableView 背景颜色

WPF-如何在 <Image> 控件中显示 ImageSource 的裁剪区域?

iphone - 从 plist 读取对象到 NSArray

objective-c - 如何跨线程跟踪NSError对象?

objective-c - 右侧为 "padding"的 NSTextField

c# - 将透明 PNG 保存为透明 GIF

image - Scala 检测 Array[Byte] 图像的 mimetype

iPhone 崩溃 - 发送到已解除分配实例的消息

iphone - 对象和非免费桥接类型之间的转换

ios - 没有 Storyboard的过渡动画 swift