2013-10-10 19 views
9

Obrazy JPEG utworzone za pomocą funkcji PIL (1.1.7) mają bardzo niską jakość. Oto przykład:Dlaczego jakość obrazów JPEG generowanych przez PIL jest tak niska?

Wejście: http://s23.postimg.org/8bks3x5p7/cover_1.jpg

wyjściowa: http://s23.postimg.org/68ey9zva3/cover_2.jpg

Wyjście została stworzona za pomocą następującego kodu:

from PIL import Image 
im = Image.open('/path/to/cover_1.jpg') 
im.save('/path/to/cover_2.jpg', format='JPEG', quality=100) 

czerwony tekst wygląda naprawdę okropne. Zapis obrazu z GIMP lub Photoshopem nie jest nawet bliski złej jakości stworzonej przez PIL. Czy ktoś wie, dlaczego tak się dzieje i jak można go rozwiązać?

Dzięki za pomoc!

+1

Zapisujesz JPEG JPEG. Tracisz informacje dwa razy. Czy jesteś pewien, że GIMP i Photoshop ponownie przetwarzają pliki JPEG, a nie tylko zapisują je w niezmienionej postaci (ponieważ programy rozpoznają je jako JPEG i dlatego nic nie robią)? – John

+0

Dziękujemy za szybką odpowiedź. Mam świadomość, że dwa razy tracę informacje. To tylko bardzo prosty przykład. W produkcji zmieniam również rozmiar obrazu :). Również, jeśli zmieniam rozmiar obrazu w GIMP lub Photoshopie, wynikowy obraz wygląda znacznie ostrzej. Te dwie osoby wyglądają prawie tak samo na dwóch zdjęciach, ale czerwony tekst wygląda zupełnie inaczej. – Pascal

+0

Nie wątpię, że wygląda ostrzej niż GIMP/Photoshop. Ale czy jest to * inny * od obrazu wejściowego? Po zapisaniu go jako JPEG z GIMP/Photoshopa, czy coś się zmieniło? Jeśli odpowiedź brzmi "nie", to PIL może wyglądać "źle", ponieważ faktycznie stosuje kompresję JPEG, podczas gdy druga nie. Widzisz, w co się pakuję? – John

Odpowiedz

23

Istnieją dwie części jakości JPEG. Pierwszym z nich jest ustawienie quality, dla którego ustawiono już najwyższą możliwą wartość.

JPEG używa także chroma subsampling, zakładając, że zmiany odcienia koloru są mniej ważne niż zmiany jasności, a niektóre informacje można bezpiecznie wyrzucić. Niestety, w wymagających aplikacjach nie zawsze tak jest i najłatwiej zauważyć to na czerwonych krawędziach. PIL nie wystawia udokumentowanego ustawienia kontrolującego ten aspekt.

Edit Pascal Beyeler:

Właśnie znalazłem opcję, która wyłącza subsampling. Możesz ustawić podpróbkowanie = 0 podczas zapisywania obrazu, a obraz wygląda ostrzej! Dzięki za znak pomocy!

im.save('/path/to/cover-2.jpg', format='JPEG', subsampling=0, quality=100) 
Powiązane problemy