用c语言写一个yuv420图像翻转90度
以下是一种可能的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;
}
原文地址: https://www.cveoy.top/t/topic/sLL 著作权归作者所有。请勿转载和采集!