libjpeg这个库主要用于处理jpeg数据,比如将RGB压缩成JPEG,或者将JPEG解压为RGB。其实早在4年前已经接触过,但一直没写过这方面的文章。后来想想还是有必要写出来,至少可以证明自己搞过这东西。

libjpeg使用十分简单,而且源码带有例子程序,下面的代码基本上就是该例子。所以没什么技术含量。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include <math.h>
#include <sys/time.h>
#include <time.h>// jpeg库头文件必须放到stdio.h后面
#include "libjpeg/include/jpeglib.h"
#include "libjpeg/include/jerror.h"typedef struct my_error_mgr * my_error_ptr;void my_error_exit (j_common_ptr cinfo)
{my_error_ptr myerr = (my_error_ptr) cinfo->err;(*cinfo->err->output_message) (cinfo);longjmp(myerr->setjmp_buffer, 1);
}// 读取JPG图片数据,并解压到内存中,*rgb_buffer需要自行释放
int read_jpeg_file(const char* jpeg_file, unsigned char** rgb_buffer, int* size, int* width, int* height)
{struct jpeg_decompress_struct cinfo;struct my_error_mgr jerr;FILE* fp;JSAMPARRAY buffer;int row_stride = 0;unsigned char* tmp_buffer = NULL;int rgb_size;fp = fopen(jpeg_file, "rb");if (fp == NULL){printf("open file %s failed.\n", jpeg_file);return -1;}cinfo.err = jpeg_std_error(&jerr.pub);jerr.pub.error_exit = my_error_exit;if (setjmp(jerr.setjmp_buffer)){jpeg_destroy_decompress(&cinfo);fclose(fp);return -1;}jpeg_create_decompress(&cinfo);jpeg_stdio_src(&cinfo, fp);jpeg_read_header(&cinfo, TRUE);//cinfo.out_color_space = JCS_RGB; //JCS_YCbCr;  // 设置输出格式jpeg_start_decompress(&cinfo);row_stride = cinfo.output_width * cinfo.output_components;*width = cinfo.output_width;*height = cinfo.output_height;rgb_size = row_stride * cinfo.output_height; // 总大小*size = rgb_size;buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);*rgb_buffer = (unsigned char *)malloc(sizeof(char) * rgb_size);    // 分配总内存printf("debug--:\nrgb_size: %d, size: %d w: %d h: %d row_stride: %d \n", rgb_size,cinfo.image_width*cinfo.image_height*3,cinfo.image_width, cinfo.image_height,row_stride);tmp_buffer = *rgb_buffer;while (cinfo.output_scanline < cinfo.output_height) // 解压每一行{jpeg_read_scanlines(&cinfo, buffer, 1);// 复制到内存memcpy(tmp_buffer, buffer[0], row_stride);tmp_buffer += row_stride;}jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);fclose(fp);return 0;
}int write_jpeg_file(const char* jpeg_file, unsigned char* rgb_buffer, int width, int height, int quality)
{struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;int row_stride = 0;FILE* fp = NULL;JSAMPROW row_pointer[1];cinfo.err = jpeg_std_error(&jerr);jpeg_create_compress(&cinfo);fp = fopen(jpeg_file, "wb");if (fp == NULL){printf("open file %s failed.\n", jpeg_file);return -1;}jpeg_stdio_dest(&cinfo, fp);cinfo.image_width = width;cinfo.image_height = height;cinfo.input_components = 3;cinfo.in_color_space = JCS_RGB;jpeg_set_defaults(&cinfo);jpeg_set_quality(&cinfo, quality, 1);  // todo 1 == truejpeg_start_compress(&cinfo, TRUE);row_stride = width * cinfo.input_components;while (cinfo.next_scanline < cinfo.image_height){row_pointer[0] = &rgb_buffer[cinfo.next_scanline * row_stride];jpeg_write_scanlines(&cinfo, row_pointer, 1);}jpeg_finish_compress(&cinfo);jpeg_destroy_compress(&cinfo);fclose(fp);return 0;
}

实际上我是使用保存为bmp格式图片的方式进行测试的,bmp图片是RGB分量实际上应该是BGR,所以如果要正确保存bmp,则要进行R、B分量互换,在解压时,libjpeg可以设置输出颜色,使用cinfo.out_color_space,如果不想自己调换R、B,则将其赋值为JCS_EXT_BGR。另外,bmp文件头信息中的高值为负数,否则保存的图片是上下颠倒的。

李迟 2015.6.30 晚饭后



