Плоское изображение 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левая позиция в пределах целевого изображения, куда область копируется в