14
votes

When I use PIL==1.1.7 to load TIFF images, it seems to get the colorspace wrong:

bad colorspace conversion

What's going on?

  • The .tiff was created using convert test.jpg test.tiff (but seems to happen with other tiff files too)
  • It can be found at: http://hul.wolever.net/dump/test.tiff
  • The output when PIL.Image.DEBUG = True:
>>> from PIL import Image
>>> Image.DEBUG = True
>>> Image.open("/tmp/test.tiff").show()
tag: ImageWidth (256) - type: short (3) - value: (560,)
tag: ImageLength (257) - type: short (3) - value: (401,)
tag: BitsPerSample (258) - type: short (3) - value: (8, 8, 8)
tag: Compression (259) - type: short (3) - value: (7,)
tag: PhotometricInterpretation (262) - type: short (3) - value: (2,)
tag: FillOrder (266) - type: short (3) - value: (1,)
tag: DocumentName (269) - type: ascii (2) - value: /tmp/lemur.tiff
tag: StripOffsets (273) - type: long (4) - value: (8, 9282, 18712, 28312, 38000, 48730, 59052, 70406, 83010, 95978, 108967, 121029, 133136, 145555, 157411, 168289, 179433, 191157, 202954, 214664, 226914, 238919, 250547, 261871, 273282, 284453)
tag: Orientation (274) - type: short (3) - value: (1,)
tag: SamplesPerPixel (277) - type: short (3) - value: (3,)
tag: RowsPerStrip (278) - type: short (3) - value: (16,)
tag: StripByteCounts (279) - type: long (4) - value: (9274, 9430, 9600, 9688, 10730, 10322, 11354, 12604, 12968, 12989, 12062, 12107, 12419, 11856, 10878, 11144, 11724, 11797, 11710, 12250, 12005, 11628, 11324, 11411, 11171, 2541)
tag: XResolution (282) - type: rational (5) - value: ((1207959552, 16777216),)
tag: YResolution (283) - type: rational (5) - value: ((1207959552, 16777216),)
tag: PlanarConfiguration (284) - type: short (3) - value: (1,)
tag: ResolutionUnit (296) - type: short (3) - value: (1,)
tag: PageNumber (297) - type: short (3) - value: (0, 1)
tag: JPEGTables (347) - type: undefined (7) - value: ????C??

???}!1AQa"q2??#B??R??$3br?  
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz???????????????????????????????????????????????????????????????????????????
tag: YCbCrSubSampling (530) - type: short (3) - value: (2, 2)
*** Summary ***
- compression: jpeg
- photometric_interpretation: 2
- planar_configuration: 1
- fill_order: 1
- size: (560, 401)
format key: ('II', 2, 1, 1, (8, 8, 8), ())
- raw mode: RGB
- pil mode: RGB
1
You get a +1 just for introducing me to Image.DEBUG. - Mark Ransom
It seems to me to be an issue with the original source. I tried with your image and get the same results. However, trying with another tiff, or running convert on a jpg yields the expected results. - sberry
@sberry. tiff is not a monolithic format. It's really more like a flexible container that can utilize multiple compression and image types. I think it's probably not a problem with the file itself because my desktop's image viewing program can display the file as expected. - Steven Rumbalski
In addition to Vladimir Sinenko's answer, this problem might be circumvented by specifying a colorspace when converting from jpeg to tiff, like convert test.jpg -colorspace sRGB test.tiff. - Roland Smith

1 Answers

12
votes

This is most likely due to the fact that your TIFF images contain compressed JPEG data generated by Adobe Photoshop, that uses a special marker to indicate the correct colorspace. I guess PIL doesn't know this marker (at least, in a TIFF-embedded JPEG), so it assumes that the image is in YCbCr colorspace (which we can see on the screenshot).

See the detailed answer here, I believe it's exactly your case.

The possible solution for you is to convert your JPEGs with other methods (without compressed JPEG data). For example, if PIL manages to open your JPEGs correctly, you can rewrite the TIFF with PIL:

from PIL import Image
img = Image.open("test.jpg")
tif = Image.new("RGB", img.size)
tif.paste(img)
tif.save('result.tiff')