encode/decode jpeg in memory_拔剑-浆糊的传说_新浪博客

Some additional words:
    Libjpeg already support encode/decode image in memory since version 8b, however
    this paper is useful for us to understand the mechnism of encoding/decoding jpeg.

    Currently, the version I am using is libjpeg8c.

    - ba_jian


--------------------------------------------------------------------------------------


通过简单修改libjpeg源代码,实现内存内位图的压缩及解压缩 - [Linux]

Tag: linux   技巧   jpeg

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://rtfsc.blogbus.com/logs/23148378.html

相信使用过的朋友应该会喜欢上libjpeg,它简单易用、压缩质量可以随意控制、并且稳定性很好,但是,官方网站给提供的libjpeg库,
不论是进行压缩时还是解压缩时,都需要用到FILE,使得我们如果想在内存中直接压缩或解压缩图像还要自己实现相应的结构,
总之,比较麻烦,尤其对初学者,更是不知从何处入手,幸运的是,libjpeg给我们提供了源代码,今天我就为大家介绍,怎样修改源代码,
使libjpeg可以非常容易的直接处理内存中的图像,而无需借助文件操作。

一、建立自己的libjpeg工程
       为了修改后编译方便,也为了以后在VC 环境下容易使用libjpeg库,我们按以下步骤将libjpeg转换为VC环境下的工程。
        1、在VC环境下重新建立一个空的static library工程,工程名为libjpeg,此处注意,新建工程不要包含mfc,不要预编译头文件;
         2、然后将libjpeg下的jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c 
        jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c 
        jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c 
        jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c 
        jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c 
        jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c 
        jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c jquant1.c 
        jquant2.c jutils.c jmemmgr.c 
       jchuff.h  jconfig.h jdhuff.h jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h 
        jpegint.h jpeglib.h jversion.h 等文件拷贝到新工程的文件夹下,并将.c文件改名为.cpp;
         3、将所有的源文件及头文件添加到新建的工程中;
         4、编译新工程,此时就可以生成libjpeg.lib了。
二、分析并修改源代码
        我们知道,libjpeg是利用FILE进行存取图像数据的,接下来,我们就要分析一下libjpeg是怎样利用FILE进行存取图像数据的,
然后我们用内存拷贝的方式替换掉所有的文件操作(I/O),也就实现了内存中进行图像压缩和解压缩的目标。
        下面,先分析压缩图像时libjpeg是怎样利用FILE进行存储数据的。我们先看在进行图像压缩时,我们所调用的跟文件有关系的函数:
                jpeg_stdio_dest(j_compres_ptr cinfo, FILE *outfile);
        我们找到这个函数的源代码(jdatadst.cpp文件第130行):
1      GLOBAL(void)
2      jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
3      {
4               my_dest_ptr dest;
5              
11           if (cinfo->dest == NULL) {
12                    cinfo->dest = (struct jpeg_destination_mgr *)
13                    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
14                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值