生成一张RGB图片在内存中。
/* 图像尺寸 */
#define WIDTH 640
#define HEIGHT 480
/* 生成一张测试图像的真实数据: 左上→右下渐变 + 中间一个红方块 */
static unsigned char pixel[HEIGHT][WIDTH][3];
static void gen_image(void)
{
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
pixel[y][x][0] = (unsigned char)(x * 255 / WIDTH); /* R 随 x 变化 */
pixel[y][x][1] = (unsigned char)(y * 255 / HEIGHT); /* G 随 y 变化 */
pixel[y][x][2] = (unsigned char)((x + y) / 2); /* B 两者叠加 */
/* 中间画一个红色方块 */
if (x > 250 && x < 390 && y > 170 && y < 310) {
pixel[y][x][0] = 255;
pixel[y][x][1] = 0;
pixel[y][x][2] = 0;
}
}
}
}
编码配置
#include <jpeglib.h>
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
/* 1. 错误处理挂钩(必须设置, 否则遇到错误会直接崩溃) */
cinfo.err = jpeg_std_error(&jerr);
//初始化
jpeg_create_compress(&cinfo);
/* 2. 输出目标 */
FILE *fp = fopen("test.jpg", "wb");
if (!fp) { perror("fopen"); return 1; }
jpeg_stdio_dest(&cinfo, fp);
/* 3. 图像元信息 */
cinfo.image_width = WIDTH;//图片宽
cinfo.image_height = HEIGHT;//图片高
cinfo.input_components = 3; /* 每像素 3 个分量 RGB */
cinfo.in_color_space = JCS_RGB; /* 输入颜色空间 jpeg会将RGB转成*/
/* 4. 默认参数: 主要决定采样(4:2:0 / 4:4:4 等)和 Huffman 表 */
jpeg_set_defaults(&cinfo);
cinfo.comp_info[0].h_samp_factor = 1; //
cinfo.comp_info[0].v_samp_factor = 1; // 得到 4:4:4
/* 5. 画质 = 85 */
jpeg_set_quality(&cinfo, 85, TRUE);
/* 6. 开始压缩 */
jpeg_start_compress(&cinfo, TRUE);
/* 7. 逐行写入扫描线数据 */
unsigned char *row = (unsigned char *)malloc(WIDTH * 3);
while (cinfo.next_scanline < cinfo.image_height) {
memcpy(row, pixel[cinfo.next_scanline], WIDTH * 3);
jpeg_write_scanlines(&cinfo, &row, 1);
}
/* 8. 结束压缩 + 释放对象 */
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
fclose(fp);
free(row);
流程一般只需要改
- 图像元信息
- 默认参数444 或者420
- 画质