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

使用libjpeg库进行图像压缩 libjpeg是一个常用的开源图像压缩库,它提供了一系列函数和工具,可以用于对JPEG格式的图像进行编码和解码。本文将介绍如何使用libjpeg库对图像进行压缩,并提供相应的源代码示例。在进行图像压缩之前,需要准备待压缩的图像数据。具体安装方法可以参考libjpeg库的官方文档或者使用适合你的操作系统的包管理工具进行安装。在进行图像压缩之前,可以设置一些压缩参数,例如压缩质量、采样因子等。通过以上步骤,我们就可以使用libjpeg库对图像进行压缩了。在压缩完成后,需要将压缩后的图像数据写入到文件中。 阅读详情
相信使用过的朋友应该会喜欢上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               /* The destination object is made permanent so that multiple JPEG images 6                * can be written to the same file without re-executing jpeg_stdio_dest. 7                * This makes it dangerous to use this manager and a different destination 8                * manager serially with the same JPEG object, because their private object 9               * sizes may be different.  Caveat programmer. 10             */ 11           if (cinfo->dest == NULL) { /* first time for this JPEG object? */ 12                    cinfo->dest = (struct jpeg_destination_mgr *) 13                    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 14                   SIZEOF(my_destination_mgr)); 15          } 16           dest = (my_dest_ptr) cinfo->dest; 17           dest->pub.init_destination = init_destination; 18           dest->pub.empty_output_buffer = empty_output_buffer; 19           dest->pub.term_destination = term_destination; 20           dest->outfile = outfile; 21       }

    大家看第20行,函数将FILE类型的指针赋值给了dest->outfile,很显然,以后对文件的操作,就转向了对dest->outfile 的操作, 我们只要找到所有引用outfile的函数,就可以知道libjpeg是怎样压缩图像到文件的,因此,我们继续搜outfile,搜索结果如下:

Find all "outfile", Subfolders, Find Results 1, "Entire Solution"   E:/VS2005/libjpeg/libjpeg/jpeglib.h(910):EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(28):  FILE * outfile;  /* target stream */   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(85):  if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) !=   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(113):    if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount)   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(116):  fflush(dest->outfile);   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(118):  if (ferror(dest->outfile))   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(130):jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)   E:/VS2005/libjpeg/libjpeg/jdatadst.cpp(150):  dest->outfile = outfile;   Matching lines: 8    Matching files: 2    Total files searched: 57

    可以看到,共有8处引用了outfile变量,第一处为函数声明,第二处为变量声明,第三、四、五、六处为文件操作,第七处和第八处我们 已经见过了,我们只需要把这八处改了就可以实现我们的目标了。如下:

EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, char* outdata)); // 由EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));改写 char * outdata;  /* target stream */ // 由 FILE * outfile;  /* target stream */改写

jdatadst.cpp文件第87行empty_output_buffer (j_compress_ptr cinfo)函数 memcpy(dest->outdata,dest->buffer,OUTPUT_BUF_SIZE);// 由JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE)改写

jdatadst.cpp文件第114行term_destination (j_compress_ptr cinfo) memcpy(dest->outdata,dest->buffer,datacount);      // 由JFWRITE(dest->outfile, dest->buffer, datacount)改写

