前一段时间做了一个项目,项目中有一部分是关于图像采集的,相关硬件有:高速数字相机(我们采用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.lib,jconfig.h,jmorecfg.h,jpeglib.h这几个文件,下面我就介绍一下怎样在自己的程序里嵌入图像压缩功能。

  一、建立编译环境

  所谓建立编译环境,其实非常简单,就是把上面提到的4个文件拷贝到你的项目文件夹下,把libjpeg.lib添加到你的项目中,然后在你完成压缩功能的那个文件里加入#include "jpeglib.h",需要注意的是,libjpeg.lib是用c语言开发的,如果要用在你的C++程序里,需要用到extern "C",如下:

// TestLibjpeg.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "memory.h"
extern "C" {
 #include "jpeglib.h"
}

  二、压缩步骤

  1、申请并初始化jpeg压缩对象,同时要指定错误处理器

struct jpeg_compress_struct jcs;

// 声明错误处理器,并赋值给jcs.err域
  struct jpeg_error_mgr jem;
  jcs.err = jpeg_std_error(&jem);

jpeg_create_compress(&jcs);

  2、指定压缩后的图像所存放的目标文件,注意,目标文件应以二进制模式打开

f=fopen("03.jpg","wb");
  if (f==NULL)
  {
    delete [] data;
    delete [] pDataConv;
    return 0;
  }
  jpeg_stdio_dest(&jcs, f);

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

jcs.image_width = nWidth;    // 为图的宽和高,单位为像素
  jcs.image_height = nHeight;
  jcs.input_components = 1;   // 在此为1,表示灰度图, 如果是彩色位图,则为3
  jcs.in_color_space = JCS_GRAYSCALE; //JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像

jpeg_set_defaults(&jcs);
 jpeg_set_quality (&jcs, 80, true);

需要注意的是,jpeg_set_defaults函数一定要等设置好图像宽、高、色彩通道数计色彩空间四个参数后才能调用,因为这个函数要用到这四个值,调用jpeg_set_defaults函数后,jpeglib库采用默认的设置对图像进行压缩,如果需要改变设置,如压缩质量,调用这个函数后,可以调用其它设置函数,如jpeg_set_quality函数。其实图像压缩时有好多参数可以设置,但大部分我们都用不着设置,只需调用jpeg_set_defaults函数值为默认值即可。

  4、上面的工作准备完成后,就可以压缩了,压缩过程非常简单,首先调用jpeg_start_compress,然后可以对每一行进行压缩,也可以对若干行进行压缩,甚至可以对整个的图像进行一次压缩,压缩完成后,记得要调用jpeg_finish_compress函数,如下:

jpeg_start_compress(&jcs, TRUE);

JSAMPROW row_pointer[1];   // 一行位图
  int row_stride;      // 每一行的字节数

row_stride = jcs.image_width;  // 如果不是索引图,此处需要乘以3

// 对每一行进行压缩
  while (jcs.next_scanline < jcs.image_height) {
       row_pointer[0] = & pDataConv[jcs.next_scanline * row_stride];
       jpeg_write_scanlines(&jcs, row_pointer, 1);
  }

jpeg_finish_compress(&jcs);

  5、最后就是释放压缩工作过程中所申请的资源了,主要就是jpeg压缩对象,由于在本例中我是直接用的局部变量,所以只需调用jpeg_destroy_compress这个函数即可,如下:

jpeg_destroy_compress(&jcs);

  三、解压缩步骤
  解压缩步骤与压缩步骤非常相似,只是解压缩对象为jpeg_decompress_struct类型,步骤如下:
  1、声明并初始化解压缩对象,同时制定错误信息管理器
 struct jpeg_decompress_struct cinfo;
 struct jpeg_error_mgr jerr;

cinfo.err = jpeg_std_error(&jerr);
 jpeg_create_decompress(&cinfo);
  2、打开jpg图像文件,并指定为解压缩对象的源文件
 FILE *f = fopen(strSourceFileName,"rb");
 if (f==NULL)
 {
  printf("Open file error!/n");
  return;
 }
 //
 jpeg_stdio_src(&cinfo, f);
  3、读取图像信息
 jpeg_read_header(&cinfo, TRUE);
  4、根据图像信息申请一个图像缓冲区
 data = new BYTE cinfo.image_width*cinfo.image_height*cinfo.num_components];
  5、开始解压缩
 jpeg_start_decompress(&cinfo);

JSAMPROW row_pointer[1];
 while (cinfo.output_scanline < cinfo.output_height)
 {
  row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*cinfo.image_width*cinfo.num_components];
  jpeg_read_scanlines(&cinfo,row_pointer ,
     1);
 }
 jpeg_finish_decompress(&cinfo);
  6、释放资源
 jpeg_destroy_decompress(&cinfo);

