我正在尝试使用vImage_Buffer缩放图像,下面的代码对我很有用。我的问题是我想要保持源图像的高宽比,所以我可能需要添加一个xOffset或yOffset。下面的代码只适用于yOffset。如何使用xOffset缩放图像。我不能使用CGContext进行缩放,因为这会影响性能。
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);发布于 2020-08-07 14:18:48
没有双关语的意思,但您确实应该阅读Accelerate.framework文档。
用malloc代替calloc .
void *destData = calloc(finalHeight * finalWidth * 4);..。使所有字节为零(或使用任何其他方式)。
vImage_Buffer.rowBytes文档是怎么说的?
以字节为单位,从图像中的一个像素行开始到下一个像素行之间的距离(包括它们之间的任何未使用的空间)。
rowBytes值必须至少是宽度乘以像素大小,其中像素大小取决于图像格式。您可以提供更大的值,在这种情况下,额外的字节将扩展到每一行像素的末尾。您可能需要这样做,以提高性能,或者在不复制数据的情况下描述大图像中的图像。额外的字节不被认为是由vImage缓冲区表示的映像的一部分。当为图像分配浮点数据时,通过将字节分配为4的整数倍数来保持数据4字节对齐,为最佳性能,将字节分配为16的整数倍数。
请看下面的图片:

红色圆圈(左上角)是从缓冲区开始的offset,让我们计算它(假设每个像素有4个字节):
size_t startY = aspectRect.origin.y;
size_t startX = aspectRect.origin.x;
size_t offset = 4 * (finalWidth * startY + startX);以字节为单位,从图像中的一个像素行开始到下一个像素行之间的距离(包括它们之间的任何未使用的空间)是finalWidth * 4 (其他两个圆圈之间的红线)。
让我们修复destBuffer
vImage_Buffer destBuffer = {
(void *)destData+offset,
aspectRect.size.height,
aspectRect.size.width,
finalWidth * 4
};https://stackoverflow.com/questions/63303044
复制相似问题