从CVPixelBuffer获取UIIMage时遇到一些问题.这是我正在尝试的:
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer); CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kcfAllocatorDefault,imageDataSampleBuffer,kCMAttachmentMode_ShouldPropagate); CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments]; if (attachments) CFRelease(attachments); size_t width = CVPixelBufferGetWidth(pixelBuffer); size_t height = CVPixelBufferGetHeight(pixelBuffer); if (width && height) { // test to make sure we have valid dimensions UIImage *image = [[UIImage alloc] initWithCIImage:ciImage]; UIImageView *lv = [[UIImageView alloc] initWithFrame:self.view.frame]; lv.contentMode = UIViewContentModeScaleAspectFill; self.lockedView = lv; [lv release]; self.lockedView.image = image; [image release]; } [ciImage release];
高度和宽度均正确设置为相机的分辨率.图像被创建,但我似乎是黑色的(或者可能是透明的).我不太明白问题所在.任何想法将不胜感激.
解决方法
首先显而易见的东西与您的问题不直接相关:AVCaptureVideoPreviewLayer是将视频从任一摄像机管理到独立视图的最便宜的方式,如果数据来自哪里,并且您没有立即计划修改它.您不必做任何推动自己,预览图层直接连接到AVCaptureSession并进行更新.
我不得不承认对中心问题缺乏信心. CIImage和其他两种类型的图像之间存在语义上的差异 – CIImage是图像的配方,并不一定由像素支持.它可以像“从这里取像素,像这样转换,应用此过滤器,与其他映像合并,应用此过滤器”.在您选择渲染之前,系统不知道CIImage的外观.它也不是固有的知道栅格化它的适当范围.
UIImage只是为了包装CIImage.它不会将其转换为像素.大概UIImageView应该实现这一点,但如果是这样,那么我似乎找不到您提供适当输出矩形的位置.
我已经成功地逃避了这个问题:
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; CIContext *temporaryContext = [CIContext contextWithOptions:nil]; CGImageRef videoImage = [temporaryContext createCGImage:ciImage fromRect:CGRectMake(0,CVPixelBufferGetWidth(pixelBuffer),CVPixelBufferGetHeight(pixelBuffer))]; UIImage *uiImage = [UIImage imageWithCGImage:videoImage]; CGImageRelease(videoImage);