文章目录
1、jpeglib库使用方式一
将RGB888源图片文件,进行压缩,并将压缩完成的数据写入到一个新的缓冲区,最后通过文件IO的方式,将压缩完成的数据,写入到xx.jpeg的文件中。利用文件打开写入完成的xx.jpeg,即可查看压缩完成的图片
#include <stdio.h>
#include "jpeglib.h"
#include <stdlib.h>
#include <string.h>
#define WIDTH 800
#define HEIGHT 480
#define QUALITY 100
#define BPP 24 /*RGB888*/
#define RGB
/**
* @*Src 需要压缩的源数据RGB888
* @**Dest 压缩完成的数据存储到Dest
* @SrcWidth 图片宽度
* @SrcHeight 图片高低
* @*DestSize 压缩完成的数据大小
* @Quality 压缩质量
* @Component 颜色通道数
*
*/
void RGB888_To_JPEG_To_Mem(unsigned char *Src, unsigned char **Dest, int SrcWidth, int SrcHeight, long int *DestSize, int Quality, int Component)
{
int row_stride;
JSAMPROW row_pointer[1]; /* 指向一行首的指针 */
struct jpeg_error_mgr jerr;
struct jpeg_compress_struct cinfo;
// 为JPEG对象分配空间并初始化
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
/* 设置压缩参数:包括图像的大小和色彩空间 */
cinfo.image_width = SrcWidth; /* 图像宽度(像素) */
cinfo.image_height = SrcHeight; /* 图像高度(像素) */
/* components:颜色通道数(组件数); 大多数应用程序使用RGB数据,RGB数据其每个像素三个组件(R、G、B),所以设置为3;
如果是灰度数据, 每个像素一个组件, 就需要设置为1; */
cinfo.input_components = Component;
/* in_color_space(通常设置为以下两种)
JCS_RGB(RGB): input_components设置为3时
JCS_GRAYSCALE(灰度图): input_components设置为1时 */
cinfo.in_color_space = JCS_RGB;
/* 提交设置的参数 */
jpeg_set_defaults(&cinfo);
/* 设置压缩质量 */
jpeg_set_quality(&cinfo, Quality, TRUE);
/* 给*Dest 分配空间,将压缩完成的数据存储到 *Dest; DestSize, 解压完成后的数据的大小; */
jpeg_mem_dest(&cinfo, Dest, DestSize);
/* 开始压缩 */
jpeg_start_compress(&cinfo, TRUE);
/* 一行像素数据的字节数 */
row_stride = SrcWidth * (BPP >> 3);
/* 按行将原始数据上传进行压缩 */
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = Src + (cinfo.next_scanline * row_stride);
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
/* 结束压缩 */
jpeg_finish_compress(&cinfo);
/* 销毁压缩对象 */
jpeg_destroy_compress(&cinfo);
}
/* 主程序测试转换接口 */
int main()
{
unsigned char *Dest = NULL;
int Component = 0;
long int DestSize = 0;
unsigned char raw_image_888[800 * 480 * 3];
/* 填充一张800 * 480的红色图片 */
for (int i = 0; i < 800*480*3; i++) {
if (0 == (i % 3)) {
raw_image_888[i] = 0xFF;
} else {
raw_image_888[i] = 0x00;
}
}
#ifdef RGB
Component = 3;
#elif GRAYSCALE
Component = 1;
#endif
RGB888_To_JPEG_To_Mem(raw_image_888,&Dest, WIDTH, HEIGHT, &DestSize, QUALITY, Component);
printf("DestSize = %ld\n",DestSize);
/* 将Dest的数据写入到.jpeg文件, 进行测试*/
FILE *file;
file = fopen("./test.jpeg","wb");
if (NULL == file) {
printf("fopen error\n");
return -1;
}
fwrite(Dest, DestSize, 1, file);
fclose(file);
return 0;
}
程序编译:生成a.out
程序执行:打印压缩后的数据大小,生成test.jpeg文件
打开test.jpeg文件,一张红色图片