Alternatives for Extracting EXIF and JPEG Data from Images

Roger crosseyedpenguin at cox.net
Sun Mar 4 21:18:20 EST 2007


Max Erickson wrote:
> Roger <crosseyedpenguin at cox.net> wrote:
> 
>> Does anybody have a pointer to a Python library/utility that will
>> extract the chrominance and luminance quantization tables from
>> JPG images? 
>>
>> I have been using the _getexif method from PIL, which works fine,
>> but doesn't extract the quantization data.  I am a bit fuzzy on
>> the terminology, but the quantization data  seems to be JPEG data
>> rather than EXIF data.  One utility that extracts the
>> quantization tables is JPEGsnoop -- there is a link to download
>> the utility here: 
>>    http://www.impulseadventure.com/photo/jpeg-quantization.html
>>
>> The source code for the above isn't available and may not be
>> callable from a Python script even  if it were available.
>>
>> Roger
>>
> 
> I don't know what the format is, etc, but jpegs I open with PIL have a 
> quantization attribute, e.g:
> 
>>>> im.quantization
> {0: array('b', [6, 4, 4, 5, 4, 4, 6, 5, 5, 5, 6, 6, 6, 7, 9, 14, 9, 9, 
> 8, 8, 9, 18, 13, 13, 10, 14, 21, 18, 22, 22, 21, 18, 20, 20, 23, 26, 
> 33, 28, 
> <snip a bunch more numbers>
> 
> 
> max
> 

Thank you, I wasn't aware of the quantization method.  I was unable to 
find any documentation for it.

The 0: array() output would appear to be the luminance 8x8 array and the 
1: array() to be the chrominance 8x8 array.  A curiosity is the values 
disagree with the output of the JPEGsnoop utility.  For my Canon 
Powershot S2 IS set to "fine", im.quantization yields (after formatting):

{0: array('b', [
1, 1, 1, 2, 1, 1, 2, 2,
2, 2, 3, 2, 2, 3, 3, 6,
4, 3, 3, 3, 3, 7, 5, 8,
4, 6, 8, 8, 10, 9, 8, 7,
11, 8, 10, 14, 13, 11, 10, 10,
12, 10, 8, 8, 11, 16, 12, 12,
13, 15, 15, 15, 15, 9, 11, 16,
17, 15, 14, 17, 13, 14, 14, 14
]),

1: array('b', [
4, 4, 4, 5, 4, 5, 9, 5,
5, 9, 15, 10, 8, 10, 15, 26,
19, 9, 9, 19, 26, 26, 26, 26,
13, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26])}

The JPEGsnoop output for the same jpg file is (pardon the line wrap):

   Precision=0 bits
   Destination ID=0 (Luminance)
     DQT, Row #0:   1   1   1   2   3   6   8  10  AnnexRatio:  16.0 
11.0  10.0   8.0   8.0   6.7   6.4   6.1
     DQT, Row #1:   1   1   2   3   4   8   9   8  AnnexRatio:  12.0 
12.0   7.0   6.3   6.5   7.3   6.7   6.9
     DQT, Row #2:   2   2   2   3   6   8  10   8  AnnexRatio:   7.0 
6.5   8.0   8.0   6.7   7.1   6.9   7.0
     DQT, Row #3:   2   2   3   4   7  12  11   9  AnnexRatio:   7.0 
8.5   7.3   7.3   7.3   7.3   7.3   6.9
     DQT, Row #4:   3   3   8  11  10  16  15  11  AnnexRatio:   6.0 
7.3   4.6   5.1   6.8   6.8   6.9   7.0
     DQT, Row #5:   3   5   8  10  12  15  16  13  AnnexRatio:   8.0 
7.0   6.9   6.4   6.8   6.9   7.1   7.1
     DQT, Row #6:   7  10  11  12  15  17  17  14  AnnexRatio:   7.0 
6.4   7.1   7.3   6.9   7.1   7.1   7.2
     DQT, Row #7:  14  13  13  15  15  14  14  14  AnnexRatio:   5.1 
7.1   7.3   6.5   7.5   7.1   7.4   7.1
     Approx quality factor = 92.96 (scaling=14.08 variance=5.28)
   ----
   Precision=0 bits
   Destination ID=1 (Chrominance)
     DQT, Row #0:   4   4   5   9  15  26  26  26  AnnexRatio:   4.3 
4.5   4.8   5.2   6.6   3.8   3.8   3.8
     DQT, Row #1:   4   4   5  10  19  26  26  26  AnnexRatio:   4.5 
5.3   5.2   6.6   5.2   3.8   3.8   3.8
     DQT, Row #2:   5   5   8   9  26  26  26  26  AnnexRatio:   4.8 
5.2   7.0  11.0   3.8   3.8   3.8   3.8
     DQT, Row #3:   9  10   9  13  26  26  26  26  AnnexRatio:   5.2 
6.6  11.0   7.6   3.8   3.8   3.8   3.8
     DQT, Row #4:  15  19  26  26  26  26  26  26  AnnexRatio:   6.6 
5.2   3.8   3.8   3.8   3.8   3.8   3.8
     DQT, Row #5:  26  26  26  26  26  26  26  26  AnnexRatio:   3.8 
3.8   3.8   3.8   3.8   3.8   3.8   3.8
     DQT, Row #6:  26  26  26  26  26  26  26  26  AnnexRatio:   3.8 
3.8   3.8   3.8   3.8   3.8   3.8   3.8
     DQT, Row #7:  26  26  26  26  26  26  26  26  AnnexRatio:   3.8 
3.8   3.8   3.8   3.8   3.8   3.8   3.8
     Approx quality factor = 88.24 (scaling=23.52 variance=21.42)

I don't understand the "AnnexRatio" data JPEGsnoop is adding to each 
row.  Anyone have an explanation on how to translate the im.quantization 
values to the JPEGsnoop values?  Or am I looking at two different types 
of "quantization" tables?

Roger




More information about the Python-list mailing list