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

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

  本篇是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. NPM相关知识点

    1.Windows环境变量的配置 npm config set prefix "D:\Program Files\nodejs\node_global" npm config se ...

  2. 安卓qq视频动态名片制作器

    本软件来自互联网,仅供个人参考,严禁商业用途! 非常炫酷的diy动态名片教程,B格绝对高,内含软件教程代码,包会!

  3. SpringBoot + Mybatis-Plus 实现多数据源简单示例

    1. 简介   在单体项目中,经常出现想要访问多个数据源的情况,或者因为某些性能瓶颈,将大数据量的业务表分离到另一个库等情况.   实现多数据源的方案有很多,Mybatis-Plus提供了非常简单的实 ...

  4. xwiki升级8.8.4

    安装包下载: http://download.forge.ow2.org/xwiki/xwiki-enterprise-jetty-hsqldb-8.4.4.zip 推荐使用jetty包,方便快捷,不 ...

  5. PDCA

    Plan(规划) Do(执行) Check(验证) Adjust(调整)

  6. 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制

    前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...

  7. 多任务-python实现-生成器相关(2.1.13)

    @ 目录 1.概念 2.创建方法 3.通过send方式来启动 1.概念 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占 ...

  8. 容器编排系统k8s之Service资源

    前文我们了解了k8s上的DemonSet.Job和CronJob控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14157306.html:今 ...

  9. 第十章 Seata--分布式事务

    承接上篇 ,终于我们迎来了最后一章 第九章 Nacos Config–服务配置,第十章 Seata–分布式事务,感谢你能学习到这 !废话不多说,撸码 10.1 分布式事务基础 10.1.1 事务 事务 ...

  10. Python爬取热搜存入数据库并且还能定时发送邮件!!!

    一.前言 微博热搜榜每天都会更新一些新鲜事,但是自己处于各种原因,肯定不能时刻关注着微博,为了与时代接轨,接受最新资讯,就寻思着用Python写个定时爬取微博热搜的并且发送QQ邮件的程序,这样每天可以 ...