Подтвердить что ты не робот

Python PIL неправильно декодирует цвета TIFF (используя неправильное цветовое пространство)?

Когда я использую PIL==1.1.7 для загрузки изображений TIFF, кажется, что неправильное цветовое пространство:

bad colorspace conversion

Что происходит?

  • .tiff был создан с помощью convert test.jpg test.tiff (но, похоже, с другими файлами TIFF тоже)
  • Его можно найти по адресу: http://hul.wolever.net/dump/test.tiff
  • Вывод, когда 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
4b9b3361

Ответ 1

Это, скорее всего, связано с тем, что ваши изображения TIFF содержат сжатые данные JPEG, созданные Adobe Photoshop, которые используют специальный маркер для указания правильного цветового пространства. Я думаю, PIL не знает этого маркера (по крайней мере, в встроенном в формате TIFF JPEG), поэтому он предполагает, что изображение находится в цветовом пространстве YCbCr (что мы видим на скриншоте).

См. подробный ответ здесь, я считаю, что это именно ваш случай.

Возможное решение для вас - конвертировать ваши JPEG файлы другими способами (без сжатых данных JPEG). Например, если PIL удается правильно открыть ваши JPEG файлы, вы можете переписать TIFF с помощью PIL:

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