tags:

views:

327

answers:

4

Hi I have a lot of jpeg files with varying image size. For instance, here is the first 640 bytes as given by hexdump of an image of size 256*384(pixels):

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  ................

I guess the size information mus be within these lines. But am unable to see which bytes give the sizes correctly. Can anyone help me find the fields that contains the size information?

+2  A: 

According to the Syntax and structure section of the JPEG page on wikipedia, the width and height of the image don't seem to be stored in the image itself -- or, at least, not in a way that's quite easy to find.


Still, quoting from JPEG image compression FAQ, part 1/2 :

Subject: [22] How can my program extract image dimensions from a JPEG file?

The header of a JPEG file consists of a series of blocks, called "markers". The image height and width are stored in a marker of type SOFn (Start Of Frame, type N).
To find the SOFn you must skip over the preceding markers; you don't have to know what's in the other types of markers, just use their length words to skip over them.
The minimum logic needed is perhaps a page of C code.
(Some people have recommended just searching for the byte pair representing SOFn, without paying attention to the marker block structure. This is unsafe because a prior marker might contain the SOFn pattern, either by chance or because it contains a JPEG-compressed thumbnail image. If you don't follow the marker structure you will retrieve the thumbnail's size instead of the main image size.)
A profusely commented example in C can be found in rdjpgcom.c in the IJG distribution (see part 2, item 15).
Perl code can be found in wwwis, from http://www.tardis.ed.ac.uk/~ark/wwwis/.

(Ergh, that link seems broken...)


Here's a portion of C code that could help you, though : Decoding the width and height of a JPEG (JFIF) file

Pascal MARTIN
If that is the case how nautilus or some other image viewer decides the resolution of the image? That too they seem to agree on the value 256*384 for that image
rajeshsr
Thank you very much! I have understood now. greping 0xFFC0 seems to work, anyway I do understand the danger involved there! Thanks again! BTW, this is my first post at stackoverflow! Quite amazed about the fastness and the preciseness of response. Thank you everyone!
rajeshsr
You're welcome :-) Have fun !
Pascal MARTIN
A: 

It looks like you'll need to use some kind of image library to load the image into memory and then get its size. What language are you working in?

Skilldrick
Well, am not working on any specific language. Just wanted to get the resolutions of a lot of images i have; thought bash will do; so want to know how to access it from the binary file itself.
rajeshsr
A: 

To get the dimensions of a jpeg file, you will need to read in the file and look for markers, here is an example.

yx
A: 

Use jhead library, it include source code for a lot of jpeg variations,

JHEAD LIbrary

Jose