删除fflush(dest->outfile);和if (ferror(dest->outfile))及相关的其它语句。 peg_stdio_dest (j_compress_ptr cinfo, char* outdata)    // 由peg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)改写 dest->outdata = outdata;                                // 由dest->outfile = outfile;改写

    我们改到这里,可以编译一下,应该不会有错误产生,但是,你会不会觉得有问题呢?对,我们发现,我们没有为内存区域提供偏移量(每次追加图像数据后,偏移量指向当前的位置), 另外,由于只有到压缩完才能知道图像压缩完后的数据量大小,我们还需要一个指示图像数据大小的变量。        我们将这两个变量添加到outdata后面,跟outdata一样,作为dest的成员变量,如下: typedef struct {   struct jpeg_destination_mgr pub; /* public fields */

  char * outdata;  /* target stream */   int  *pSize;   // 新加变量,该指针为调用者提供,压缩完后返回图像大小   int nOutOffset;   // 新加变量   JOCTET * buffer;  /* start of buffer */ } my_destination_mgr;

我们将通过jpeg_stdio_dest函数提供pSize指针,并在jpeg_stdio_dest的实现函数里对新添加的变量进行初始化,如下: GLOBAL(void) jpeg_stdio_dest (j_compress_ptr cinfo, char * outdata, int *pSize) {   my_dest_ptr dest;

  /* The destination object is made permanent so that multiple JPEG images    * can be written to the same file without re-executing jpeg_stdio_dest.    * This makes it dangerous to use this manager and a different destination    * manager serially with the same JPEG object, because their private object    * sizes may be different.  Caveat programmer.    */   if (cinfo->dest == NULL) { /* first time for this JPEG object? */     cinfo->dest = (struct jpeg_destination_mgr *)       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,       SIZEOF(my_destination_mgr));   }

  dest = (my_dest_ptr) cinfo->dest;   dest->pub.init_destination = init_destination;   dest->pub.empty_output_buffer = empty_output_buffer;   dest->pub.term_destination = term_destination; /* 修改过的代码 */   dest->outdata = outdata;   dest->nOutOffset = 0;   dest->pSize = pSize;   *(dest->pSize)= 0; }

改写声明函数 EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, char* outdata, int *pSize));

jdatadst.cpp文件第87行empty_output_buffer (j_compress_ptr cinfo)函数 memcpy(dest->outdata+dest->nOutOffset,dest->buffer,OUTPUT_BUF_SIZE);// 由JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE)改写 dest->nOutOffset+=OUTPUT_BUF_SIZE; *(dest->pSize)=dest->nOutOffset;

jdatadst.cpp文件第114行term_destination (j_compress_ptr cinfo) memcpy(dest->outdata+dest->nOutOffset,dest->buffer,datacount);      // 由JFWRITE(dest->outfile, dest->buffer, datacount)改写 dest->nOutOffset+=datacount; *(dest->pSize)=dest->nOutOffset;

重新编译工程,这样我们就实现了压缩bmp位图到内存中,当然,调用jpeg_stdio_dest之前,我们需要先分配足够的内存,并把内存指针传递给jpeg_stdio_dest函数, 好了,我们再分析libjpeg在解压缩jpg图像时,是怎样从jpg文件读入图像数据的。

我们先看我们在解压缩图像时调用的与文件操作有关的函数,如下: jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)。 在该函数的实现代码中找到了my_src_ptr结构,并且,我们发现与文件操作有关的该结构的成员变量为infile,参考上面内容,我们搜索infile,搜索结果如下: Find all "infile", Subfolders, Find Results 1, "Entire Solution"   E:/VS2005/libjpeg/libjpeg/jpeglib.h(911):EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));   E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(28):  FILE * infile;  /* source stream */   E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(95):  nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);   E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(182):jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)   E:/VS2005/libjpeg/libjpeg/jdatasrc.cpp(209):  src->infile = infile;   Matching lines: 5    Matching files: 2    Total files searched: 57

根据上面的经验,我们考虑,除了将FILE *类型变量改为char *类型的变量外,还要添加两个变量,图像大小的变量及图像偏移量,这跟图像压缩时差不多,所不同的是, 图像压缩时,图像大小是由libjpeg库返回,所以在调用是提供给libjpeg库的是个指针,而在解压缩时,图像数据大小是由调用者通过变量(不是指针)提供给libjpeg库。 由于我详细讲解了图像压缩时的我们所做的工作,我想读者朋友们很容易就能理解解压缩时所做的更改,下面我只列出我们所改写的代码,就不再详细讲解了。

jpeglib.h 第911行 EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, char * indata,int nSize));

jdatasrc.cpp 第33行 /* Expanded data source object for stdio input */

typedef struct {   struct jpeg_source_mgr pub; /* public fields */

  char * indata;  /* source stream */   int nInOffset;   int nSize;   JOCTET * buffer;  /* start of buffer */   boolean start_of_file; /* have we gotten any data yet? */ } my_source_mgr;

