Я создал структуру 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
Структура сделала, и все работает отлично.
Теперь проблема в том, что значения сохранены в XDensity
а также YDensity
переменные очень высоки (X:24576,Y:24576
Я читаю изображение в Hex-редакторе). Это значение не может быть фактической шириной и высотой изображения.
Значение Units
является 0x01
в единицах «пиксели на дюйм».
Как я могу получить фактическое разрешение изображения 1024x826
из этих значений?
Если это не правильный метод, пожалуйста, дайте мне другую альтернативу.
Вы можете найти JPEG SOF0
маркер (0xC0
), за ним следует 16-битная длина, а затем биты на пиксель (8 бит), высота (16 бит), ширина (16 бит) и число компонентов (8 бит). Все значения являются порядком байтов в сети.
Изображение 0x1C2
от 0x1C2
пикселей (450х450).
Других решений пока нет …