您的位置:逆风者 VC++ 正文
 添加时间:2007-10-22 原文发表:2007-10-22 人气:455 来源:vckbase.com

本文章共2753字,分2页,当前第1页,快速翻页:
 
作者:赵新国

下载源代码
逆风者

关键字: jpeg,图像压缩

摘要:文章介绍了采用libjpeg压缩图像的方法

前一段时间做了一个项目,项目中有一部分是关于图像采集的,相关硬件有:高速数字相机(我们采用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函数值为默认值即可。
 

本文章更多内容1 - 2 - 下一页>>
相关文章

用递归的方法画分形图
MFC中基于对话框程序快捷键的实现
让你的软件界面更漂亮(五)
BMP图象解析
VC实用小知识总结 (二)
VC实用小知识总结 (一)
超强仿QQ自动伸缩窗口
WIN32程序挂钩SetLastError,输出错误描述到
Spy++原理初探
汉诺塔游戏的设计
软件框架的利器、TangramMini组件应用教程六
让你的软件界面更漂亮(六)-- 仿QQ主界面之L
对OpenCV中的平面划分相关函数使用探索
探讨性能测试中的计时问题
用命令模式实现对象存储——对象与关系数据
DynamicLayout-VC 6.0对话框动态布局解决方
文件过滤系统驱动开发Filemon学习笔记
I2C通信
简单录、放音并保存为wav文件程序
动态创建控件支持事件响应并可保存与读取

相关评论


本文章所属分类:首页 VC++

  热门关键字: