2013-01-19 59 views
4

我创建了一个用于读取和验证JFIF文件格式头的C++结构。 的结构如下...从JFIF/EXIF(JPEG)头获取实际的图像分辨率?

#pragma pack(1) 
typedef struct _JFIF_Header 
{ 
    WORD SOIMarker;   // start of image marker 
    WORD APP0_Marker;  // Application use marker 
    WORD APP0_Length;  // Length of APP0 field 
    BYTE Identifier[5];  // zero terminating string "JFIF",X'4A', X'46', X'49', X'46', X'00' 
    BYTE Version[2];  // X'01',X'02' 
    BYTE Units;    // units = 0:no units ;; units = 1:X and Y are dots per inch ;; units = 2:X and Y are dots per cm 
    WORD XDensity;   // horizontal pixel density 
    WORD YDensity;   // vertical pixel density 
    BYTE XThumbnail;  // Thumbnail horizontal pixel density 
    BYTE YThumbnail;  // Thumbnail vertical pixel density 
}JFIFHeader; 

从原始磁盘簇读取和复制在JFIFHeader结构这些字节已经完成,一切工作正常。 现在,问题是,值保存在XDensityYDensity变量非常高(X:24576,Y:24576我读了十六进制编辑器中的图像)。该值不能是图像的实际宽度和高度。 Units的值是0x01,即单位是“每英寸像素数”。

如何从这些值中获得实际图像分辨率1024x826? 如果这不是正确的方法,请给我任何其他的选择。

+2

24567 = 0x6000。交换两个字节,因为您以错误的顺序读取它们= 0x0060 = 96。96 dpi是非常常见的值。不要编写自己的jpeg解码器。 –

+0

是的,这就是我的想法。刚刚看到一个示例代码。谢谢。 –

回答

5

您可以找到JPEG的SOF0标记(0xC0),后面是16位长度,然后是每像素(8位),高度(16位),宽度(16位)和元件数量(8位)。所有值都是网络字节顺序。

enter image description here

图片是通过0x1C20x1C2像素(450x450)。