2013-01-19 107 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)。