C语言算法, nv12保存为yuv文件
时间: 2023-11-22 13:57:01 浏览: 98
rgb 和 yuv_nv12 数据相互转换
5星 · 资源好评率100%
下面是将NV12格式的图像数据保存为YUV格式文件的C语言算法:
```c
#include <stdio.h>
// 定义NV12格式图像的宽和高
#define WIDTH 640
#define HEIGHT 480
// 将NV12格式的图像数据保存为YUV格式文件
void nv12_to_yuv(unsigned char* nv12_data, int nv12_size, const char* yuv_filename) {
// 打开YUV格式文件
FILE* yuv_file = fopen(yuv_filename, "wb");
if (yuv_file == NULL) {
printf("Error: Failed to open YUV file\n");
return;
}
// 计算Y分量和UV分量的大小
int y_size = WIDTH * HEIGHT;
int uv_size = y_size / 2;
// 写入Y分量到YUV文件
fwrite(nv12_data, 1, y_size, yuv_file);
// 将UV分量写入到YUV文件
unsigned char* uv_data = nv12_data + y_size;
for (int i = 0; i < uv_size; i += 2) {
fwrite(&uv_data[i + 1], 1, 1, yuv_file);
fwrite(&uv_data[i], 1, 1, yuv_file);
}
// 关闭YUV文件
fclose(yuv_file);
}
int main() {
// 读取NV12格式的图像数据
FILE* nv12_file = fopen("input.nv12", "rb");
if (nv12_file == NULL) {
printf("Error: Failed to open NV12 file\n");
return 1;
}
fseek(nv12_file, 0, SEEK_END);
int nv12_size = ftell(nv12_file);
fseek(nv12_file, 0, SEEK_SET);
unsigned char* nv12_data = (unsigned char*)malloc(nv12_size);
fread(nv12_data, 1, nv12_size, nv12_file);
fclose(nv12_file);
// 将NV12格式的图像数据保存为YUV格式文件
nv12_to_yuv(nv12_data, nv12_size, "output.yuv");
// 释放内存
free(nv12_data);
return 0;
}
```
上述代码中,`nv12_data` 表示NV12格式的图像数据,`nv12_size` 表示数据大小,`yuv_filename` 表示保存的YUV格式文件名。函数 `nv12_to_yuv` 将NV12格式的图像数据转换为YUV格式并保存到文件中。在主函数中,先读取NV12格式的图像数据,然后调用 `nv12_to_yuv` 函数将NV12格式的数据转换为YUV格式并保存到文件中。
阅读全文