2012-10-15 14 views
13

Gdy używam PIL==1.1.7 załadować obrazów TIFF, wydaje się niewłaściwym kolorów:Python PIL niepoprawnie dekoduje kolory TIFF (używając niewłaściwej przestrzeni kolorów)?

bad colorspace conversion

Co się dzieje?

  • .tiff został stworzony przy użyciu convert test.jpg test.tiff (ale zdarza się w przypadku innych plików tiff zbyt)
  • Można go znaleźć pod adresem: http://hul.wolever.net/dump/test.tiff
  • Wyjście gdy 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

Otrzymujesz +1 tylko za wprowadzenie mnie do 'Image.DEBUG'. –

+0

Wydaje mi się, że jest to problem z oryginalnym źródłem. Próbowałem z twoim obrazem i otrzymałem takie same wyniki. Jednak próbowanie z inną tiff lub konwertowanie w jpg daje oczekiwane wyniki. – sberry

+1

@sberry. tiff nie jest monolitycznym formatem. To naprawdę bardziej przypomina elastyczny kontener, który może wykorzystywać wiele typów kompresji i obrazów. Myślę, że prawdopodobnie nie stanowi to problemu z samym plikiem, ponieważ program do wyświetlania obrazów na moim komputerze może wyświetlać plik zgodnie z oczekiwaniami. –

Odpowiedz

9

Jest to najprawdopodobniej spowodowane tym, że obrazy TIFF zawierają skompresowane dane JPEG wygenerowane przez Adobe Photoshop, które używają specjalnego znacznika do wskazania e poprawna przestrzeń kolorów. Chyba PIL nie zna tego znacznika (przynajmniej w osadzonym w TIFF JPEG), więc zakłada, że ​​obraz jest w przestrzeni kolorów YCbCr (co widać na zrzucie ekranu).

Zobacz szczegółową odpowiedź here, Wierzę, że to dokładnie twoja sprawa.

Możliwe rozwiązanie to konwersja plików JPEG na inne metody (bez skompresowanych danych JPEG). Na przykład, jeśli PIL udaje się poprawnie otworzyć twoje pliki JPEG, możesz przepisać TIFF za pomocą PIL:

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

OP stwierdza, że ​​obraz został utworzony w wierszu poleceń za pomocą narzędzia 'convert'. O ile rozumiem to pytanie, myślę, że problemem jest przekonanie się PIL do odczytania przekonwertowanego pliku tiff, nie znajdując lepszego sposobu na konwersję. –

+0

@Steven, uważam, że nie ma szybkiego sposobu, aby PIL poprawnie odczytał ten plik. Próbowałem falsyfikacji obrazu podczas czytania TIFF w 'TiffImagePlugin.py', bezskutecznie. Bazowy plik binarny PIL dekoduje osadzony jpeg w ten sam sposób. Przepraszam, że nie mogłem pomóc lepiej. –

Powiązane problemy