以下是一种可能的C语言实现,该实现假定输入的YUV420图像是连续的,即所有Y值在一个数组中,所有U值在一个数组中,所有V值在一个数组中,并且这些数组都按照从左到右、从上到下的顺序排列。

#include <stdio.h>

void flip_yuv420_90(int width, int height, unsigned char* yuv) {
    unsigned char* y = yuv;
    unsigned char* u = yuv + width * height;
    unsigned char* v = yuv + width * height * 5 / 4;
    unsigned char tmp;

    // flip Y values
    for (int row = 0; row < height; ++row) {
        for (int col = 0; col < width / 2; ++col) {
            tmp = y[row * width + col];
            y[row * width + col] = y[(width - col - 1) * height + row];
            y[(width - col - 1) * height + row] = tmp;
        }
    }

    // flip U values
    for (int row = 0; row < height / 2; ++row) {
        for (int col = 0; col < width / 2; ++col) {
            tmp = u[row * width / 2 + col];
            u[row * width / 2 + col] = u[(width / 2 - col - 1) * height / 2 + row];
            u[(width / 2 - col - 1) * height / 2 + row] = tmp;
        }
    }

    // flip V values
    for (int row = 0; row < height / 2; ++row) {
        for (int col = 0; col < width / 2; ++col) {
            tmp = v[row * width / 2 + col];
            v[row * width / 2 + col] = v[(width / 2 - col - 1) * height / 2 + row];
            v[(width / 2 - col - 1) * height / 2 + row] = tmp;
        }
    }
}

int main() {
    // example usage
    int width = 640;
    int height = 480;
    unsigned char yuv[width * height * 3 / 2];  // allocate memory for YUV420 image

    // fill YUV420 image with some data
    for (int row = 0; row < height; ++row) {
        for (int col = 0; col < width; ++col) {
            yuv[row * width + col] = (unsigned char)(col % 256);
        }
    }

    // flip YUV420 image
    flip_yuv420_90(width, height, yuv);

    // print some Y values to verify image flipping
    for (int row = 0; row < height; ++row) {
        printf("%u ", yuv[row * width]);
    }

    return 0;
}
用c语言写一个yuv420图像翻转90度

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

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