由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考。

了解的人知道其价值所在,不知道的人就弃之如废物吧。

  本篇是JPEG解码系列的第一篇——JPEG文件格式概览。

1. 图片文件的数据是什么?

  这是一幅人眼可视的图片

  

  这是其对应的二进制数据:(由于二进制数据量浩如烟海,只截取头部的一些数据,使用的工具是WinHex)

  

 2. 为什么需要文件格式来表达图像?

  这就凸显了规范的重要性,使用同一套标准,各厂商都按照这个标准进行文件格式封装,那么你拿到别人的照片后就知道

了如何进行(文件格式)解析和(jpeg)解码了。

  这也好理解,不同国家不同语言的人们如何交流?使用通用的标准——英语。

  jpeg文件格式也自有其标准,文件格式标准参考电联的JFIF,编解码标准参考电联的ITU-T81。

3. 标准文档太长,没耐心读下去,怎么办?

  标准规范的页码都是很长的,用于照顾到各个角落和细节。

  但是,各个厂商实现时,肯定不会实现规范的全部内容,只需满足标准中最重要的一部分即可。

4. jpeg二进制数据解读

  一般情况下,是按照这个顺序排列的:

TAG类型 数值 名称 其他备注
SOI 0xFFD8 Start of Image 必带
APP0 0xFFE0 application0 必带
APPn 0xFFEn applicationn 可选带(APP1一般为Exif信息)
DQT 0xFFDB Define Quantization Table 必带
SOF 0xFFC0 Start of Frame 必带
DHT 0xFFC4 Define Huffman Table 必带
SOS 0xFFDA Start of Scan 必带
compres data 。。。 。。。 必带
EOI 0xFFD9 End of Image 必带

  如下为标注各种类型TAG,其中EOI在文件末尾未贴出来:

  

5. 关于各TAG的一些说明

  5.1) 文件名末尾.jpg不代表真的是一个jpeg图片,因为你可以随意更改一个文件的后缀名。

  5.2)JPEG文件必须以0xFF DB开头和以0xFF D9结尾。

  5.3)DQT为量化表,该类型表有两个表,一个表示Y分量的量化表,另外一个为UV分量共用的量化表。

    其中,TAG后面的0x 00 43表示这个TAG组中除去TAG两个字节外,共有多少个字节组成,后面的0x00为第几张表。

    量化表为DCT变换系数,由于是8x8的二维DCT变换,故系数个数为64,这也即是:0x43 - 3 = 0x40 = 64。

  5.4)SOF为帧图像开始,记录了采样精度、图形宽/高、分量个数、水平/垂直采样因子、量化表号等信息。

  例如,摘抄下SOF下的这几个字节:0x00 11 08 02 D0 03 E0 03 01 22 00 02 11 01 03 11 01

   其中,0x00 11代表SOF下共有17字节;

       0x08代表采样精度,几乎都是用8位进行采样精度,即一个像素点可以有2^8=256级过渡;

       0x02 D0代表图像高,即0x02d0=720像素高;

       0x03 E0代表图像宽,即0x03E0=992像素宽;

       0x03代表分量表数,为3,分别代表Y、U和V的表;

       0x01 22 00中第一个字节01代表量化表序号(从1开始),第二个22代表水平/垂直采样因子(高四位为水平采样因子,第四位为垂直采样因子),第三个00代表量化表id=0;

       0x02 11 01中第一个字节01代表量化表序号为2,第二个11代表水平/垂直采样因子都为1,第三个00代表量化表id=1;

       0x03 11 01中第一个字节01代表量化表序号为3,第二个11代表水平/垂直采样因子都为1,第三个00代表量化表id=2;

    需要补充说明一下,采样因子和量化表的问题。

    采样因子:该图象的Y分量的宽/高采样因子都为2,而UV分量的采样因子都为1,则在同一个方向上(水平或垂直方向),Y分量采样点是UV分量采样点的2倍,

         如果图像Y分量宽高分别W和H,那么U和V分量只采样了W/2和H/2个点,这也代表原始图象的size=1.5*W*H。

         有些图像的第一张表可能是2和1或1和2,再或都是1,但是第二和第三张表的采样因子都是1。

    量化表:Y分量使用一张量化表,UV分量使用另外一张表,因为DQT中一般就两张表。

  5.5)DHT为霍夫曼表,由四个表组成,分表代表:

    [0][0]——直流霍夫曼表0,Y分量直流部分解码时使用

    [0][1]——直流霍夫曼表0,UV分量直流部分解码时使用

    [1][0]——交流霍夫曼表0,Y分量交流部分解码时使用

    [1][1]——交流霍夫曼表1,UV分量交流部分解码时使用

  5.6)SOS为扫描开始,其代表霍夫曼表关系进行映射。

  5.7)SOS后面就为真正的编码数据,这是数据的大头,相比于此,文件头的size其实是非常之少。

  5.8)EOI为图像结束的标志,图像必须以此结束。