jdatasrc.cpp 第183行 GLOBAL(void) jpeg_stdio_src (j_decompress_ptr cinfo, char * indata, int nSize) {   my_src_ptr src;

  /* The source object and input buffer are made permanent so that a series    * of JPEG images can be read from the same file by calling jpeg_stdio_src    * only before the first one.  (If we discarded the buffer at the end of    * one image, we'd likely lose the start of the next one.)    * This makes it unsafe to use this manager and a different source    * manager serially with the same JPEG object.  Caveat programmer.    */   if (cinfo->src == NULL) { /* first time for this JPEG object? */     cinfo->src = (struct jpeg_source_mgr *)       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,       SIZEOF(my_source_mgr));     src = (my_src_ptr) cinfo->src;     src->buffer = (JOCTET *)       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,       INPUT_BUF_SIZE * SIZEOF(JOCTET));   }

  src = (my_src_ptr) cinfo->src;   src->pub.init_source = init_source;   src->pub.fill_input_buffer = fill_input_buffer;   src->pub.skip_input_data = skip_input_data;   src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */   src->pub.term_source = term_source;   src->indata = indata;   // 新添加行   src->nSize = nSize;   // 新添加   src->nInOffset = 0;   // 新添加   src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */   src->pub.next_input_byte = NULL; /* until buffer loaded */ }

jdatasrc.cpp 第91行 METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo) {   my_src_ptr src = (my_src_ptr) cinfo->src;   size_t nbytes;

  //nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);   nbytes = src->nSize-src->nInOffset;   if (nbytes>INPUT_BUF_SIZE) nbytes = INPUT_BUF_SIZE;

  if (nbytes <= 0) {     if (src->start_of_file) /* Treat empty input file as fatal error */       ERREXIT(cinfo, JERR_INPUT_EMPTY);     WARNMS(cinfo, JWRN_JPEG_EOF);     /* Insert a fake EOI marker */     src->buffer[0] = (JOCTET) 0xFF;     src->buffer[1] = (JOCTET) JPEG_EOI;     nbytes = 2;   }

  memcpy(src->buffer,src->indata+src->nInOffset,nbytes);   src->nInOffset+=nbytes;

  src->pub.next_input_byte = src->buffer;   src->pub.bytes_in_buffer = nbytes;   src->start_of_file = FALSE;

  return TRUE; }

至此,libjpeg库的源代码中所有要改的东西我们都已经完成,剩下的事情就是我们编写一段测试程序测试一下。