libjpeg学习1:简单使用示例相关推荐

  1. 示例及详解:MATLAB多机器人协同编队训练与学习的简单实现

    作者在读学校Singapore University of Technology and Design Established under strong support from MIT, Singa ...

  2. WCF入门(一)——简单的示例

    这篇随笔写了一段时间了,当时没有发布,今天整理文档的时候发现了,顺便给配了些图.主要是绍了一下WCF编程模型,并给了一个简单的示例. 概述 WCF框架是下一代.NET平台通信应用程序的核心.它包含了W ...

  3. 机器学习简单代码示例

    机器学习简单代码示例 //在gcc-4.7.2下编译通过. //命令行:g++ -Wall -ansi -O2 test.cpp -o test #include <iostream> u ...

  4. Python 程序示例 - 初学者的简单代码示例

    马克吐温说过,出人头地的秘诀就是开始.编程对于初学者来说似乎令人望而生畏,但最好的入门方式是直接投入并开始编写代码. 简单的代码示例是初学者入门和学习编程基础知识的好方法.在本文中,我将提供一系列非常 ...

  5. openlayers摸爬滚打 3.图层layer和feature的学习和简单例子

    使用openlayers创建地图使用new ol.Map({...}); 其中有参数layers:地图图层,openlayers允许有多个图层,且可重叠在一起,上面的图层覆盖下面的图层,具体的laye ...

  6. maple-example简单操作示例

    好久都没写博客了,今天学习到一点新知识,在这里小编和大家分享,欢迎大家指点,这篇文章是关于 maple-example的简单操作示例,具体软件下载不做讲解,谢谢!

  7. 有python基础学习java简单吗_【Python】Java程序员学习Python(三)— 基础入门

    一闪一闪亮晶晶,满天都是小星星,挂在天上放光明,好像许多小眼睛.不要问我为什么喜欢这首歌,我不会告诉你是因为有人用口琴吹给我听. 一.Python学习文档与资料 一般来说文档的资料总是最权威,最全面的 ...

  8. 【FastDDS学习笔记】HelloWorld示例程序编译和运行

    目录 第一章:[FastDDS学习笔记]Ubuntu22上安装fastDDS环境 第二章:[FastDDS学习笔记]HelloWorld示例程序编译和运行 第三章:[FastDDS学习笔记]Fast- ...

  9. BizTalk 2006 简单入门示例程序(附源项目文件下载)

    BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...

最新文章

  1. 怎么用php制作会员注册表单,帝国CMS前台会员登陆表单的制作教程
  2. SpringBoot使用LibreOffice转换PDF
  3. kafka学习汇总系列(一)kafka概述
  4. 如何用linux登入数据库,Linux中MySQL数据库的使用①-----登录、数据库操作、表结构操作...
  5. javaWEB总结(9):自定义HttpServlet
  6. 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
  7. 探索比特币源码7-哈希
  8. 安卓手机电子书阅读器的使用体验及对比
  9. 如何用PPT来实现三维3D效果,附参数设置详解
  10. c语言编程 排序,C语言编程-9_3 排序
  11. (转)淘淘商城系列——内容管理
  12. 【推荐实践】“全能选手”召回表征算法实践.pdf(附下载链接)
  13. 关于使用TestDriven.Net 2.0的一点补充
  14. 移动设备数据丢失恢复办法
  15. 基于STM32制作万能遥控器---2
  16. 华为网络拒绝接入_为何华为手机网络拒绝接入
  17. 松下伺服电机uvw接线图_伺服电机接线图图解
  18. pig java api_pig CheckToken过程讲解
  19. 收集LOGO生成网站(持续更新)
  20. python-->with-上下文管理器

热门文章

  1. 马斯克又又又套现了:120亿美元到手
  2. 微博正式登陆港交所挂牌上市:开盘破发 较发行价跌6.1%
  3. 小米12能效有望显著提升:骁龙8 Gen1功不可没
  4. 三星Galaxy M52 5G通过认证:两个版本 搭载骁龙778G芯片
  5. 由于两家重要零件厂商的疫情,iPhone 13备货可能受影响
  6. 联发科发布天玑5G开放架构 采用该定制芯片终端7月上市
  7. 创下新的纪录 京东618累计下单金额超3438亿元
  8. 定档6月11日 诺基亚手机新品发布亮点抢先看
  9. 苹果iOS 15正式发布!一大波新功能上线,这几个被刷爆了
  10. 英伟达宣布与GSK AI实验室达成合作,研发药物和疫苗