CGBitmapContextCreateImage错误

7

我在控制台中看到以下错误信息:

: CGBitmapContextCreate: 数据字节/行无效:每个整数位元组件至少应为1920,3个组件,kCGImageAlphaPremultipliedFirst。 : CGBitmapContextCreateImage: 无效的上下文0x0。

我使用以下代码:

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer 
{
    // Get a CMSampleBuffer's Core Video image buffer for the media data
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    // Lock the base address of the pixel buffer
    CVPixelBufferLockBaseAddress(imageBuffer, 0); 

    // Get the number of bytes per row for the pixel buffer
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 

    // Get the number of bytes per row for the pixel buffer
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    // Get the pixel buffer width and height
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    // Create a device-dependent RGB color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    // Create a bitmap graphics context with the sample buffer data
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, 
                                                 bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    // Create a Quartz image from the pixel data in the bitmap graphics context
    CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
    // Unlock the pixel buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    // Free up the context and color space
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace);

    // Create an image object from the Quartz image
    UIImage *image = [UIImage imageWithCGImage:quartzImage];

    // Release the Quartz image
    CGImageRelease(quartzImage);

    return (image);
}

如果你在 NSLog 中输出 bytesPerRowwidthheight,将得到什么结果? - Wildaker
不要在imageView中显示图像。 - Nims
如果在 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 之前添加 NSLog(@"%zi, %zi, %zi",width,height,bytesPerRow);,控制台会输出什么? - Wildaker
它会给出这3个值 --480、--360、--724。 - Nims
1
那么sampleBuffer肯定有问题。一个有效的BGRA CMSampleBufferRef每行字节数至少是所表示图像宽度的四倍。你的问题几乎肯定不在这段代码上(反正这只是从苹果复制粘贴过来的),而是在调用它的代码上,看起来是这样的。 - Wildaker
显示剩余3条评论
2个回答

18

这是解决我的问题的方法:

就像“Wildaker”所建议的那样,很可能是“调用代码”的问题。

在苹果示例中,设置了输出格式。也许您为简化而跳过了此部分?!

output.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (id)kCVPixelBufferPixelFormatTypeKey];


这正是我没有做的^^感谢你的教训! - Nicolas Manzini
1
对于Swift 3:output.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable : kCVPixelFormatType_32BGRA] - Massimo

0

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);应该改为:uint8_t *baseAddress = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);


你可以使用代码块更好地展示你的代码,并且可以添加更多的描述。 :-) - jparthj
谢谢您的建议,我会注意这些。 - easonwzs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接