由于yuv420图像由Y、U、V三个分量组成,因此需要分别旋转这三个分量。以下是一种实现方式:

void rotate_yuv420(unsigned char* src_yuv, unsigned char* dst_yuv, int width, int height) {
    int i, j;
    unsigned char* src_y = src_yuv;
    unsigned char* src_u = src_yuv + width * height;
    unsigned char* src_v = src_u + (width * height / 4);
    unsigned char* dst_y = dst_yuv;
    unsigned char* dst_u = dst_yuv + height * width;
    unsigned char* dst_v = dst_u + (height * width / 4);

    // 旋转Y分量
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            dst_y[i + j * height] = src_y[(height - i - 1) * width + j];
        }
    }

    // 旋转U分量
    for (i = 0; i < height / 2; i++) {
        for (j = 0; j < width / 2; j++) {
            dst_u[i + j * height / 2] = src_u[(height / 2 - i - 1) * width / 2 + j];
        }
    }

    // 旋转V分量
    for (i = 0; i < height / 2; i++) {
        for (j = 0; j < width / 2; j++) {
            dst_v[i + j * height / 2] = src_v[(height / 2 - i - 1) * width / 2 + j];
        }
    }
}

首先将源图像的Y、U、V分量分别指向不同的指针,然后分别旋转每个分量。对于Y分量,直接按行列交换像素值即可;对于U、V分量,由于它们的尺寸是原图的1/4,因此需要分别按照1/2的尺寸进行旋转。最后将旋转后的Y、U、V分量按顺序写入目标图像的指针中即可。

注意,这里假设源图像和目标图像的尺寸相同,如果不同需要进行相应的调整。

用C语言实现yuv420图像旋转90度

原文地址: https://www.cveoy.top/t/topic/qfZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录