如何才能通过读JPG文件头的方式,取得图片的像素值和DPI值

怎么才能通过读JPG文件头的方式,取得图片的像素值和DPI值
怎么才能通过读JPG文件头的方式,取得图片的像素值和DPI值

------解决方案--------------------
JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)版本号为1.02。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。 

JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系:

       Y = 256 * E'y

      Cb = 256 * [E'Cb] + 128

      Cr = 256 * [E'Cr] + 128
其中亮度电平E'y和色差电平E'Cb和E'Cb分别是CCIR 601定义的参数。由于E'y的范围是0~1,E'Cb和E'Cb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是RGB和YCbCr之间的转换关系需要按照下面的方法计算。

(1) 从RGB转换成YCbCr

YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到:

       Y =   0.299 R + 0.587 G  + 0.114 B

     Cb = - 0.1687R - 0.3313G  + 0.5   B + 128

    Cr = 0.5 R - 0.4187G - 0.0813 B + 128

需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。

(2) 从YCbCr转换成RGB 

RGB分量可直接从YCbCr(256级)分量计算得到:

     R = Y                 + 1.402 (Cr-128)

      G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)

      B = Y + 1.772 (Cb-128)


在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。

2 文件结构

JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:

SOI  0xD8            图像开始 
APP0 0xE0            JFIF应用数据块 
APPn 0xE1 - 0xEF    其他的应用数据块(n, 1~15) 
DQT  0xDB           量化表 
SOF0 0xC0            帧开始 
DHT  0xC4           霍夫曼(Huffman)表 
SOS  0xDA           扫描线开始 
EOI  0xD9            图像结束
为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释。

表6-05 JPEG定义的标记

Symbol 

(符号)
 Code Assignment

(标记代码)
 Description

(说明)
 
Start Of Frame markers, non-hierarchical Huffman coding
 
SOF0
 0xFFC0
 Baseline DCT
 
SOF1
 0xFFC1
 Extended sequential DCT
 
SOF2
 0xFFC2
 Progressive DCT
 
SOF3
 0xFFC3
 Spatial (sequential) lossless 
 
Start Of Frame markers, hierarchical Huffman coding
 
SOF5
 0xFFC5
 Differential sequential DCT
 
SOF6
 0xFFC6
 Differential progressive DCT
 
SOF7
 0xFFC7
 Differential spatial lossless
 
Start Of Frame markers, non-hierarchical arithmetic coding
 
JPG
 0xFFC8
 Reserved for JPEG extensions
 
SOF9
 0xFFC9
 Extended sequential DCT
 
SOF10
 0xFFCA
 Progressive DCT
 
SOF11
 0xFFCB
 Spatial (sequential) Lossless
 
Start Of Frame markers, hierarchical arithmetic coding
 
SOF13
 0xFFCD
 Differential sequential DCT
 
SOF14
 0xFFCE
 Differential progressive DCT
 
SOF15
 0xFFCF
 Differential spatial Lossless
 
Huffman table specification
 
DHT
 0xFFC4
 Define Huffman table(s)
 
arithmetic coding conditioning specification
 
DAC
 0xFFCC
 Define arithmetic conditioning table
 
Restart interval termination
 
RSTm
 0xFFD0~0xFFD7
 Restart with modulo 8 counter m
 
Other marker
 
SOI
 0xFFD8
 Start of image