Наложение изображения yuv на другое изображение - PullRequest
0 голосов
/ 08 июля 2011

Я хочу наложить изображение yuv поверх другого изображения yuv. Предположим, что если есть изображение 640x480, я хочу наложить изображение небольшого размера в правом нижнем углу исходного изображения. пожалуйста, помогите.

1 Ответ

2 голосов
/ 08 июля 2011

Плоское изображение YUV 420 состоит из 640 x 480 байтов выборки Y, за которыми следуют 320 x 240 байтов выборок U и 320 x 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 : верхняя левая позиция в исходном изображении области, подлежащей копированию

ширина , высота : размер области для копирования

targetLeft , targetTop : topлевая позиция в пределах целевого изображения, куда область копируется в

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...