fclose(f);

  好了,利用IJG JPEG Library进行图像压缩就介绍到这里,希望对大家有所帮助,实例代码已经实现了图像的压缩和解压缩的全部功能,命令格式为:“TestLibjpeg.exe j|j24|b 源文件名 目标文件名”,其中,j选项将源文件压缩为jpg格式,不改变色彩模式,j24选项将源文件压缩为24为jpg格式,b选项将源文件解压缩为bmp格式,该实例并没有提供文件有效性的验证,如果要引入自己的代码,请自己实现文件有效性的验证。

利用jpeglib压缩图像为jpg格式相关推荐

  1. 利用ffmpeg压缩屏幕图像为avi(录屏、压制)

    看了雷神关于ffmpeg方面的文章,结合自己最近做的一个基与cdc抓屏.vfw压制的录屏工具,就想改为采用ffmpeg来压制avi. 关于如何用ffmpeg压制视频相信大家都有一些见解,这里写这篇文章 ...

  2. 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)

    转载篇: 标题:利用libjpeg处理图像 作者:赵新国 Email:zhao3728@sina.com 关键字: jpeg, 图像压缩 摘要:文章介绍了采用libjpeg处理图像的方法 前一段时间做 ...

  3. python输出jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  4. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  5. python图片保存jpg、show变成bmp_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  6. python matplotlib模块画出的图像转换为.tiff格式

    利用python matplotlib模块(python3.7.1)画出的图表暂不支持直接导出.tiff格式的图片,但是可以导出eps, pdf, pgf, png, ps, raw, rgba, s ...

  7. PS 图像尺寸|点阵格式图像|矢量格式图像|图像格式的选择

    一.图像尺寸 像素作为图像的一种尺寸,只存在于电脑中,如同RGB色彩模式一样只存在于电脑中. 像素是一种虚拟的单位,现实生活中是没有像素这个单位的. 传统长度单位:毫米.厘米.分米.米.公里.光年. ...

  8. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

  9. 使用C++实现YUV格式图像与RGB格式图像之间相互转换

    使用C++实现YUV格式图像与RGB格式图像之间相互转换 一.RGB与YUV转换公式 1.RGB转YUV 1)RGB转换亮度与色差信号公试: 2)归一化为YUV的转化公试为: 2.YUV转RGB 二. ...

最新文章

  1. 朋友,别在降低别人底线或被别人降低底线了!
  2. 第十六届智能车竞赛赛前补充比赛信息
  3. 图书商城:购物车模块
  4. python如何创建函数对列表里的元素进行分类_列表(List)操作方法详解
  5. java中搭建流水线,部署流水线搭建小记:Docker、Jenkins、Java 和 Couchbase
  6. [css] 为什么说css的选择器一般不要超过三级?
  7. java aop注解日志记录_spring aop通过注解实现日志记录
  8. java使用Websocket获取HttpSession出现的问题与解决
  9. php项目重构,跪求网页重构、前端开发、PHP 开发,坐标深圳腾讯 CDC
  10. 百度地图InfoWindow弹窗圆角
  11. iOS捷径(Workflow 2.0)拓展
  12. 基于K均值聚类算法的图像分割(Matlab)
  13. 说出来你可能不信,我用 Python 破解了微信聊天记录
  14. Atitit 团队激励 理论与措施 目录 1. 马斯洛需求理论 1 2. 赫兹伯格双因素理论 1 3. X理论y理论 1 4. 期望理论。。 1 1.马斯洛需求理论 激励方法 福利 奖金
  15. 线性代数之 伪逆矩阵
  16. 漫步者lollipods如何调节音量_漫步者LolliPods怎么配对双耳-使用教程
  17. python话圣诞树_python画圣诞树
  18. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...
  19. 微信小程序实现跑马灯效果(完整代码)
  20. 玲珑杯-射击气球-点到线段的距离

热门文章

  1. java 遍历数据的三种方式
  2. Java获取当前时间的四种方式
  3. 基于特征匹配的英文印刷字符识别代码自己的注释
  4. javaer的目标,是星辰大海!
  5. Mac Os Monterey brew apache启动后一致断续error
  6. 用户模块跳转、sso单点登录、跨域访问
  7. ReportStudio入门教程(七十二) - 显示时间进度(进度条版)
  8. 卷积神经网络 CNN 简述
  9. 如何用2SC5200晶体管制作音频放大器
  10. 树莓派PICO问题一