2009-09-06 12 views
8

Dostaję o tej samej złe patrząc rozmiaru ze wszystkich 4 algorytmów PILPIL: zmiana rozmiaru obrazu: algorytm podobny do Firefoksa

>>> data = utils.fetch("http://wavestock.com/images/beta-icon.gif") 
>>> image = Image.open(StringIO.StringIO(data)); image.save("/home/ptarjan/www/tmp/metaward/original.png") 
>>> 
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.ANTIALIAS).save("/home/ptarjan/www/tmp/metaward/antialias.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.BILINEAR).save("/home/ptarjan/www/tmp/metaward/bilinear.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.BICUBIC).save("/home/ptarjan/www/tmp/metaward/bicubic.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.NEAREST).save("/home/ptarjan/www/tmp/metaward/nearest.png") 
>>> 
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.ANTIALIAS); image.save("/home/ptarjan/www/tmp/metaward/antialias-thumb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.BILINEAR); image.save("/home/ptarjan/www/tmp/metaward/bilinear-thumb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.BICUBIC); image.save("/home/ptarjan/www/tmp/metaward/bicubic-thumb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.NEAREST); image.save("/home/ptarjan/www/tmp/metaward/nearest-thumb.png") 
>>> 
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.ANTIALIAS).save("/home/ptarjan/www/tmp/metaward/antialias-rgb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.BILINEAR).save("/home/ptarjan/www/tmp/metaward/bilinear-rgb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.BICUBIC).save("/home/ptarjan/www/tmp/metaward/bicubic-rgb.png") 
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.NEAREST).save("/home/ptarjan/www/tmp/metaward/nearest-rgb.png") 

Ale wyniki wyglądają znacznie gorzej, że tylko zmiana rozmiaru w Firefoksie.

http://paulisageek.com/tmp/metaward/images.html

Jak mogę uzyskać podobny efekt do wyniku firefox używając PIL (Python lub innego obrazu Library)?

EDIT: Najedź myszką, aby zobaczyć, co każdy obraz jest

http://paulisageek.com/tmp/metaward/original.png http://paulisageek.com/tmp/metaward/antialias.png http://paulisageek.com/tmp/metaward/bicubic.png http://paulisageek.com/tmp/metaward/bilinear.png http://paulisageek.com/tmp/metaward/nearest.png http://paulisageek.com/tmp/metaward/antialias-thumb.png http://paulisageek.com/tmp/metaward/bicubic-thumb.png http://paulisageek.com/tmp/metaward/bilinear-thumb.png http://paulisageek.com/tmp/metaward/nearest-thumb.png http://paulisageek.com/tmp/metaward/antialias-rgb.png http://paulisageek.com/tmp/metaward/bicubic-rgb.png http://paulisageek.com/tmp/metaward/bilinear-rgb.png http://paulisageek.com/tmp/metaward/nearest-rgb.png

Wygląda na to, że RGB, a następnie ANTIALIS wygląda najlepiej. Jakieś inne rekomendacje?

Dla porównania, to jest ten, który wyglądał najlepiej:

>>> image = Image.open(StringIO.StringIO(data)); 
>>> image.convert("RGB").resize((36,36), Image.ANTIALIAS) 
+0

Jaką wersję PIL używasz? –

+0

Wersja PIL: /usr/lib/python2.5/site-packages/PIL/PIL-1.1.6.egg-info –

+0

Gimp daje taki sam wynik jak PIL. –

Odpowiedz

8

Zmieniłem rozmiar "oryginału" w Pythonie i odnalazłem te same wyniki, co Ty. Zmieniłem także rozmiar "oryginału" w GIMP i otrzymałem taką samą (jeśli nie gorszą) jakość. To sprawiło, że podejrzewałem, że Firefox oszukuje. Prawdopodobnie konwertuje się do RGB (tryb "oryginalny" ma kolor indeksowany). Tak więc następujący kod:

import Image 
im=Image.open("beta-icon.gif") 
im = im.convert("RGB") 
im=im.resize((36,36), Image.ANTIALIAS) 
im.save("q5.png") 

Wynik jest prawie tak dobry, jak w Firefoksie.

+0

Czy to jest strategia ogólnego celu, aby uzyskać dobre miniatury? Jeśli chcesz mieć przykład mojego korpusu, mam około 10 000 zdjęć: http://metaward.com/awards –

+2

Zdecydowanie. Zmiana rozmiaru obrazów za pomocą indeksowanych kolorów zwykle nie zapewnia dobrych wyników. Jeśli nie zależy Ci na zachowaniu palety, zawsze powinieneś przenieść się do RGB, a następnie zmienić rozmiar i (w przypadku) zmniejszyć ponownie głębię kolorów. –

+0

Dzięki Roberto. Dlaczego PIL nie zrobiłby tego domyślnie, jeśli jest to znana metoda? –

0

Spróbuj użyć metody resize() zamiast thumbnail(). Z mojego doświadczenia wynika, że ​​zachowują się bardzo różnie.

Twój kod zawiera także odczyt .gif, ale twój oryginał to .png. Upewnij się, że masz naprawdę wszystkie oryginalne dane, zanim zaczniesz je zmniejszać.

+0

Przepraszam, wyciąłem linię gdzie zrobiłem oryginał. Ale tak, to było tylko nawrócenie. Spróbuję zmienić rozmiar i porównać. –

+0

Przykładową stroną jest teraz cała wielkość() i nadal wyglądają znacznie gorzej niż sposób FF. Jakieś inne sugestie? –

1

Wygląda na to, że RGB, a następnie ANTIALIS wygląda najlepiej. Jakieś inne rekomendacje?

Nie, to rzeczywiście oczekiwany wynik. Wszelkie zmiany rozmiaru wykonane w oryginalnym ograniczonym trybie palety mogą powodować marnotrawstwo śmieci z powodu braku dostępnych pomiędzy nimi kolorów w palecie; a ANTIALIAS to filtr zmiany rozmiaru, który ma być używany do skalowania w dół: BILINEAR i BICUBIC rzeczywiście zajmują tylko dwa piksele na oś i łączą się między nimi, co jest dobre dla skalowania, ale nie działa w ogóle, gdy jeden lub oba osie są przeskalowane w dół.

Niestety thumbnail() nigdy tak naprawdę nie działało poprawnie, więc musisz zrobić to sam.

+0

następnie chciałbym mieć .thumbnail usunąć i zastąpić .thumbnail (rozmiar), który konwertuje palety w razie potrzeby, a następnie używa zmiany rozmiaru. Jako nowicjusz w PIL, .thumbnail wydawał się dokładnie tym, czego potrzebowałem. –

+0

Rzeczywiście, jest to jedno z podejrzanych zakrętów PIL, które można poprawić, ale także atrakcyjnie wyglądającą pułapkę dla nowego użytkownika. – bobince

+0

Właściwie robiąc to z RGB, straciłem kanał alfa. Jakikolwiek sposób to zatrzymać? –

Powiązane problemy