gpt4 book ai didi

ios - 如何将 CVPixelBuffer 转换为 UIImage?

转载 作者:IT王子 更新时间:2023-10-29 07:42:19 26 4
gpt4 key购买 nike

我在从 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];

heightwidth 均已正确设置为相机的分辨率。 image 已创建,但我认为它似乎是黑色的(或者可能是透明的?)。我不太明白问题出在哪里。任何想法将不胜感激。

最佳答案

首先,与您的问题没有直接关系的显而易见的东西:AVCaptureVideoPreviewLayer 是将来自任一摄像机的视频传输到独立 View 的最便宜的方式,如果这是数据的来源来自并且您没有立即修改它的计划。您不必自己做任何插入,预览层直接连接到 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, 0,
CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer))];

UIImage *uiImage = [UIImage imageWithCGImage:videoImage];
CGImageRelease(videoImage);

With 提供了一个明显的机会来指定输出矩形。我确信有一条不使用 CGImage 作为中介的途径,所以请不要认为此解决方案是最佳实践。

关于ios - 如何将 CVPixelBuffer 转换为 UIImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8072208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com