作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在从 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];
height
和 width
均已正确设置为相机的分辨率。 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/
我是一名优秀的程序员,十分优秀!