将yuv图像覆盖在另一个图像上

时间:2011-07-08 07:01:37

标签: c image-processing

我想将yuv图像覆盖在另一个yuv图像上。假设如果有640x 480图像,我想在源图像的右下方覆盖一个小尺寸图像。 请帮忙。

1 个答案:

答案 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 :目标图片中的左上角位置,该区域被复制到