首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有偏移Cocoa目标C的标度vImage_Buffer

具有偏移Cocoa目标C的标度vImage_Buffer
EN

Stack Overflow用户
提问于 2020-08-07 13:40:04
回答 1查看 325关注 0票数 1

我正在尝试使用vImage_Buffer缩放图像,下面的代码对我很有用。我的问题是我想要保持源图像的高宽比,所以我可能需要添加一个xOffsetyOffset。下面的代码只适用于yOffset。如何使用xOffset缩放图像。我不能使用CGContext进行缩放,因为这会影响性能。

代码语言:javascript
复制
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    
    size_t finalWidth = 1080;
    size_t finalHeight = 720;
    
    size_t sourceWidth = CVPixelBufferGetWidth(imageBuffer);
    size_t sourceHeight = CVPixelBufferGetHeight(imageBuffer);
    
    CGRect aspectRect = AVMakeRectWithAspectRatioInsideRect(CGSizeMake(sourceWidth, sourceHeight), CGRectMake(0, 0, finalWidth, finalHeight));
    
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

    size_t startY = aspectRect.origin.y;
    size_t yOffSet = (finalWidth*startY*4);
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    
    void* destData = malloc(finalHeight * finalWidth * 4);
    
    vImage_Buffer srcBuffer = { (void *)baseAddress, sourceHeight, sourceWidth, bytesPerRow};
    vImage_Buffer destBuffer = { (void *)destData+yOffSet, aspectRect.size.height, aspectRect.size.width, aspectRect.size.width * 4};
    
    vImage_Error err = vImageScale_ARGB8888(&srcBuffer, &destBuffer, NULL, 0);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-07 14:18:48

没有双关语的意思,但您确实应该阅读Accelerate.framework文档。

malloc代替calloc .

代码语言:javascript
复制
void *destData = calloc(finalHeight * finalWidth * 4);

..。使所有字节为零(或使用任何其他方式)。

vImage_Buffer.rowBytes文档是怎么说的?

以字节为单位,从图像中的一个像素行开始到下一个像素行之间的距离(包括它们之间的任何未使用的空间)。

rowBytes值必须至少是宽度乘以像素大小,其中像素大小取决于图像格式。您可以提供更大的值,在这种情况下,额外的字节将扩展到每一行像素的末尾。您可能需要这样做,以提高性能,或者在不复制数据的情况下描述大图像中的图像。额外的字节不被认为是由vImage缓冲区表示的映像的一部分。当为图像分配浮点数据时,通过将字节分配为4的整数倍数来保持数据4字节对齐,为最佳性能,将字节分配为16的整数倍数。

请看下面的图片:

红色圆圈(左上角)是从缓冲区开始的offset,让我们计算它(假设每个像素有4个字节):

代码语言:javascript
复制
size_t startY = aspectRect.origin.y;
size_t startX = aspectRect.origin.x;
size_t offset = 4 * (finalWidth * startY + startX);

以字节为单位,从图像中的一个像素行开始到下一个像素行之间的距离(包括它们之间的任何未使用的空间)是finalWidth * 4 (其他两个圆圈之间的红线)。

让我们修复destBuffer

代码语言:javascript
复制
vImage_Buffer destBuffer = {
    (void *)destData+offset,
    aspectRect.size.height,
    aspectRect.size.width,
    finalWidth * 4
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63303044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档