2013-01-19 1 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 16 진수 편집기에서 이미지 읽기). 이 값은 이미지의 실제 너비와 높이가 될 수 없습니다. Units의 값은 0x01입니다. 즉, 단위는 "인치당 픽셀"입니다.

이 값에서 실제 이미지 해상도 1024x826을 어떻게 얻을 수 있습니까? 이것이 올바른 방법이 아닌 경우 나에게 다른 방법을 알려주세요.

+2

24567 = 0x6000. 두 바이트를 잘못된 순서 = 0x0060 = 96으로 읽으므로 스왑하십시오. 96 dpi는 매우 일반적인 값입니다. 자신의 jpeg 디코더를 작성하지 마십시오. –

+0

그래, 그게 내가 생각한거야. 예제 코드를 보았습니다. 감사. –

답변

5

JPEG의 SOF0 마커 (0xC0)를 찾고 16 비트 길이 다음에 픽셀 당 비트 (8 비트), 높이 (16 비트), 너비 (16 비트) 및 구성 요소 개수 비트). 모든 값은 네트워크 바이트 순서입니다.

enter image description here

0x1C2 이미지 픽셀 (450x450)에 의해 0x1C2이다.

관련 문제