三、编写测试代码

    对于libjpeg库的详细的调用步骤,请参照我的文章《利用jpeglib压缩图像为jpg格式》,上面详细介绍了利用libjpeg库 进行图像压缩和解压缩的步骤,在编写本例的测试代码时,我们在上次提供的测试代码的基础上进行改进,如下:

    无论压缩还是解压缩,与原来的libjpeg库调用不同的地方都只有一处,就是jpeg_stdio_dest和jpeg_stdio_src这两个函数的调用, 调用原来的libjpeg库时,需要为这两个函数提供已经打开的jpg文件句柄,而对于新的libjpeg库,不需要打开jpg文件了,压缩时, 我们需要提供足够大的内存区给libjpeg 库,解压缩时,只需要把存放有jpeg格式图像的内存区提供给libjpeg库就行了,下面详细介绍 对于改写后的jpeg_stdio_dest和jpeg_stdio_src这两个函数的调用方法。

    1、jpeg_stdio_dest      函数的原形为:void jpeg_stdio_dest(j_compress_ptr cinfo, char * outData, int *pSize);      这里,outData指向我们提供给libjpeg库用于存放压缩后图像数据的内存区,这块内存要在我们调用该函数前申请好,大家可以看到, 我们在libjpeg库内没有对该内存区进行越界访问检查并且要足够大,否则会出现内存越界访问的危险,当整个图像压缩工作完成后,pSize 返回jpg图像数据的大小。测试代码如下:   char outdata[1000000]; // 用于缓存,这里设置为1000K,实际使用时可以采用动态申请的方式   int nSize; // 用于存放压缩完后图像数据的大小

                ..........                 jpeg_stdio_dest(&jcs, outdata,&nSize);                 ..........

    2、jpeg_stdio_src      函数的原形为:void jpeg_stdio_src(j_decompress_ptr cinfo, char * inData,int nSize);      这里,inData指向我们将要进行解压缩的jpg数据,该数据我们可以直接从jpg文件中读取,也可以是通过libjpeg库在内存中直接压缩 生成的数据,nSize 当然是这个jpg数据的大小。测试代码如下:  ..............         char indata[1000000]; // 用于存放解压缩前的图像数据,该数据直接从jpg文件读取         FILE *f = fopen(strSourceFileName,"rb");  if (f==NULL)  {   printf("Open file error!/n");   return;  }  int nSize = fread(outdata,1,1000000,f); // 读取jpg图像数据,nSize为实际读取的图像数据大小  fclose(f);  // 下面代码用于解压缩,从本行开始解压缩  jpeg_stdio_src(&cinfo, outdata,nSize);  .............

     至此我们所有的工作均已完成,完整的测试程序请从我的资源里下载,为增加兼容性,本测试程序特意加入字节调整功能,以解决部分读者 测试图像时出现的图像倾斜的问题,好了,编译并运行一下测试程序,看看效果吧,如果愿意继续交流,请给我发邮件:zhao3728@sina.com

zz:http://blog.chinaunix.net/u2/60941/showart_476046.html

嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示 在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们的Linux系统没有移植任何GUI系统,就要考虑以下方面:1. 将jpeg格式解压缩为位图格式,也就是jpeg解码.2. 将解码出来的位图格式输出到本地的LCD屏上. 在Linux系统下是通过写入帧缓 阅读详情

相关推荐

华为海思2026届数字IC秋招笔试高频考点解析与实战技巧(2025最新版)

本文深入解析华为海思2026届数字IC秋招笔试的高频考点与实战技巧,涵盖时序优化、低功耗设计、DFT规则等核心模块。针对2025年最新真题,提供详细的解题思路和工程经验,帮助考生高效备考。特别关注SystemVerilog约束随机测试等新增考点,助力考生在秋招笔试中脱颖而出。

m2n3o4p5的博客 414

libjpeg实践1:源码编译和MJPG转BMP测试:

libjpeg实践1:源码编译和MJPG转BMP测试:

816

ROG幻16Air新机避坑:Ubuntu 22.04下NVIDIA驱动、CUDA与Isaac Gym的兼容性实战

本文详细记录了在ROG幻16Air新机上安装Ubuntu 22.04,并成功配置NVIDIA驱动、CUDA与Isaac Gym强化学习开发环境的完整实战过程。针对官方文档未明确支持Ubuntu 22.04的挑战,文章提供了从驱动安装、CUDA版本选择、Python虚拟环境搭建到Isaac Gym兼容性调试的一站式解决方案,帮助开发者在新硬件上高效部署机器人仿真与训练平台。

weixin_28419039的博客 219

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

<br />Tag:linux技巧jpeg<br />版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明<br />http://rtfsc.blogbus.com/logs/23148378.html<br /> 相信使用过的朋友应该会喜欢上libjpeg,它简单易用、压缩质量可以随意控制、并且稳定性很好,但是,官方网站给提供的libjpeg库,<br />不论是进行压缩时还是解压缩时,都需要用到FILE,使得我们如果想在内存中直接压缩或解压缩图像还要自己实现相应的结构,<br />总之,

xw221的专栏 1249

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

利用PV操作控制进程的并发进行---经典题解

