从二进制文件中获取JPEG的图像大小

raj*_*hsr 8 binary jpeg file

我有很多不同图像大小的jpeg文件.例如,这是大小为256*384(像素)的图像的hexdump给出的前640个字节:

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  ................
Run Code Online (Sandbox Code Playgroud)

我想大小信息应该在这些行中.但我无法看到哪些字节正确地给出了大小.任何人都可以帮我找到包含大小信息的字段吗?

Pas*_*TIN 10

根据维基百科上JPEG页面语法和结构部分,图像的宽度和高度似乎不会存储在图像本身中 - 或者至少不是很容易找到的方式.


仍然,引用JPEG图像压缩FAQ,第1/2部分:

主题:[22]我的程序如何从JPEG文件中提取图像尺寸?

JPEG文件的标题由一系列块组成,称为"标记". 图像高度和宽度存储在SOFn类型的标记中 (帧起始,类型N).
要找到SOFn,您必须跳过前面的标记; 你不必知道其他类型标记中的内容,只需使用它们的长度字来跳过它们.
所需的最小逻辑可能是一段C代码.
(有些人建议只搜索代表SOFn的字节对,而不关注标记块结构.这是不安全的,因为先前的标记可能包含SOFn模式,无论是偶然还是因为它包含JPEG压缩的缩略图.如果不遵循标记结构,则将检索缩略图的大小而不是主图像大小.)
C中的大量注释示例可以在IJG发行版的rdjpgcom.c中找到(参见第2部分,第15项).
Perl代码可以在http://www.isardis.ed.ac.uk/~ark/wwwis/的 wwwis中 找到.

(呃,那个链接好像坏了......)


以下是可以帮助您的C代码的一部分:解码JPEG(JFIF)文件的宽度和高度

  • 这是最后一个链接的存档:https://web.archive.org/web/20131016210645/http://www.64lines.com/jpeg-width-height (2认同)

Iva*_*kir 6

此函数将读取 JPEG 属性

function jpegProps(data) {          // data is an array of bytes
    var off = 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];  off+=2;  
        
        if(mrkr==0xc0) return {
            bpc : data[off],     // precission (bits per channel)
            h   : (data[off+1]<<8) | data[off+2],
            w   : (data[off+3]<<8) | data[off+4],
            cps : data[off+5]    // number of color components
        }
        off+=len-2;
    }
}
Run Code Online (Sandbox Code Playgroud)

 

  • 简短而完美的解决方案。 (2认同)