JPEG解码--(1)JPEG文件格式概览的更多相关文章

  1. JPEG解码——(3)文件头解析

    与具体的编码数据空间相比,jpeg文件头占据非常小乃至可以忽略不计的大小. 仍然拿JPEG解码--(1)JPEG文件格式概览中的<animal park>这张图片来举例,从跳过SOS(FF ...

  2. ijg库解码超大型jpeg图片

    1. ijg库解码超大型jpeg图片(>100M)的时候,如何避免内存溢出. 采用边解码边压缩的策略,每次解码一行或者若干行图片数据,然后对于这些解码的数据,进行DQT(量化处理,过滤掉高频的数 ...

  3. The Independent JPEG Group's JPEG software Android源码中 JPEG的ReadMe文件

    The Independent JPEG Group's JPEG software========================================== README for rele ...

  4. jpeg解码库使用实例

    jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpe ...

  5. JPEG解码——(6)IDCT逆离散余弦变换

    本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来的一个步骤--逆离散余弦变换,即逆零偏置前的一个步骤. 该步骤比较偏理论,其业务是对IZigZag变换后的数据,再进一步的处理,使其恢复DC ...

  6. JPEG解码——(4)霍夫曼解码

    本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容. 承接上篇,文件头解析完毕后,就进入了编码数据区域,即SOS的tag后的区域,也是图片数据量的大头所在. 1. 解码过程规则描述 a)从此颜色分量单元 ...

  7. JPEG解码——(5)反量化和逆ZigZag变换

    本篇是该系列的第五篇,承接上篇huffman解码,介绍接下来的两个步骤--反量化和逆zigzag变换,即IDCT前的两个步骤. 需要说明的是,这两个步骤可以颠倒,本人的实现是,先反量化,再逆ZigZa ...

  8. 渐进式 JPEG (Progressive JPEG)来提升用户体验

    1.概述 jpg格式分为:Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不同. Base ...

  9. 【STM32H7教程】第58章 STM32H7的硬件JPEG应用之图片解码显示

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第58章       STM32H7的硬件JPEG应用之图片解 ...

随机推荐

  1. STL——容器(Map & multimap)的删除

    Map & multimap 的删除 map.clear();           //删除所有元素 map.erase(pos);      //删除pos迭代器所指的元素,返回下一个元素的 ...

  2. rman删除归档日志无法释放

    背景 当Oracle 归档日志满了后,将无法正常登入oracle,需要删除一部分归档日志才能正常登入ORACLE.最近遇到一个问题,一套Oracle 11g数据库使用RMAN删除了归档日志,但是仍然无 ...

  3. undo表空间丢失、损坏

    1.模拟误删undo表空间 rm -rf undotbs01.dbf 2.解决步骤 SQL> shutdown immediateORA-01116: error in opening data ...

  4. Redis安装教程及安装报错解决方案(大佬勿喷)

    安装环境:CentOS7 Redis版本:redis-6.0.9.tar.gz 依次按照以下顺序执行: 1. [root@localhost ~]# wget https://download.red ...

  5. javascript笔记day01

    JavaScript基础语法 HTML :标记语言 JavaScript :编程语言 序言 JavaScript发展历史(JS) 1. 1994年,网景公司(Netscape)发布了Navigator ...

  6. 最全Python正则表达式来袭

    前言 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"))操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成 ...

  7. IIS本地部署局域网可随时访问的项目

    原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web项目的目录(D:\Gi ...

  8. wpf窗体项目 生成dll类库文件

    我想把一个wpf应用程序的输出类型由windows应用程序改为类库该怎么做,直接在项目属性里改的话报错为 库项目文件无法指定applicationdefinition属性 wpf窗体项目运行之后bin ...

  9. python的常量与变量

    1.Python属于强类型编程语言,Python解释器会根据赋值或运算来自动判断变量的类型.Python还是一种动态类型语言,变量的类型也是可以随时变化的. >>> x=3 > ...

  10. SecureCRT SSH Linux中不显示彩色 字体颜色、文件夹和文件显示的颜色区别开解决办法

    SecureCRT SSH Linux中不显示彩色 字体颜色.文件夹和文件显示的颜色区别开解决办法 实验环境: 刚开始我的情况是这样的:带颜色的显示不出来,然后还能看到,此处有内容,猜测是Secure ...