我想将yuv图像覆盖在另一个yuv图像上。假设如果有640x 480图像,我想在源图像的右下方覆盖一个小尺寸图像。 请帮忙。
答案 0 :(得分:2)
平面YUV 420图像由640×480字节的Y样本组成,接着是320×240字节的U样本和320×240字节的V样本。由于每个2x2块只存在颜色信息(而不是每个像素),我会假设所有图像尺寸的位置都是2的倍数。(否则它会变得复杂得多。)
此外,我假设在行尾,Y和U之间或U和V样本之间没有填充。
void copyRect(unsigned char* targetImage, int targetWidth, int targetHeight,
unsigned char* sourceImage, int sourceWidth, int sourceHeight,
int sourceLeft, int sourceTop,
int width, int height,
int targetLeft, int targetTop)
{
// Y samples
unsigned char* tgt = targetImage + targetTop * targetWidth + targetLeft;
unsigned char* src = sourceImage + sourceTop * sourceWidth + sourceLeft;
for (int i = 0; i < height; i++) {
memcpy(tgt, src, width);
tgt += targetWidth;
src += sourceWidth;
}
// U samples
tgt = targetImage + targetHeight * targetWidth
+ (targetTop / 2) * (targetWidth / 2) + (targetLeft / 2);
src = sourceImage + sourceHeight * sourceWidth
+ (sourceTop / 2) * (sourceWidth / 2) + (sourceLeft / 2);
for (int i = 0; i < height / 2; i++) {
memcpy(tgt, src, width / 2);
tgt += targetWidth / 2;
src += sourceWidth / 2;
}
// V samples
tgt = targetImage + targetHeight * targetWidth + (targetHeight / 2) * (targetWidth / 2)
+ (targetTop / 2) * (targetWidth / 2) + (targetLeft / 2);
src = sourceImage + sourceHeight * sourceWidth + (sourceHeight / 2) * (sourceWidth / 2)
+ (sourceTop / 2) * (sourceWidth / 2) + (sourceLeft / 2);
for (int i = 0; i < height / 2; i++) {
memcpy(tgt, src, width / 2);
tgt += targetWidth / 2;
src += sourceWidth / 2;
}
}
我从未尝试过编译代码。所以没有保证。
参数是:
targetImage :目标图片的像素数据,其他图片被复制到
targetWidth , targetHeigt :目标图片的维度
sourceImage :源图像的像素数据,其中一部分被复制到另一个图像
sourceWidth, sourceHeight :源图像的维度
sourceLeft , sourceTop :要复制的区域的源图像中的左上角位置
width , height :要复制的区域大小
targetLeft , targetTop :目标图片中的左上角位置,该区域被复制到