2010-03-25 57 views
7

我有很多jpeg文件具有不同的圖像大小。例如,這裏是第一字節640由大小的圖像的hexdump都給出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

根據JPEG page on wikipediaSyntax and structure部分,圖像的寬度和高度似乎並未存儲在圖像本身中,或者至少不是以很容易找到的方式存儲。


不過,從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 2010-03-25 17:31:12

+0

非常感謝!我現在已經明白了。greifer 0xFFC0似乎工作,無論如何我明白這裏涉及的危險!再次感謝!順便說一句,這是我在stackoverflow的第一篇文章!非常驚訝於反應的堅定性和準確性。謝謝大家! – rajeshsr 2010-03-25 17:53:47

+0

不客氣:-)玩得開心! – 2010-03-25 18:40:50

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