libjpeg解码 jpeg文件

简介: libjpeg解码 jpeg文件

一、解压 libjpeg-turbo-1.2.1.tar.gz 库


libjpeg-turbo-1.2.1.tar.gz库是以 .tar.gz 结尾的文件。


解压到当前文件:

tar -zxvf 压缩文件名.tar.gz


二、Libjpeg 的使用介绍


1. struct jpeg_decompress_struct 结构体:

用于定义一个结构体变量 cinfo 。该变量保存着 jpeg 数据的详细信息,也保存着输出数据的详细信息。


/* 解压缩对象 */
struct jpeg_decompress_struct cinfo;

1

2

2. struct jpeg_error_mgr 结构体:

该结构体定义的变量,用于处理 libjpeg 库解码 jpeg 数据时的错误处理。


/* 用于错误处理的结构体对象 */

struct jpeg_error_mgr jerr;

1

2

3.设置错误处理函数:

用 libjpeg 库解码 jpeg 数据时,可能出现内存不足导致错误,可以 调用默认错误处理函数继而会调用exit 函数结束整个进程。


当然,我们也可以使用 libjpeg 提供的接口注册自定义错误处理函数。



/* 将错误处理结构对象绑定在JPEG对象上 */
    cinfo.err = jpeg_std_error(&jerr);
  //设置自定义错误处理函数 
  jerr.error_exit = my_error_exit;
  void my_error_exit(struct jpeg_decompress_struct *cinfo)
  {
     /* ... */
  }



4.初始化解码对象(cinfo结构):

jpeg_create_decompress(&cinfo);
1

5.指定解压源文件:

FILE * infile;
  /* 打开jpg 图像文件,argv[1] 是jpeg图片名 */
  if ((infile = fopen(argv[1], "rb")) == NULL) 
  {
  return -1;
  }
  /* 指定源文件 */
  jpeg_stdio_src(&cinfo, infile);


6. 获取文件信息:

/* 获得jpg信息 */
  jpeg_read_header(&cinfo, TRUE);
1
2

7.设置解压参数:

在开始解压缩之前可以进行解压缩参数的设定,也就是为cinfo结构的成员赋值。我们需要使用 cinfo.scale_num , cinfo.scale_denom 这两个参数,来确定缩小比例。

可以设置 解压出来的图像的大小 与 原图 的比例,


例如:

cinfo. scale_num = 1;
cinfo. scale_denom = 2;

则解压出来的图片是原图的 1/2.


PEG 当前仅支持 1/1、 1/2、 1/4、 和 1/8 这几种缩小比例。 默认是 1/1,就是保持原图大小。


8.开始解压:

jpeg_start_decompress(&cinfo);


1

2

9.读取数据:

解码后的数据是 按行 取出的。数据像素按照scanline来存储,scanline 是从左到右,从上到下的顺序,每个像素对应的各颜色或灰度通道数据是依次存储。一个 scanline 中的数据存储模式是R,G,B,R,G,B,R,G,B**,…。


因为是 按行 读取数据,所以要 计算 每行数据 的空间大小。我们定义一个缓冲区发 buffer 来存放数据。


(1) 计算 每行数据 的空间大小:

cinfo. output_components 为每个像素字节大小
cinfo. output_width 输出图像的宽度。
.
  unsigned char *buffer;
  int row_stride;
  // 一行的数据的空间大小
  row_stride = cinfo.output_width * cinfo.output_components;
  buffer = malloc(row_stride);



(2) 调用 jpeg_read_scanlines()来读取数据

jpeg_read_scanlines()可以指定一次读多少行,但是目前该函数还只能支持一次只读 1 行.
  // 循环调用jpeg_read_scanlines来一行一行地获得解压的数据
  while (cinfo.output_scanline < cinfo.output_height) 
  {
  (void) jpeg_read_scanlines(&cinfo, &buffer, 1);
  }


10.解压缩完毕

free(buffer); //释放 malloc 申请的空间
jpeg_finish_decompress(&cinfo);

1

2

3

11.释放解码对象:

jpeg_destroy_decompress(&cinfo);
fclose(infile); //关闭 jpg 图像文件

1

2

总结

libjpeg解码 jpeg文件 主要就是依靠上面几步。大家可以自己试试。


效果展示:

实验效果录制在 B站 :(有兴趣的可以看看实验效果)

https://www.bilibili.com/video/BV1zG4y1A7bT/?vd_source=986c364d205fa1124b337bc665f57c4f


相关文章
|
7月前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(三)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
225 0
|
7月前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(二)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
254 0
|
2月前
|
存储 C++ 内存技术
解码mp4文件分别存储为pcm,yuv文件
使用FFmpeg库在C++中解码MP4文件,并将音频数据存储为PCM格式,视频数据存储为YUV格式。
32 3
解码mp4文件分别存储为pcm,yuv文件
|
7月前
|
存储 缓存 编解码
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(一)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
227 0
|
7月前
gstreamer的I420转jpeg格式数据产生耗时
gstreamer的I420转jpeg格式数据产生耗时
|
7月前
gstreamer将RTSP转jpg图片保存
gstreamer将RTSP转jpg图片保存
260 0
|
编解码 C#
使用ffmpeg将裸码文件转成wav文件
使用ffmpeg将裸码文件转成wav文件
使用ffmpeg将裸码文件转成wav文件
使用jpeglib直接把NV12转为jpeg文件的代码
使用jpeglib直接把NV12转为jpeg文件的代码
151 0
|
Ubuntu 计算机视觉
ffmpeg实现将图片转换为视频
##名称:ffmpeg实现将图片转换为视频 ##平台:ubuntu(已经安装好了ffmpeg工具) ##日期:2017年12月10日 简介: 因为学习需要,需要将连续图片转换成视频,昨天和今天早上用opencv实现了, 但是对于视频的处理用ffmpeg工具,更为强大。
2674 0
|
编解码 C++ Windows
利用 LibWebP-NET 解码与编码 WebP 格式图片
原文:利用 LibWebP-NET 解码与编码 WebP 格式图片 WebP 格式是谷歌开发并发展的一种最新的网络图片格式,具有压缩率高、解码快、免版权、开源等优点。 大部分先进的网页浏览器、图片浏览器都支持该格式,Windows用户可以通过安装 WebP Codec for Windows 在系统中查阅WebP图片。
2712 0