文档章节

jpeg格式文件剖析(一)

itfanr
 itfanr
发布于 2014/12/08 22:33
字数 883
阅读 34
收藏 0

web开发很诱人,但是总是无法沉下心来,因为web开发的技术更新速度实在太快了。

最近又开始弄我的老本行了,呵呵。重拾对编解码的研究。做底层能能经得住时间的考验,不会被时代抛弃。

关于jpeg的格式,参考文章分析的非常好!在这里感谢作者了。

我们拿奶茶这张照片来分析好了,希望东哥理解。嘿嘿~

  1. 用vi软件打开: vim -b naicha.jpeg

  2. 然后换成16进制式::%!xxd

  3. 另存为txt::w naicha.txt

分析:

ffd8

这是SOI部分,固定值0xFFD8,标记了图像的开始。2字节。

ffe0 0010 4a46 4946 0001 0101 0060  0060 0000

这是APP0部分,即应用程序保留标记0。以0XFFE0开始。0010表示接下来的字段的总长度,这里是16个字节。固定值0x4A46494600,即字符串“JFIF0”,占用了5个字节。0101表示JFIF的版本号为1.1。01占用了一个字节,表示密度单位,这里是点数/英寸。0060 0060 分别代表X和Y方向的像素密度。

ffdb 0043 000a 0707 0807 060a  .`.....C........
0000020: 0808 080b 0a0a 0b0e 1810 0e0d 0d0e 1d15  ................
0000030: 1611 1823 1f25 2422 1f22 2126 2b37 2f26  ...#.%$"."!&+7/&
0000040: 2934 2921 2230 4131 3439 3b3e 3e3e 252e  )4)!"0A149;>>>%.
0000050: 4449 433c 4837 3d3e 3bff db00 4301 0a0b  DIC<H7=>;...C...
0000060: 0b0e 0d0e 1c10 101c 3b28 2228 3b3b 3b3b  ........;("(;;;;
0000070: 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b  ;;;;;;;;;;;;;;;;
0000080: 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b  ;;;;;;;;;;;;;;;;
0000090: 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b 3b3b

这是DQT部分,定义量化表。0043表示接下来字段的总长度,这里是67个字节。00表示精度为8位,量化表ID为0。表项:67-2=65个字节。

ffc0  ;;;;;;;;;;;;;;..
00000a0: 0011 0801 4801 9b03 0122 0002 1101 0311 01

这是SOF0部分,标识了帧图像的开始,0011表示数据长度为17个字节。08表示每个数据样本的位数为8位。0148换成十进制为328(高,像素),019B换成十进制为411(宽,像素),表示图像大小为411*328。03表示颜色分量为YCbCr。

ff c400 1f00 0001 0501 0101 0101 0100 0000 0000 0000 0001 0203 0405 0607 0809 0a0b

这是DHT部分,也就是哈夫曼表。001f表示数据长度为31个字节。00表示DC直流和哈夫曼ID。

ff da00 0c03 0100 0211 0311 003f 00ce

SOS部分,扫描开始。000c表示数据长度为12个字节。03表示颜色分量数为YCbCr。01表示颜色分量ID,00表示直流/交流系数表号。此处有些疑问。

ffd9

这是EOI部分,表示图像结束。

由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。具体方法是,在数据0xFF后添加一个没有意义的0x00。换句话说,如果在图像数据流中遇到0xFF,应该检测其紧接着的字符,如果是

1)0x00,则表示0xFF是图像流的组成部分,需要进行译码;

2)0xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;

3)0xD0~0xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字节进行译码,并按RST标记的规则调整译码变量;

3)0xFF,则忽视当前0xFF,对后一个0xFF再作判断;

4)其他数值,则忽视当前0xFF,并保留紧接的此数值用于译码。

参考:

http://blog.csdn.net/lpt19832003/article/details/1713718

http://www.douban.com/note/144074400/

© 著作权归作者所有

共有 人打赏支持
itfanr
粉丝 115
博文 467
码字总数 165540
作品 1
济南
程序员
私信 提问
Tensorflow Error笔记 4

愿天堂没有Tensorflow! 阿门。 Invalid Argument Error: Invalid JPEG data size 49 在我准备好训练数据,准备把数据放入网络训练时,在程序运行到这一行时,提示上述错误: 根据提示,很明...

BookThief
2017/07/17
0
0
Android Progressive JPEG 图片由模糊到清晰

我们在浏览网页的时候,经常会看到一些网络图片由模糊变的清晰的过程。在android 开发中,我们也会遇到这样的需求。那么这个是怎么实现的呢? 一,背景知识: 技术标签 关键字 Progressive ...

Carlyle_Lee
2018/11/11
0
0
微软JPEG改进格式进入标准化阶段

北京时间1月30日上午消息,据国外媒体报道,曾发明了JPEG图像格式的联合图像专家组(Joint Photographic Experts Group)周四宣布,该组织已于今年1月投票决定让微软提交的JPEG改进格式——JPE...

红薯
2009/01/30
270
1
使用渐进式 JPEG 来提升用户体验

今天才认识到原来JPEG文件有两种保存方式,分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式)。两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不...

FungLeo
2016/08/17
0
0
DICOM:DICOM标准学习路线图(初稿)

题记: DICOM医学图像处理专栏撰写已有两个年头,积累了近百篇文章。起初只是用于记录自己科研、工作中遇到的疑难问题,专注于图像处理(主要是医学图像,这也正是专栏名称最初的由来);后来...

zssureqh
2015/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(六十四)

资源整理。 1 Coding: 1.交互式瓦片编辑器。 tile playground 2.R语言包autokeras,autokeras的R接口。autokeras是一个开源的自动机器学习的软件。 autokeras 3.斯坦福网络分析平台,用于网络...

胖胖雕
34分钟前
0
0
最简单的cd命令是个大坑!

BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。 在centos6里面,系统中不存在 cd 的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 ...

gaolongquan
45分钟前
1
0
spring获取bean的几种方式

使用jdk:1.8、maven:3.3.3 spring获取Bean的方式 pom.xml文件内容: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="......

Vincent-Duan
51分钟前
2
0
一段话系列-Linux中IO的同步、异步、阻塞、非阻塞

首先我们框定一下背景,我们探讨的是Linux系统下的IO模型。 同步和异步是针对内核操作数据而言的,同步是指内核串行顺序操作数据,异步是指内核并行(或并发)操作数据,然后通过回调的方式通...

EasyProgramming
55分钟前
4
0
好程序员web前端分享主流CSS image比较

好程序员web前端分享主流CSS image比较在还原设计图的时候,难免会碰到一些样式图片的引用。如何来对这些图片做优化呢?本文简单的梳理了一下目前几种比较常用的使用方式。   注: 1. 有更好...

好程序员IT
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部