我想使用QTKit.framework将所有帧写入磁盘以进行相机输入.但我得到的所有图像都是半透明的,没有一些颜色,可能是颜色空间问题? (
它们在预览视图中似乎很好但是当我写它们时“发生了什么”.
我不知道那是什么.
它们在预览视图中似乎很好但是当我写它们时“发生了什么”.
我不知道那是什么.
-(void)savePNGImage:(CGImageRef)imageRef path:(NSString *)path { NSURL *outURL = [[NSURL alloc] initFileURLWithPath:path]; CGImageDestinationRef dr = CGImageDestinationCreateWithURL ((CFURLRef)outURL,(CFStringRef)@"public.png",1,NULL); CGImageDestinationAddImage(dr,imageRef,NULL); CGImageDestinationFinalize(dr); [outURL release]; } -(void)saveJPEGImage:(CGImageRef)imageRef path:(NSString *)path { CFMutableDictionaryRef mSaveMetaAndOpts = CFDictionaryCreateMutable(nil,&kcfTypeDictionaryKeyCallBacks,&kcfTypeDictionaryValueCallBacks); CFDictionarySetValue(mSaveMetaAndOpts,kCGImageDestinationLossyCompressionQuality,[NSNumber numberWithFloat:1.0]); // set the compression quality here NSURL *outURL = [[NSURL alloc] initFileURLWithPath:path]; CGImageDestinationRef dr = CGImageDestinationCreateWithURL ((CFURLRef)outURL,(CFStringRef)@"public.jpeg",mSaveMetaAndOpts); CGImageDestinationFinalize(dr); [outURL release]; } - (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection{ CVPixelBufferLockBaseAddress(videoFrame,0); uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(videoFrame); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(videoFrame); size_t width = CVPixelBufferGetWidth(videoFrame); size_t height = CVPixelBufferGetHeight(videoFrame); CVPixelBufferUnlockBaseAddress(videoFrame,0); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef newContext = CGBitmapContextCreate(baseAddress,width,height,8,bytesPerRow,colorSpace,kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); CGImageRef frame = CGBitmapContextCreateImage(newContext); CGContextRelease(newContext); CGColorSpaceRelease(colorSpace); [self savePNGImage:frame path:[NSString stringWithFormat:@"/Users/nacho4d/Desktop/framesCam/frame%003d.png",frameNum++]]; [self saveJPEGImage:frame path:[NSString stringWithFormat:@"/Users/nacho4d/Desktop/framesCam/frame%003d.jpeg",frameNum++]]; CGImageRelease(frame); }
Capturer属性只是帧大小和像素格式,如下所示:
[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB],(id)kCVPixelBufferPixelFormatTypeKey
更新:
我也试过JPEG,我也得到了同样的图像,就像图像中缺少一些通道一样,所有写入的帧都有白色背景. (因为JPEG不允许透明?)
原始和书面(JPEG)一:
(我不显示PNG,因为它是透明的,很难在浏览器中看到)
提前致谢.
解决方法
我不确定你的问题是什么,但这是我如何将图像保存到磁盘.只需传入您从委托方法获得的CVImageBufferRef,当然还有自己的URL,它应该可以正常工作.至少它对我有用.祝好运!
-(void)saveImage:(CVImageBufferRef)image toURL:(NSURL*)url{ NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:image]]; NSImage *_image = [[NSImage alloc] initWithSize:[imageRep size]]; [_image addRepresentation:imageRep]; NSData *bitmapData = [_image TIFFRep resentation]; NSBitmapImageRep *bitmapRep = [NSBitmapImageRep imageRepWithData:bitmapData]; NSData *imageData = [bitmapRep representationUsingType:NSJPEGFileType properties:nil]; [_image release]; _image = [[NSImage alloc] initWithData:imageData]; NSBitmapImageRep *imgRep = [[_image representations] objectAtIndex: 0]; NSData *data = [imgRep representationUsingType: NSPNGFileType properties: nil]; [data writeToFile: [self getSaveString] atomically: NO]; [_image release]; }