2010-03-25 2 views
7

У меня есть много файлов jpeg с различным размером изображения. Например, здесь есть первые 640 байт, как определяются шестнадцатеричным образом размера 256 * 384 (пикселей):Получение размера изображения JPEG из его двоичного кода

0000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H 
0000010: 0048 0000 ffdb 0043 0003 0202 0302 0203 .H.....C........ 
0000020: 0303 0304 0303 0405 0805 0504 0405 0a07 ................ 
0000030: 0706 080c 0a0c 0c0b 0a0b 0b0d 0e12 100d ................ 

Я думаю информацию о размере быть в пределах муз этих линий. Но я не могу определить, какие байты правильно определяют размеры. Может ли кто-нибудь помочь мне найти поля, содержащие информацию о размере?

ответ

10

В соответствии с разделом Syntax and structureJPEG page on wikipedia ширина и высота изображения, похоже, не хранятся в самом изображении - или, по крайней мере, не так, как это довольно легко найти.


Тем не менее, цитаты из JPEG image compression FAQ, part 1/2:

Тема: [22] Как мой ЭКСТРАКТ программа размеры изображения из файла в JPEG?

Заголовок файла JPEG состоит из серии блоков, называемых «маркерами». Высота и ширина изображения сохраняются в маркере типа SOFn(начало рама, тип N).
Чтобы найти SOFn , вы должны пропустить предыдущие маркеры ; вам не нужно знать, что такое в других типах маркеров, только используйте свои слова длины, чтобы пропустить их .
Необходима минимальная логика: Возможно, страница C-кода.
(Некоторые людей рекомендовали просто поиск для байтовых пар, представляющей SOFn, , не обращая внимания на блочной структуру маркеров . Это небезопасно , так как перед маркером может содержать шаблон SOFn, либо случайно или , потому что она содержит JPEG сжатого уменьшенного изображения. Если вы не следует структуры маркеров вы будете извлекать размер миниатюры вместо основного размера изображений .)
обильного прокомментировало пример в C можно найти в rdjpgcom.c в IJ G (см. Часть 2, п. 15).
Код Perl можно найти в wwwis, от http://www.tardis.ed.ac.uk/~ark/wwwis/.

(Ergh, что ссылка кажется сломаны ...)


Вот часть кода C, который может помочь вам, хотя: Decoding the width and height of a JPEG (JFIF) file

+0

Если это так, как наутилус или какой-либо другой просмотрщик изображений решает разрешение изображения? Это тоже, похоже, они согласны с значением 256 * 384 для этого изображения – rajeshsr

+0

Большое спасибо! Я понял сейчас.greping 0xFFC0, похоже, работает, во всяком случае, я понимаю, какая там опасность! Еще раз спасибо! Кстати, это мой первый пост в stackoverflow! Весьма поразила стабильность и точность ответа. Всем спасибо! – rajeshsr

+0

Добро пожаловать :-) Удачи! –

0

Эта функция будет читать свойства JPEG

function jpegProps(data) {   // data is an array of bytes 
    var offset = 0; 
    while(off<data.length) { 
     while(data[off]==0xff) off++; 
     var mrkr = data[off]; off++; 

     if(mrkr==0xd8) continue; // SOI 
     if(mrkr==0xd9) break;  // EOI 
     if(0xd0<=mrkr && mrkr<=0xd7) continue; 
     if(mrkr==0x01) continue; // TEM 

     var len = ((data[off]<<8)|data[off+1])-2; off+=2; 

     if(mrkr==0xc0) return { 
      bpc : data[off],  // precission (bits per channel) 
      w : (data[off+1]<<8)|data[off+2], 
      h : (data[off+3]<<8)|data[off+4], 
      cps : data[off+5] // number of color components 
     } 
     off+=len; 
    } 
} 
Смежные вопросы