我有很多不同图像大小的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)文件的宽度和高度
此函数将读取 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)