Edited at

CMSampleBufferをCGImageやUIImageに変換

More than 3 years have passed since last update.

AVCaptureSession等でカメラ画像をキャプチャリングした場合には、CMSampleBufferの形式で画像が得られる。

これをビットマップ処理する場合などに、ビットマップデータまたはCGImage等でアクセスしたい場合に有効。


CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, 0);
void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef cgImage = CGBitmapContextCreateImage(newContext);
UIImage *uiImage = [UIImage imageWithCGImage:cgImage scale:1.0f orientation:UIImageOrientationRight];
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);
CGImageRelease(cgImage);