LibJpeg作为常用开源库,已有很多相关介绍。

其中值得一提的是,早先的版本里没有对内存中的Jpeg图像编解码的接口,而是使用Jpeg_stdio_src和jpeg_stdio_dest,这两个都是直接针对File类对象操作,跳过了内存中图像的这一步。有些文章介绍过如何在LibJpeg中添加针对内存图像的解码接口,但是没有人添加过内存图像的编码接口。我直接把原有的jpeg_stdio_dest覆盖成对内存中RGB图像的编码接口,输出为内存中的jpeg图像。

头文件和静态库已上传到CSDN资源库中,源码也已经上传,(添加对内存中Jpeg图像编解码接口的LibJpeg)可以自行编译使用。

不过后来的turbo libjpeg将此问题解决了(上面上传的代码价值也就不大了),我没有去看是不是新版本的LibJpeg也已经完善了这个问题。

turbo libjpeg的价值是利用SIMD指令集,加速了编解码过程。官网上的介绍中提到某个案例中从原来的0.3左右降低到0.1,时间只有原来的1/3,在我的工程中,时间减少到原来LibJpeg的一半左右。而它的使用与之前的LibJpeg完全相同,只是添加完善了部分功能,完全可以直接替换,使用很方便。

下面的代码既是使用LibJpeg做编解码的方法,也是Turbo LibJpeg的使用方法(区别仅仅在于jpeg_mem_src和jpeg_mem_dst的使用):

值得注意的是,解码的时候空间是由内部分配的,因为这样能够准确分配内存空间,而不会造成浪费;

但是编码的时候空间需要由外部分配,因为准确的编码后的空间大小不能获知,当然完全可以分配一段和编码前一样大小的空间,这肯定是足够的了,并且也不会造成太大的空间浪费。

turbo libjpeg可以在官网上去下载,目前的最新版本是1.3.1.

typedef unsigned char BYTE;
bool ReadJPEG( /*IN*/BYTE *src, int srcLen, /*OUT*/BYTE **_dst, int *dstLen, int *width, int *height, int *depth )
{// 【注意】dst空间由内部分配//定义JPEG文件的解压信息struct jpeg_decompress_struct cinfo;//定义JPEG文件的错误信息struct jpeg_error_mgr jerr;cinfo.err=jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);jpeg_mem_src(&cinfo,src,srcLen);jpeg_read_header(&cinfo,TRUE);jpeg_start_decompress(&cinfo);(*width) = cinfo.output_width;(*height) = cinfo.output_height;(*depth) = cinfo.num_components;(*dstLen) = (*width)*(*height)*(*depth);BYTE *dst = new BYTE[*dstLen];JSAMPROW row_pointer[1];while (cinfo.output_scanline<cinfo.output_height){row_pointer[0] = &dst[cinfo.output_scanline*cinfo.image_width*cinfo.num_components];jpeg_read_scanlines(&cinfo,row_pointer,1);}jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);*_dst = dst;return true;
}bool WriteJPEG(/*IN*/BYTE *src, int width, int height, int depth, /*OUT*/BYTE **dst, int *dstLen)
{// 【注意】dst空间由外部分配,确保空间足够unsigned long act_len = 0;struct jpeg_compress_struct jcs;struct jpeg_error_mgr jem;jcs.err = jpeg_std_error(&jem);jpeg_create_compress(&jcs);jpeg_mem_dest(&jcs, dst, &act_len);jcs.image_width = width;jcs.image_height = height;jcs.input_components = depth;jcs.in_color_space = JCS_RGB;jpeg_set_defaults(&jcs);jpeg_set_quality(&jcs,80,true);jcs.jpeg_color_space = JCS_YCbCr;jcs.comp_info[0].h_samp_factor = 2;jcs.comp_info[0].v_samp_factor = 2;jpeg_start_compress(&jcs,TRUE);JSAMPROW row_pointer[1];int row_stride = jcs.image_width*jcs.num_components;while (jcs.next_scanline<jcs.image_height){row_pointer[0] =  &src[jcs.next_scanline*row_stride];jpeg_write_scanlines(&jcs,row_pointer,1);}jpeg_finish_compress(&jcs);jpeg_destroy_compress(&jcs);*dstLen = act_len;return true;
}

