用C语言实现yuv420图像旋转90度
由于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分量按顺序写入目标图像的指针中即可。
注意,这里假设源图像和目标图像的尺寸相同,如果不同需要进行相应的调整。
原文地址: https://www.cveoy.top/t/topic/qfZ 著作权归作者所有。请勿转载和采集!