CGImageCreate中的颜色失真

Nil*_*nch 7 iphone camera image objective-c cgimage

我正在尝试为我的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);
Run Code Online (Sandbox Code Playgroud)

我在我的智慧结束,所以如果有人能看到我做错了什么,请告诉我.

固定

这是最终的代码:

if (cameraVideo.ARPixelFormat == kCVPixelFormatType_32ARGB) {
    bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
} else {
    bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
}
Run Code Online (Sandbox Code Playgroud)

rob*_*off 12

看起来你的R(红色)和B(蓝色)通道是交换的.相机以BGR顺序填充缓冲区,但您告诉CGImage数据是RGB有序的.我相信你可以使用你的kCGBitmapByteOrder...常量中的一个来控制它CGBitmapInfo.尝试这样设置bitmapInfo:

CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big;
Run Code Online (Sandbox Code Playgroud)

如果还是不行,请尝试其他的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
Run Code Online (Sandbox Code Playgroud)

你可能想做同样的事情.