libjpeg与turbo libjpeg的使用相关推荐

  1. android 编译 libjpeg,Android 编译libjpeg

    之前需要将yuv转换为jpg图像,查看网上说libjpeg-turbo比libjpeg快2-3倍,但是在Android手机上实践了一下,需要40-60个ms,这个虽然比以前的300ms好多了,但是还是 ...

  2. php /usr/lib/libjpeg.so.62,linux PHP的装配

    linux PHP的安装 2. 红帽Linux PHP 2.1. 安装linux PHP 查看系统是否自带了php,若自带先卸载,否则安装后会出错. (1)下载php源文件php-5.3.6.tar. ...

  3. android cmake 打印_Android使用CMAKE编译libjpeg

    本文主要介绍使用 CMAKE 编译 libjpeg-turbo 类库,本文相关代码请在GitHub-TurboJpegSample 查看. libjpeg-turbo 附GitHub 地址,libjp ...

  4. libjpeg在windows下的编译

    以前搞图片在LCD屏上显示的时候,曾经在Linux下编译过libjpeg,现在再次编译,不过换了平台而已.本文使用的编译器为VS2003,编译的libjpeg为最新版本,即jpeg-8c. 编译步骤: ...

  5. Android直播开发之旅(15):libjpeg库的编译移植与使用

    1. libjpeg介绍  libJPEG库是一款功能强大的JPEG图像处理开源库,它支持将图像数据压缩编码为JPEG格式和对原有的JPEG图像解压缩,Android系统底层处理图片压缩就是用得lib ...

  6. Android压缩图片和libjpeg库

    前言 Fjpeg使用 Fjpeg 注意 如何使用 如何压缩图片只改变在硬盘的存储大小 如何改变图片分辨率让其Bitmap对象可以加载到内存中 关于重载版本 开始学习之旅 补充知识的结论 修改图片分辨率 ...

  7. libjpeg库的用法

    libjpeg用法 博客分类: Linux C编程 C语言编程 Linux 转自: 点击打开链接 libjpeg库简介 libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码.JPE ...

  8. libjpeg库移植与使用

    一.移植libjpeg库 库源码:http://www.ijg.org/files/ 这里下载的是jpegsrc.v9b.tar.gz,点击该文件即可下载.然后拷贝到虚拟机上. 解压命令: tar - ...

  9. 8、数码相框之libjpeg的使用

    文章目录 1.2440显示图片介绍 2.把图片显示在LCD上 3.libjpeg的使用介绍 4.编写程序 4.1.分配和初始化一个decompression结构体 4.2.指定源文件 4.3.用jpe ...

最新文章

  1. jQuery学习笔记一
  2. 为什么 SQL 语句不要过多的 join?
  3. ubuntu12.04升级php5.4至。。5.5
  4. oracle索引优劣,ORACLE的五种表的优缺点概述
  5. c++重载运算符_Python 运算符重载
  6. [SVN(ubuntu)] ubuntu使用svn
  7. 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
  8. char与varchar区别(MYISAM)
  9. 长城汽车申请“哈弗单身狗”、“哈弗奶狗”、“哈弗溜狗”等商标
  10. 预充电电路工作原理_变频冰箱开关电源电路工作原理及检修思路
  11. HDFS-HA的配置-----自动Failover
  12. linux 复制文件到另一个目录命令_每天一条Linux命令(21) scp (远程文件复制)
  13. SSH dao层异常 org.hibernate.HibernateException: No Session found for current thread
  14. 2020年面向前端开发人员的10个很棒的 JS 库
  15. 【OpenGL】斯坦福兔子、显示列表
  16. loss、val_loss与accuracy、val_accuracy含义
  17. 哪有什么太迟,世界多的是大器晚成
  18. 在字节跳动干软件测试5年,2月无情被辞,想给划水的兄弟提个醒
  19. 【音视频相关】nvidia-smi 命令扩展及问题分析举例(dmon/pmon/GPU性能相关)
  20. win10:Python3.7安装PyQt4

热门文章

  1. 计算机毕业设计(附源码)python语言学习系统
  2. 2020年9月23日 晴(补2020年9月22日 晴)
  3. 编译期注解之JavaPoet
  4. ios系统下input边框有默认阴影
  5. Java课程设计-图书借阅管理系统
  6. 计算机安全属性中可用性是,计算机安全的基本概念试题解析
  7. 传统安防监控摄像头Onvif云台控制直播流如何转换成GB/T28181对接到国标视频平台公安内网
  8. word SMARTart学习笔记
  9. 前端HTML上传图片传BASE64数据,图片太大进行压缩
  10. 逻辑覆盖测试用例设计