4

我创建了一个 C++ 结构,用于读取和验证 JFIF 文件格式的标头。结构如下...

#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我在 Hex-Editor 中读取了图像)。该值不能是图像的实际宽度和高度。的值为,Units0x01单位为“像素每英寸”。

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

4

1 回答 1

8

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

在此处输入图像描述

图像0x1C20x1C2像素 (450x450)。

于 2013-01-19T13:41:34.937 回答