2012-10-15 3 views
13

Wenn ich PIL==1.1.7 verwenden TIFF-Bilder zu laden, so scheint es, den Farb falsch zu bekommen:Python PIL, das TIFF-Farben falsch dekodiert (falscher Farbraum verwendend)?

bad colorspace conversion

Was ist los?

  • Die .tiff wurde mit convert test.jpg test.tiff erstellt (aber scheint mit anderen TIFF-Dateien passieren zu)
  • Es kann unter: http://hul.wolever.net/dump/test.tiff
  • Der Ausgang bei 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 
+6

Sie ein +1 bekommen nur für mich zu 'Image.DEBUG' einzuführen. –

+0

Es scheint mir ein Problem mit der ursprünglichen Quelle zu sein. Ich habe es mit deinem Bild versucht und die gleichen Ergebnisse erzielt. Ein Versuch mit einem anderen TIFF oder das Ausführen einer Conversion in einem JPG führt jedoch zu den erwarteten Ergebnissen. – sberry

+1

@sberry. tiff ist kein monolithisches Format. Es ist mehr wie ein flexibler Container, der mehrere Komprimierungs- und Bildtypen verwenden kann. Ich denke, es ist wahrscheinlich kein Problem mit der Datei selbst, weil das Bildanzeigeprogramm meines Desktops die Datei wie erwartet anzeigen kann. –

Antwort

9

Dies liegt wahrscheinlich daran, dass Ihre TIFF-Bilder komprimierte JPEG-Daten enthalten, die von Adobe Photoshop generiert wurden und die einen speziellen Marker verwenden, um dies anzuzeigen Der richtige Farbraum. Ich nehme an, PIL kennt diesen Marker nicht (zumindest in einem TIFF-eingebetteten JPEG), also nimmt er an, dass das Bild im YCbCr-Farbraum ist (was wir auf dem Screenshot sehen können).

Siehe die detaillierte Antwort here, ich glaube, es ist genau dein Fall.

Die mögliche Lösung für Sie ist die Konvertierung Ihrer JPEGs mit anderen Methoden (ohne komprimierte JPEG-Daten). Zum Beispiel, wenn PIL richtig Ihre JPEGs öffnen verwaltet, können Sie das TIFF mit PIL umschreiben:

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

Das OP gibt an, dass das Image in der Befehlszeile mit dem Dienstprogramm 'convert' erstellt wurde. Soweit ich die Frage verstanden habe, glaube ich, dass das Problem darin besteht, dass PIL die konvertierte TIFF-Datei liest und keinen besseren Weg findet, die Konvertierung durchzuführen. –

+0

@Steven, ich glaube, es gibt keine schnelle Möglichkeit, PIL dazu zu bringen, diese Datei korrekt zu lesen. Ich habe versucht, den Bildmodus während des TIFF-Lesens in 'TiffImagePlugin.py' zu verfälschen, aber vergeblich. Das zugrundeliegende PIL-Binary dekodiert das eingebettete JPEG genauso. Es tut mir leid, ich konnte nicht besser helfen. –