避免CIImage imageWithCVImageBuffer中的干净光圈裁剪

时间:2013-10-16 13:24:49

标签: objective-c macos core-image core-video

我目前正在调整ImageSnap的一些内部结构,尝试进行临时修改,以便即时拍摄实时摄像机图像的快照。我注意到图像已调整大小,不考虑宽高比,并将问题追溯到以下行:

CVImageBufferRef frame;
// obtain frame
verbose("frame is %d x %d px\n", (int)CVPixelBufferGetWidth(frame),
                                 (int)CVPixelBufferGetHeight(frame));
CIImage *ciimg = [CIImage imageWithCVImageBuffer:frame];
verbose("CIImage has %d x %d px\n", (int)[ciimg extent].size.width,
                                    (int)[ciimg extent].size.height);

至少对于我正在使用的一个给定设备,这些行的输出是

frame is 1920 x 1080 px
CIImage has 1888 x 1062 px

显然,图像已经调整大小,但我没有看到代码的任何部分要求调整大小。它来自何处,更重要的是,我该如何预防?

我正在使用以下文档,但在那里找不到提示:


编辑:据我所知,没有缩放,而是裁剪正在进行,这是由于清洁光圈设置mentioned in the Core Video Programming Guide 。所以现在的问题是如何将这个干净的光圈设置为全帧尺寸,或者如何避免转换考虑到这一点。

2 个答案:

答案 0 :(得分:1)

您可以使用

删除干净光圈数据
CVBufferRemoveAttachment(frame, kCVImageBufferCleanApertureKey);

在致电imageWithCVImageBuffer

之前

答案 1 :(得分:0)

来自Apple的RosyWriter应用程序:

使用extendedWidth而不是width来考虑可能的行扩展(有时用于内存对齐):

unsigned char *base = (unsigned char *)CVPixelBufferGetBaseAddress( pixelBuffer );
size_t width = CVPixelBufferGetWidth( pixelBuffer );
size_t height = CVPixelBufferGetHeight( pixelBuffer );
size_t stride = CVPixelBufferGetBytesPerRow( pixelBuffer );
size_t extendedWidth = stride / sizeof( uint32_t ); // each pixel is 4 bytes/32 bits

如果第一个建议没有结果。