您的位置:首页 > 其它

jpeglib应用

2015-06-28 17:32 281 查看
注:以下信息摘自各个网页和论坛。只是做一个综合。谢谢前辈们的分享。

一、用vs2010 打开解决方案sln,build(构建)它即可,随后将在源代码的文件夹下生成一个release文件夹,jpeg.lib就在其中。在这个过程中注意如果要调整编译输出方式为debug需要在configuration中新建Debug编译方式,同理X64或其他编译方法也需要配置。

6、注意不要编译成dll库,在jpeg的实现中是没有用导出符号的,函数在其他程序中是无法被识别的,在链接是会报错。

7、使用lib库,在你的工程里正确配置lib库的路径,在属性对话框的配置栏中linker(链接器)的input(输入)中加上jpeg库的文件名即可。

二、

1、将生成的libjpeg.lib文件拷至<drive>:\<VC++
path>\VC98\lib\libjpeg.lib,同时将头文件jpeglib.h,jerror.h,jconfig.h,jmorecfg.h拷至<drive>:\<VC++ path>\VC98\ Include \目录下

2、

vs++目录,包含目录加入/jpeg-9
库目录加入/jpeg-9/release

链接器--输入--附加依赖项加入jpeg.lib

源文件需Include  jpeglib.h jmorecfg.h等头文件

三、测试程序:

1,在测试程序中工程属性-Linker-Input-Additional Dependencies中添加编译得到的jpeg.lib,同时将jpeg.lib文件放在测试代码同级目录下;

2,将libjpeg包中的头文件放在测试程序目录下,并在测试程序中添加对jpeglib.h和jmorecfg.h的引用(#include)。

即可在测试程序用用libjpeg库生成jpeg图像。

四、在windows上,用命令行直接编译libjpeg.(事先运行vsvars32.bat设置环境变量)

在libjpeg源代码中有一个Makefile.vc的文件,可以通过nmake /f makefile.vc [nodebug=1]来编译libjpeg,但是只能编译静态库。需要修改makefile.vc和jconfig.h才能编译成dll,可供其它应用程序调用。另外jconfig.vc改为jconfig.h

在Makefile.vc文件中添加编译dll规则:

Libjpeg.lib:$(LIBOBJECTS)

$(RM) libjpeg.lib

Lib –out:libjpeg.lib $(LIBOBJECTS)

#添加以下几行

Libjpeg.dll:$(LIBOBJECTS)

Link –dll –out:libjpeg.dll $(LIBOBJECTS)

在jmorecfg.h中添加

#define _WIN32_

#define JPEG_DLL

然后nmake /f makefile.vc nodebug=1就可以了(在TOOLS\VisualStadio2008 Command Prompt下)
五、根据jpeg.sln工程文件中的头文件和源文件在jpeg-9中选取头文件和源文件,制作jpeg-9的Debug版本的静态库。
六、调用库函数编写编解码应用       JPEG-9文件夹中的example.c文件

七、#include "jpeglib.h"

八、

您可以下载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 "
4000
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格式, 该实例并没有提供文件有效性的验证,如果要引入自己的代码,请自己实现文件有效性的验证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: