7

I am getting error like this In my console:

: CGBitmapContextCreate: invalid data bytes/row: should be at least 1920 for 8 integer bits/component, 3 components, kCGImageAlphaPremultipliedFirst. : CGBitmapContextCreateImage: invalid context 0x0

I use below code:

- (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);
}
Nims
  • 431
  • 6
  • 15
  • If you NSLog `bytesPerRow`, `width` and `height`, what are the results? – Wildaker Sep 03 '12 at 07:33
  • no image display in imageView – Nims Sep 03 '12 at 07:38
  • I mean, if you add `NSLog(@"%zi, %zi, %zi",width,height,bytesPerRow);` before `CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();`, what is output on the console? – Wildaker Sep 03 '12 at 07:52
  • it give this 3 value --480, --360, --724 – Nims Sep 03 '12 at 08:42
  • 1
    Then there's something very wrong with `sampleBuffer`. A valid BGRA `CMSampleBufferRef` will have a number of bytes per row that is at *least* four times the width of the image represented. Your problem is almost certainly not with this code (which is just copy-pasted from Apple anyway), but with the code that is calling it, by the look of things. – Wildaker Sep 03 '12 at 08:48
  • I pass sampleBuffer same as this link http://developer.apple.com/library/ios/#qa/qa1702/_index.html – Nims Sep 03 '12 at 09:06
  • also when i print the image NSLog(@"photo :%@",image); it give photo : – Nims Sep 03 '12 at 09:07
  • Logging the UIImage isn't relevant. The problem is clearly that you are not passing a valid `CMSampleBufferRef`, so you need to debug the code that is responsible for creating it, not the code that appears to be behaving correctly considering it is being fed garbage data. Technical Q&A QA1702 is not a complete application, so you *must* have changed and added thinks to make it run. Something further back in the code must be wrong... – Wildaker Sep 03 '12 at 09:22

2 Answers2

18

this is what fixed my problem: as "Wildaker" suggested, it is "the code that's calling it", more or less.

in the Apple Example the output format is set. perhaps you skipped this part to simplify ?!

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

user1853312
  • 206
  • 3
  • 4
0

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);should be changed to : uint8_t *baseAddress = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);

easonwzs
  • 3
  • 4