4

JFIFファイル形式のヘッダーを読み取って検証するためのC++構造を作成しました。構造は次のとおりです。

#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;

rawディスククラスターからの読み取りとJFIFHeaderStructureでのこれらのバイトのコピーが完了し、すべてが正常に機能します。さて、問題は、保存された値XDensityYDensity変数が非常に高いことです(X:24576,Y:24576私はHex-Editorで画像を読みました)。この値を画像の実際の幅と高さにすることはできません。の値はUnitsです0x01。つまり、単位は「ピクセル/インチ」です。

1024x826これらの値から実際の画像解像度を取得するにはどうすればよいですか?これが適切な方法でない場合は、他の方法を教えてください。

4

1 に答える 1

8

SOF0JPEGのマーカー( )を見つけることができ0xC0、その後に16ビットの長さが続き、ピクセルあたりのビット数(8ビット)、高さ(16ビット)、幅(16ビット)、コンポーネント数(8ビット)が続きます。すべての値はネットワークバイトオーダーです。

ここに画像の説明を入力してください

画像は0x1C2ピクセル0x1C2単位(450x450)です。

于 2013-01-19T13:41:34.937 に答える