前趋图 先理清楚前趋图中的逻辑关系:P1没有前驱,P2的前驱是P1,P3的前驱是P1、P2,P4的前驱是P2,P5的前驱是P3、P4。 前驱就是指只有在前驱进程完成后,该进程才能开始执行。由图可知,这里进程之间有6条有向弧,分别表示为P1→P2,P1→P3,P2→P3,P2→P4,P3→P5,P4→P5, 各个进程间的逻辑关系,那么我们需要设定6个信号量(S1、S2、S3、S4、S5、S6),利用PV操作来控制这些过程。 对于第一个空,P1执行完成之后,需要通知P2、P3可以开始,此处需要V(S

Yan Ka Kue的博客 6136

使用libjpeg进行图片压缩

简介 由于工作原因,boss下达的任务就大概说了对图片进行压缩寻找比较合理的方式,还举了一个项目中的坑,就是系统原生的Bitmap.compress设置质量参数为100生成图片会变大的坑。所以我打算用一点时间研究研究Bitmap在内存和外存中的情况。首先需要对图片进行压缩,大家都知道图片是Android里面一个大坑,具体的问题有: OOM,一不留神就用OOM来冲冲喜,所以网上就有了很多解决oom问...

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 2754

手把手教你学Simulink--基于车联网与智能交通系统的场景实例:基于车联网(V2X)的实时路况信息共享与处理

《基于Simulink的车联网(V2X)实时路况共享系统仿真》摘要:本文详细介绍使用Simulink构建V2X智能交通系统的完整方法。系统包含交通路网建模、V2X通信实现(支持DSRC/C-V2X标准)、多源路况信息融合、动态路径规划等核心模块。通过对比实验,验证V2X可使平均车速提升52%,行程时间缩短34%,显著提升交通效率。文章还探讨了AI预测调度、车辆编队等高级应用,为智慧交通系统开发提供实用参考。所需工具包括Simulink、SimEvents及无线通信工具箱等。

MHD0815的博客 737

libjpeg库解析

linux提供了jpeglib库用于MJPEG图像的压缩与解压缩等,编写V4L2应用程序,编译的时候加上选项-ljpeg表示使用jpeg库中的API函数关于jpeg库API使用的说明在网站:http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/toclibjpeg.htmljpegl

Webster_WXH的博客 793

当AI学会写“自传”:OpenClaw 的 SOUL.md 如何把配置文件变成一颗会变形的心

SOUL.md。

步子哥的博客 1308

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 217

libjpeg实现内存内位图的压缩及解压缩

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

Jingle的专栏 7115

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1232

不修改libjpeg库同样实现内存内位图的压缩及解压缩

    前几天转载了 libjpeg实现内存内位图的压缩及解压缩 文章,通过实践和思考,我用类似的方法实现内存内位图的压缩及解压缩,但不需要修改libjpeg的原代码库。    其实使用libjpeg库时,通过抄袭改写库内jdatasrc.c和jdatadst.c两个文件,加入到自己的项目代码中就可以实现输入数据和输出数据的重定向。    基本使用上和调用libjpeg原库有如下区别:

Jingle的专栏 7474

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【转】libjpeg实现内存位图的压缩及解压缩-显示格式有问题

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

weixin_30697239的博客 132

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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. ...

拔剑—浆糊的传说 123

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.     Cu

zxg519的专栏 989

内存jpeg文件读取程序

内存jpeg读取代码

mipmap的专栏 973

图像解码之一——使用libjpeg解码jpeg图片

原文地址::http://blog.youkuaiyun.com/missingu1314/article/details/8523179 相关网帖 1、JPEG压缩数据格式----http://blog.youkuaiyun.com/missingu1314/article/details/8544143 多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中。本系列文章将会介绍

xqhrs232的专栏 1754

jpeglib使用指南

您可以到www.ijg.org网站下载libjpeg的源码, IJG JPEG Library就是jpeg压缩库,是以源码的形式提供给软件开发人员的,当然在软件包里也有编译好的库文件,我们这里就只用到其中的libjpeg.lib,jconfig.h,jmorecfg.h,jpeglib.h这几个文件,下面我就介绍一下怎样在自己的程序里嵌入图像压缩功能。   一、建立编译环境   所谓建立编译环...

helpbs 140
上一篇: linux jpeg视频传输四部曲之四
下一篇: libJPEG调用程序
floatdu
博客等级 码龄19年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值