我目前正在调整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 。所以现在的问题是如何将这个干净的光圈设置为全帧尺寸,或者如何避免转换考虑到这一点。
答案 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
如果第一个建议没有结果。