ios – 如何将CVPixelBuffer变成UIImage?

从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);

给出一个明确的机会来指定输出矩形.我确定没有使用CGImage作为中介的路由,所以请不要以为这个解决方案是最佳做法.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...