JPEG解码--(1)JPEG文件格式概览
由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考。
了解的人知道其价值所在,不知道的人就弃之如废物吧。
本篇是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文件格式概览的更多相关文章
- JPEG解码——(3)文件头解析
与具体的编码数据空间相比,jpeg文件头占据非常小乃至可以忽略不计的大小. 仍然拿JPEG解码--(1)JPEG文件格式概览中的<animal park>这张图片来举例,从跳过SOS(FF ...
- ijg库解码超大型jpeg图片
1. ijg库解码超大型jpeg图片(>100M)的时候,如何避免内存溢出. 采用边解码边压缩的策略,每次解码一行或者若干行图片数据,然后对于这些解码的数据,进行DQT(量化处理,过滤掉高频的数 ...
- The Independent JPEG Group's JPEG software Android源码中 JPEG的ReadMe文件
The Independent JPEG Group's JPEG software========================================== README for rele ...
- jpeg解码库使用实例
jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpe ...
- JPEG解码——(6)IDCT逆离散余弦变换
本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来的一个步骤--逆离散余弦变换,即逆零偏置前的一个步骤. 该步骤比较偏理论,其业务是对IZigZag变换后的数据,再进一步的处理,使其恢复DC ...
- JPEG解码——(4)霍夫曼解码
本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容. 承接上篇,文件头解析完毕后,就进入了编码数据区域,即SOS的tag后的区域,也是图片数据量的大头所在. 1. 解码过程规则描述 a)从此颜色分量单元 ...
- JPEG解码——(5)反量化和逆ZigZag变换
本篇是该系列的第五篇,承接上篇huffman解码,介绍接下来的两个步骤--反量化和逆zigzag变换,即IDCT前的两个步骤. 需要说明的是,这两个步骤可以颠倒,本人的实现是,先反量化,再逆ZigZa ...
- 渐进式 JPEG (Progressive JPEG)来提升用户体验
1.概述 jpg格式分为:Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不同. Base ...
- 【STM32H7教程】第58章 STM32H7的硬件JPEG应用之图片解码显示
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第58章 STM32H7的硬件JPEG应用之图片解 ...
随机推荐
- 记一起由 Clang 编译器优化触发的 Crash
摘要:一个有意思的 Crash 探究过程,Clang 有 GCC 没有 本文首发于 Nebula Graph 官方博客:https://nebula-graph.com.cn/posts/troubl ...
- Java并发编程的艺术(八)——锁相关
锁的作用 控制多个线程访问共享资源. 线程协作 Lock接口 特点 与synchronized类似的同步功能,只是需要显式地获取和释放锁.缺少隐式获取锁的便捷性. 拥有锁获取与释放的可操作性.可中断的 ...
- Kubernetes Python Client 初体验之安装授权
最近想做一个基于flask的云平台管理服务器,利用python调用kubenetes提供的API来实现云平台的操作.笔者使用的是Windows,kubernetes集群安装在Ubuntu和Respbi ...
- BIOS、UEFI、Boot Loader都是些什么
BIOS.UEFI.Boot Loader都是些什么 目录 BIOS.UEFI.Boot Loader都是些什么 什么是BIOS 基本的输入输出是什么 自检程序"检"了什么 系统自 ...
- 淘宝|蚂蚁|菜鸟|盒马|嘀嘀|饿了么面经(已拿多个offer)
上一篇的同学拿到了bigo和腾讯的offer,这一次的分享来自两位同学的面试综合,他们分别拿到了菜鸟.嘀嘀.盒马的多个offer,由于面试的时间跨度时间太长,且面试的部门太多,只能回忆到具体的面试题, ...
- 2020-2021-1 20209307《Linux内核原理与分析》第一周作业
一.Linux基础命令操作 1.查看目录.新建文件.复制移除文件等 ls[选项] [文件或目录] -a 显示所有文件 包含隐藏文件 -l显示详细信息 -d查看目录属性 pwd显示当前目录 mkdir ...
- Vscode下载与配置(C语言)
目录 VScode 一.VScode下载 二.设置中文 三.Vscode界面介绍 1.活动栏 2.侧边栏 3.编辑栏 4.面板栏 四.VScode配置 1.C&C++配置 第一步 下载安装Mi ...
- mybatis-plus逻辑删除
MP(mybatis plus)已经大大简化了我们好多的开发操作,基本的增删改查都有了,包括代码生成等等,今天想说的是它的逻辑删除功能.我们都在数据库设计时候经常会有is字段,表示是否删除,为了留下员 ...
- 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate
一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...
- Windows系统提示:“windows找不到文件请确定文件名是否正确后
最近使用Win7/10系统的用户反应在系统中移动了桌面上的一些与系统无关的文档,在挪动了文件之后出现的问题,弹出了windows找不到文件请确定文件名是否正确后,再试一次, 的错误提示,该怎么办呢? ...