生成一张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
  • 画质