2012-10-15 14 views
13

Quando uso PIL==1.1.7 a caricare le immagini TIFF, sembra avere il torto spazio colore:Python PIL che decodifica in modo errato i colori TIFF (utilizzando uno spazio cromatico errato)?

bad colorspace conversion

Cosa sta succedendo?

  • Il .tiff è stata creata usando convert test.jpg test.tiff (ma sembra accadere con altri file tiff troppo)
  • si può trovare all'indirizzo: http://hul.wolever.net/dump/test.tiff
  • L'uscita durante la 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

Ottieni un +1 solo per avermi presentato a 'Image.DEBUG'. –

+0

Mi sembra un problema con la fonte originale. Ho provato con la tua immagine e ottenere gli stessi risultati. Tuttavia, provare con un altro tiff o eseguire la conversione su un jpg produce i risultati attesi. – sberry

+1

@ sberry. tiff non è un formato monolitico. È molto più simile a un contenitore flessibile che può utilizzare più tipi di compressione e immagine. Penso che probabilmente non è un problema con il file stesso perché il programma di visualizzazione delle immagini del mio desktop può visualizzare il file come previsto. –

risposta

9

Ciò è probabilmente dovuto al fatto che le immagini TIFF contengono dati JPEG compressi generati da Adobe Photoshop, che utilizza un indicatore speciale per indicare che e spazio cromatico corretto. Immagino che PIL non conosca questo marker (almeno, in un JPEG incorporato in TIFF), quindi presume che l'immagine sia nello spazio colore YCbCr (che possiamo vedere sullo screenshot).

Vedere la risposta dettagliata here, credo che sia esattamente il tuo caso.

La soluzione possibile per voi è convertire i file JPEG con altri metodi (senza dati JPEG compressi). Ad esempio, se PIL riesce ad aprire correttamente i tuoi JPEG, puoi riscrivere il TIFF con PIL:

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

L'OP afferma che l'immagine è stata creata sulla riga di comando usando l'utility 'convert'. Per quanto ho capito la domanda, penso che il problema è ottenere da PIL per leggere il file tiff convertito, non trovando un modo migliore per fare la conversione. –

+0

@Steven, credo che non ci sia un modo rapido per far sì che il PIL legga correttamente questo file. Ho provato a falsificare la modalità immagine durante la lettura TIFF in 'TiffImagePlugin.py', senza risultato. Il binario PIL sottostante decodifica il jpeg incorporato allo stesso modo. Mi dispiace non aver potuto fare di meglio. –

Problemi correlati