libjpeg与turbo libjpeg的使用
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的使用相关推荐
- android 编译 libjpeg,Android 编译libjpeg
之前需要将yuv转换为jpg图像,查看网上说libjpeg-turbo比libjpeg快2-3倍,但是在Android手机上实践了一下,需要40-60个ms,这个虽然比以前的300ms好多了,但是还是 ...
- 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. ...
- android cmake 打印_Android使用CMAKE编译libjpeg
本文主要介绍使用 CMAKE 编译 libjpeg-turbo 类库,本文相关代码请在GitHub-TurboJpegSample 查看. libjpeg-turbo 附GitHub 地址,libjp ...
- libjpeg在windows下的编译
以前搞图片在LCD屏上显示的时候,曾经在Linux下编译过libjpeg,现在再次编译,不过换了平台而已.本文使用的编译器为VS2003,编译的libjpeg为最新版本,即jpeg-8c. 编译步骤: ...
- Android直播开发之旅(15):libjpeg库的编译移植与使用
1. libjpeg介绍 libJPEG库是一款功能强大的JPEG图像处理开源库,它支持将图像数据压缩编码为JPEG格式和对原有的JPEG图像解压缩,Android系统底层处理图片压缩就是用得lib ...
- Android压缩图片和libjpeg库
前言 Fjpeg使用 Fjpeg 注意 如何使用 如何压缩图片只改变在硬盘的存储大小 如何改变图片分辨率让其Bitmap对象可以加载到内存中 关于重载版本 开始学习之旅 补充知识的结论 修改图片分辨率 ...
- libjpeg库的用法
libjpeg用法 博客分类: Linux C编程 C语言编程 Linux 转自: 点击打开链接 libjpeg库简介 libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码.JPE ...
- libjpeg库移植与使用
一.移植libjpeg库 库源码:http://www.ijg.org/files/ 这里下载的是jpegsrc.v9b.tar.gz,点击该文件即可下载.然后拷贝到虚拟机上. 解压命令: tar - ...
- 8、数码相框之libjpeg的使用
文章目录 1.2440显示图片介绍 2.把图片显示在LCD上 3.libjpeg的使用介绍 4.编写程序 4.1.分配和初始化一个decompression结构体 4.2.指定源文件 4.3.用jpe ...
最新文章
- jQuery学习笔记一
- 为什么 SQL 语句不要过多的 join?
- ubuntu12.04升级php5.4至。。5.5
- oracle索引优劣,ORACLE的五种表的优缺点概述
- c++重载运算符_Python 运算符重载
- [SVN(ubuntu)] ubuntu使用svn
- 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
- char与varchar区别(MYISAM)
- 长城汽车申请“哈弗单身狗”、“哈弗奶狗”、“哈弗溜狗”等商标
- 预充电电路工作原理_变频冰箱开关电源电路工作原理及检修思路
- HDFS-HA的配置-----自动Failover
- linux 复制文件到另一个目录命令_每天一条Linux命令(21) scp (远程文件复制)
- SSH dao层异常 org.hibernate.HibernateException: No Session found for current thread
- 2020年面向前端开发人员的10个很棒的 JS 库
- 【OpenGL】斯坦福兔子、显示列表
- loss、val_loss与accuracy、val_accuracy含义
- 哪有什么太迟,世界多的是大器晚成
- 在字节跳动干软件测试5年,2月无情被辞,想给划水的兄弟提个醒
- 【音视频相关】nvidia-smi 命令扩展及问题分析举例(dmon/pmon/GPU性能相关)
- win10:Python3.7安装PyQt4