写一段c语言 批量把yuv图像转换成jpg格式
时间: 2023-11-07 11:04:18 浏览: 57
好的,以下是一段C语言代码,它可以将多个YUV图像批量转换为JPEG格式:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jpeglib.h>
#define WIDTH 1920 // 图像宽度
#define HEIGHT 1080 // 图像高度
// YUV图像文件名列表
char *yuvFileList[] = {"image1.yuv", "image2.yuv", "image3.yuv"};
// JPEG图像文件名列表
char *jpgFileList[] = {"image1.jpg", "image2.jpg", "image3.jpg"};
int main()
{
int i;
FILE *fpi, *fpo;
char yuvFileName[100], jpgFileName[100];
for (i = 0; i < 3; i++) // 遍历所有YUV图像文件
{
// 打开YUV图像文件
sprintf(yuvFileName, "%s", yuvFileList[i]);
fpi = fopen(yuvFileName, "rb");
// 创建JPEG图像文件
sprintf(jpgFileName, "%s", jpgFileList[i]);
fpo = fopen(jpgFileName, "wb");
// 准备图像缓存
unsigned char *yuvBuf = malloc(WIDTH * HEIGHT * 3 / 2);
unsigned char *rgbBuf = malloc(WIDTH * HEIGHT * 3);
// 读取YUV图像数据
fread(yuvBuf, 1, WIDTH * HEIGHT * 3 / 2, fpi);
// 初始化JPEG压缩对象
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, fpo);
cinfo.image_width = WIDTH;
cinfo.image_height = HEIGHT;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_start_compress(&cinfo, TRUE);
// 将YUV图像转换为RGB图像
int j;
for (j = 0; j < WIDTH * HEIGHT; j++)
{
unsigned char y = yuvBuf[j];
unsigned char u = yuvBuf[WIDTH * HEIGHT + j / 4];
unsigned char v = yuvBuf[WIDTH * HEIGHT + WIDTH * HEIGHT / 4 + j / 4];
rgbBuf[j * 3] = y + 1.402 * (v - 128);
rgbBuf[j * 3 + 1] = y - 0.34414 * (u - 128) - 0.71414 * (v - 128);
rgbBuf[j * 3 + 2] = y + 1.772 * (u - 128);
}
// 将RGB图像压缩为JPEG图像
JSAMPROW row_pointer[1];
while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = &rgbBuf[cinfo.next_scanline * WIDTH * 3];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
// 释放内存和关闭文件
free(yuvBuf);
free(rgbBuf);
fclose(fpi);
fclose(fpo);
}
return 0;
}
```
这段代码将遍历给定的YUV图像文件名列表(在本例中,是image1.yuv、image2.yuv和image3.yuv),并将它们分别转换为JPEG格式,分别保存为image1.jpg、image2.jpg和image3.jpg。