使用libjpeg库将bmp图片压缩成jpg

本文介绍了如何利用libjpeg库将BMP图片转换为JPEG格式,详细阐述了编译libjpeg的过程及压缩图像的步骤,包括创建JPEG对象、设置压缩参数、启动压缩、写入数据和完成压缩。
摘要由CSDN通过智能技术生成

在进行图片压缩编程之前必须先移植第三方库libjpeg.so。

我用的是jpegsrc.v8c.tar.gz版本,具体的安装过程如下:

1、解压:#tar -xzvf jpegsrc.v8d.tar.gz

2、进入解压后的目录:#cd jpeg-8c

3、创建文件夹,用于存放生成的库文件和相关头文件:#mkdir /root/jpeg_8

4、配置编译工具和生成目标文件该存放的文件夹:#./configure --prefix=/root/jpeg_8 --host=arm-cortex_a8-linux-gnueabi

“/root/jpeg_8”这个文件夹根据自己需要设置,编译工具也要根据需要设置:arm-cortex_a8-linux-gnueabi


libjpeg库生成了就可以开始图片压缩的编程了,如下:

1、图片的压缩需要一个jpeg对象,jpeg对象是一个jpeg_decompress_struct结构体,同时还需要一个错误处理结构体对象,该对象是jpeg_error_mgr。

struct jpeg_compress_struct toWriteCinfo;  //定义jpeg对象
struct jpeg_error_mgr jerr; //定义错误处理对象

2、将错误处理对象绑定在jpeg对象上

toWriteCinfo.err = jpeg_std_error(&jerr); 

3、初始化jpeg对象

jpeg_create_compress(&toWriteCinfo);  

4、确定要用于输出压缩后的jpeg的数据空间,这里用unsigned char **jpeg_buf类型的指针,unsigned long int *jpeg_len指针指向的空间用于存储jpeg图片的大小   

jpeg_mem_dest(&toWriteCinfo, jpeg_buf, jpeg_len);

5、设置压缩参数,主要参数有图像宽、高、色彩通道数(1:索引图像 3:其他),色彩空间(JCS_GRAYSCALE表示灰度图,

下面是一个使用libjpeg将YUV420p压缩JPEG格式的C++代码示例: ```cpp #include <stdio.h> #include <jpeglib.h> void compress_yuv_to_jpeg(unsigned char* yuv, int width, int height, int quality, const char* filename) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE* outfile = fopen(filename, "wb"); if (!outfile) { fprintf(stderr, "Failed to open output file.\n"); return; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; // YUV420p是3个颜色分量 cinfo.in_color_space = JCS_YCbCr; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); JSAMPROW row_pointer[1]; int row_stride; jpeg_start_compress(&cinfo, TRUE); row_stride = width * 3; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &yuv[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); } int main() { // 假设你已经将YUV420p数据存储在unsigned char* yuv中 unsigned char* yuv; int width, height; int quality = 80; // JPEG质量设置为80 const char* filename = "output.jpg"; // 假设你已经设置了yuv的宽度和高度 compress_yuv_to_jpeg(yuv, width, height, quality, filename); return 0; } ``` 这段代码使用libjpeg中的函数和结构体来进行压缩。它将YUV420p数据写入到一个JPEG文件中,你可以通过调整quality参数来控制JPEG压缩质量。请确保你已经安装了libjpeg并在编译时链接到对应的文件。 注意:这只是一个简单的示例代码,实际使用中可能需要更多的错误处理和输入验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值