📄 jpeg文件格式简单分析 - 计算机之路 - blogjava.htm
字号:
<P class=MsoNormal><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma"> <o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt"><SPAN
lang=EN-US
style="FONT-SIZE: 15pt; FONT-FAMILY: 黑体; mso-bidi-font-size: 12.0pt; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">三、<SPAN
style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 15pt; FONT-FAMILY: 黑体; mso-bidi-font-size: 12.0pt; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">JPEG文件中段的介绍:</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">APP0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段中主要存储的是图片的识别信息(字符串</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">”JFIF\0”</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">)、一些分辨率的信息以及缩略图的信息。在我的实际测试中,发现并不是所有的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">文件都有</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">APP0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段的,有的仅是有</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">APP2</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">之类的其他段,但是每个文件中肯定是包含</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">APPX</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的段(</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">X</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">可以取得的值可以查阅相关文档)。我个人估计,这些</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">APPX</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的段的信息应该是大同小异。这个的验证还有待本人进一步的学习,目前只能说到这里。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">DQT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段的内容是量化表的信息。众所周知,一个颜色可以分为</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">RGB</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">(红、绿、兰)三个分量,这三色光组成了我们可以见到的所有色彩。但是,在</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">文件中,</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">RGB</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">色彩格式需要先转化为</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的格式。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Y</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">分量代表了亮度信息,</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">UV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">分量代表了色差信息。相比之下,人眼对于</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Y</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">分量更为敏感。量化表的作用就是对于一些不需要的量进行去除,这也是</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">有损压缩损失数据的关键。上面的输出可以看到两个量化表,一个给</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Y</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">分量,另一个给</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">UV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">分量。其实,他们也可以共用一个量化表。一个量化的结果如下所示(摘自《</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">压缩编码标准》):</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US style="FONT-FAMILY: Tahoma">15
0 -1 0
0 0 0
0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US style="FONT-FAMILY: Tahoma">-2
-1 0 0
0 0 0
0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US style="FONT-FAMILY: Tahoma">-1
-1 0 0
0 0 0
0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">0 0
0 0 0
0 0 0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">0 0
0 0 0
0 0 0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">0 0
0 0 0
0 0 0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">0 0
0 0 0
0 0 0<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: center"
align=center><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">0 0
0 0 0
0 0 0<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">我们可以看到,量化后出现了大量的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">,这种结果很有利于我们进行下一步的数据压缩的。至于为什么是</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">8x8</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的大小,待会你就知道了。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">SOF0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段的内容是图像的大小信息,每个像素的位数信息,以及</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">每个分量分别得的采样信息(这部分如果读者想要进一步学习,请参考相应书籍和文档)。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">文件图像的编码是一个方块一个方块进行的,每块的大小为</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">8x8</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">大小(如果图像不是整数个方块的大小那么就对图像补齐为整数个大小)。简略地说采样信息,就是如何按组记录</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的信息,即若干个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Y</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">方块,若干个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">U</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">方块,若干个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">V</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">方块经过量化的数据再次经过编码后组成一组记录,保存在</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">SOS</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段结束后。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US
style="FONT-FAMILY: Tahoma">DHT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段的内容是一个重头戏,如果没有它,</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">JPEG</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">压缩效率就不会那么高了。它内部定义的是一个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表,不同的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">DHT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段定义不同的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表,有的是直流量的表,有的是交流量的表。什么是直流量,什么是交流量呢?待会我再作介绍。最多的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表示几个呢?</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">各一个,直流交流各一个,因为</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">YUV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">每个分量都有直流和交流,所以最多时,</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表有</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">3x2</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">个,也就是可以有</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">6</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">DHT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">段。该文件中有</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">4</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">DHT</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表,您可以大概猜出来是哪几个表么?</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Y</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的直流和交流各一个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表,</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">UV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">和起来直流和交流各一个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">Huffman</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">表。这样说应该比较合理吧。</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">好了,现在我们应该弄明白什么是交流量,什么是直流量了。还举上面那个有许多个</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ascii-font-family: Tahoma">的</SPAN><SPAN
lang=EN-US style="FONT-FAMILY: Tahoma">8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -