1

我目前正在调整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

显然,图像已调整大小,尽管我没有看到代码的任何部分要求调整大小。那是从哪里来的,更重要的是,我该如何预防呢?

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


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

4

2 回答 2

2

您可以使用以下方法去除干净的光圈数据

CVBufferRemoveAttachment(frame, kCVImageBufferCleanApertureKey);

打电话之前imageWithCVImageBuffer

于 2014-08-27T20:30:37.010 回答
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

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

于 2015-04-27T23:55:49.023 回答