利用jpeglib压缩图像为jpg格式

前一段时间做了一个项目,项目中有一部分是关于图像采集的,相关硬件有:高速数字相机(我们采用Basler A312f),工控机,服务器。其中相机通过1394视频线连接到工控机的1394视频卡上,工控机与服务器通过百兆网连接。具体工作流程为:工控机控制相机采集图像,帧率一般为40HZ左右,采集的图像为位图数据,需要自己在程序中封装为bmp格式,然后压缩成jpg格式,压缩后的图像一方面保存到本地硬盘,同时要传输到服务器上。

  本文只介绍jpeg压缩的相关内容,刚开始我贪图省事,采用微软 的GDI Plus提供的功能,很是方便,先获取jpg图像的编码,然后根据图像的位图数据创建一个Bitmap类的对象,再保存图像为jpg格式就行了。但是我对GDI+还是很信任,总感觉不踏实(没有理由的),我们的系统一旦安装就要长期运行,我就是担心长期运行一段时间后GDI+会出问题,结果也证实了我的担心,我们实际使用的10套系统中有一套,连续运行3-5天后,GDI+就会崩溃,于是我决心采用IJG JPEG Library。您可以到www.ijg.org网站下载libjpeg的源码, IJG JPEG Library就是jpeg压缩库,是以源码的形式提供给软件开发人员的,当然在软件包里也有编译好的库文件,我们这里就只用到其中的libjpeg

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
JPEG图像压缩是一种常用的无损和有损压缩方法,以下是一个简单的C代码示例,用于将图像转换为JPEG格式: ```c #include <stdio.h> #include <jpeglib.h> void compressJPEG(const char* inputFilename, const char* outputFilename, int quality) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE* inputFile; FILE* outputFile; JSAMPROW row_pointer[1]; int row_stride; // 打开输入文件 inputFile = fopen(inputFilename, "rb"); if (inputFile == NULL) { fprintf(stderr, "无法打开输入文件\n"); return; } // 打开输出文件 outputFile = fopen(outputFilename, "wb"); if (outputFile == NULL) { fprintf(stderr, "无法打开输出文件\n"); fclose(inputFile); return; } // 初始化压缩结构体 cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outputFile); // 设置图像参数 jpeg_read_header(&cinfo, TRUE); cinfo.image_width = cinfo.image_width; cinfo.image_height = cinfo.image_height; cinfo.input_components = cinfo.num_components; cinfo.in_color_space = cinfo.jpeg_color_space; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); // 开始压缩 jpeg_start_compress(&cinfo, TRUE); // 逐行压缩图像数据 row_stride = cinfo.image_width * cinfo.input_components; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &image_buffer[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } // 结束压缩 jpeg_finish_compress(&cinfo); // 释放资源 fclose(inputFile); fclose(outputFile); jpeg_destroy_compress(&cinfo); } int main() { const char* inputFilename = "input.bmp"; const char* outputFilename = "output.jpg"; int quality = 80; compressJPEG(inputFilename, outputFilename, quality); return 0; } ``` 以上示例代码使用了`jpeglib.h`头文件中提供的函数和结构体来实现JPEG图像压缩。首先打开输入文件和输出文件,然后初始化压缩结构体并设置图像参数。接着开始压缩,使用`jpeg_write_scanlines`函数逐行写入压缩后的图像数据,最后结束压缩并释放所使用的资源。 在使用时,只需将输入文件名、输出文件名和压缩质量作为参数传递给`compressJPEG`函数即可。其中,压缩质量取值范围为0-100,值越大代表质量越高但文件大小也越大。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值