Ponieważ to pytanie jest dość stare, ale przydatne, a poduszka jest raczej preferowana, w samouczku opartym na poduszkach spójrz na to: pillow.readthedocs.org/en/latest/handbook/…
Jak to mówi, przykład pochodzi z dokumentacji pil, a ten przykład (nadal) nie używa flagi antyialiasowej. Ponieważ prawdopodobnie tego chciałby większość ludzi, dodałem to.
gnud,
3
PIL ustawia wysokość nowego obrazu na podany rozmiar (tutaj 128) i oblicz szerokość, aby zachować proporcje. Czy istnieje sposób, aby ustalić szerokość zamiast wysokości? może zadam to w osobnym pytaniu.
eugene
6
@Eugene: spróbuj czegoś takiego s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)? (dotyczy to jednak podziału zmiennoprzecinkowego :)
Dokumentacja Pythona 3 dla PIL mówi, że thumbnaildziała tylko wtedy, gdy obraz wynikowy jest mniejszy niż oryginalny. Z tego powodu zgaduję, że używanie resizejest lepszym sposobem.
So S
253
Skrypt zmieni rozmiar obrazu (somepic.jpg) przy użyciu PIL (Python Imaging Library) do szerokości 300 pikseli i wysokości proporcjonalnej do nowej szerokości. Dokonuje tego poprzez określenie, jaki procent 300 pikseli ma oryginalną szerokość (img.size [0]), a następnie pomnożenie pierwotnej wysokości (img.size [1]) przez ten procent. Zmień „szerokość pasma” na dowolną inną liczbę, aby zmienić domyślną szerokość zdjęć.
Jeśli używasz tego skryptu w Zope jako metody zewnętrznej, potrzebujesz linii „z obrazu importu PIL”, aby uniknąć kolizji przestrzeni nazw z „obrazem” Zope.
tomvon
Ten kod daje mi 0 bajtowy plik wyjściowy sompic.jpg. Dlaczego to się dzieje? Używam Python 3.x
imrek
- Aktualizacja: to samo dzieje się w Pythonie 2.7.
imrek
Mogłem się domyślić. Jeśli zapisujesz a .jpeg, użyj img.save('sompic.jpg', 'JPEG').
Twoje zmienne są pomieszane. Twój post mówi o zmianie rozmiaru, a następnie zmianie rozmiaru. A w resizerozmowie używasz new_widthzarówno wysokości, jak i szerokości?
resize_contain wygląda właściwie całkiem przydatny!
Anytoe
4
Próbowałem zmienić rozmiar niektórych zdjęć do pokazu slajdów i dlatego chciałem nie tylko jednego maksymalnego wymiaru, ale maksymalnej szerokości i maksymalnej wysokości (rozmiaru klatki wideo).
I zawsze istniała możliwość wideo portret ... Image.thumbnail metoda została obiecujące, ale nie mogłem zrobić to ekskluzywny mniejszy obraz.
Więc po tym, jak nie mogłem znaleźć oczywistego sposobu, aby to zrobić tutaj (lub w niektórych innych miejscach), napisałem tę funkcję i umieściłem ją tutaj dla tych, które mają przyjść:
from PIL importImagedef get_resized_img(img_path, video_size):
img =Image.open(img_path)
width, height = video_size # these are the MAX dimensions
video_ratio = width / height
img_ratio = img.size[0]/ img.size[1]if video_ratio >=1:# the video is wideif img_ratio <= video_ratio:# image is not wide enough
width_new = int(height * img_ratio)
size_new = width_new, height
else:# image is wider than video
height_new = int(width / img_ratio)
size_new = width, height_new
else:# the video is tallif img_ratio >= video_ratio:# image is not tall enough
height_new = int(width / img_ratio)
size_new = width, height_new
else:# image is taller than video
width_new = int(height * img_ratio)
size_new = width_new, height
return img.resize(size_new, resample=Image.LANCZOS)
Prosta metoda utrzymania ograniczonych proporcji i przekroczenia maksymalnej szerokości / wysokości. Nie najładniejsza, ale wykonuje pracę i jest łatwa do zrozumienia:
Funkcja pobiera plik w rodzaju: „pic [0-9a-z]. [Rozszerzenie]”, zmienia rozmiar na 120x120, przenosi sekcję do środka i zapisuje w „ico [0-9a-z]. [Rozszerzenie]”, działa z portretem i krajobraz:
Dodam również wersję zmiany rozmiaru, która utrzymuje stały współczynnik kształtu. W takim przypadku dostosuje wysokość, aby dopasować szerokość nowego obrazu, na podstawie początkowego współczynnika kształtu asp_rat , który jest zmiennoprzecinkowy (!). Aby jednak dopasować szerokość do wysokości, wystarczy skomentować jedną linię i odkomentować drugą w pętli else . Zobaczysz gdzie.
Nie potrzebujesz średników (;), zachowuję je tylko po to, aby przypomnieć sobie składnię języków, których używam częściej.
from PIL importImage
img_path ="filename.png";
img =Image.open(img_path);# puts our image to the buffer of the PIL.Image object
width, height = img.size;
asp_rat = width/height;# Enter new width (in pixels)
new_width =50;# Enter new height (in pixels)
new_height =54;
new_rat = new_width/new_height;if(new_rat == asp_rat):
img = img.resize((new_width, new_height),Image.ANTIALIAS);# adjusts the height to match the width# NOTE: if you want to adjust the width to the height, instead -> # uncomment the second line (new_width) and comment the first one (new_height)else:
new_height = round(new_width / asp_rat);#new_width = round(new_height * asp_rat);
img = img.resize((new_width, new_height),Image.ANTIALIAS);# usage: resize((x,y), resample)# resample filter -> PIL.Image.BILINEAR, PIL.Image.NEAREST (default), PIL.Image.BICUBIC, etc..# https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize# Enter the name under which you would like to save the new image
img.save("outputname.png");
I gotowe. Próbowałem to udokumentować, jak tylko potrafię, więc jest jasne.
Odpowiedzi:
Określ maksymalny rozmiar. Następnie oblicz współczynnik zmiany rozmiaru, biorąc
min(maxwidth/width, maxheight/height)
.Właściwy rozmiar to
oldsize*ratio
.Istnieje oczywiście również metoda biblioteczna: metoda
Image.thumbnail
.Poniżej znajduje się (zredagowany) przykład z dokumentacji PIL .
źródło
s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)
? (dotyczy to jednak podziału zmiennoprzecinkowego :)ANTIALIAS
nie jest już preferowany dla użytkowników popularnego widelca Pillow PIL. pillow.readthedocs.org/en/3.0.x/releasenotes/…thumbnail
działa tylko wtedy, gdy obraz wynikowy jest mniejszy niż oryginalny. Z tego powodu zgaduję, że używanieresize
jest lepszym sposobem.Skrypt zmieni rozmiar obrazu (somepic.jpg) przy użyciu PIL (Python Imaging Library) do szerokości 300 pikseli i wysokości proporcjonalnej do nowej szerokości. Dokonuje tego poprzez określenie, jaki procent 300 pikseli ma oryginalną szerokość (img.size [0]), a następnie pomnożenie pierwotnej wysokości (img.size [1]) przez ten procent. Zmień „szerokość pasma” na dowolną inną liczbę, aby zmienić domyślną szerokość zdjęć.
źródło
sompic.jpg
. Dlaczego to się dzieje? Używam Python 3.x.jpeg
, użyjimg.save('sompic.jpg', 'JPEG')
.PIL.Image.ANTIALIAS
opcjiresize
, powinien byćPIL.Image.LANCZOS
, chociaż oba są1
wartościowe, zobacz pillow.readthedocs.io/en/3.1.x/reference/…Polecam również użycie metody miniatury PIL, ponieważ usuwa ona wszystkie problemy związane z proporcjami.
Jedna ważna wskazówka: zamień
z
domyślnie PIL używa filtra Image.NEAREST do zmiany rozmiaru, co powoduje dobrą wydajność, ale słabą jakość.
źródło
Image.thumbnail
.Na podstawie @tomvon, skończyłem używać następujących (wybierz swoją skrzynkę):
a) Zmiana rozmiaru wysokości ( znam nową szerokość, więc potrzebuję nowej wysokości )
b) Zmiana rozmiaru szerokości ( znam nową wysokość, więc potrzebuję nowej szerokości )
Więc po prostu:
źródło
resize
rozmowie używasznew_width
zarówno wysokości, jak i szerokości?PIL ma już opcję przycięcia obrazu
źródło
źródło
Jeśli próbujesz zachować ten sam współczynnik kształtu, to czy nie zmieniłbyś rozmiaru o pewien procent oryginalnego rozmiaru?
Na przykład połowa oryginalnego rozmiaru
źródło
Korzystam z tej biblioteki:
źródło
Jeśli nie chcesz / nie musisz otwierać obrazu w Pillow, użyj tego:
źródło
Właśnie aktualizuję to pytanie o nowocześniejsze opakowanie Ta biblioteka otacza Pillow (rozwidlenie PIL) https://pypi.org/project/python-resize-image/
Umożliwiając zrobienie czegoś takiego: -
Więcej przykładów w powyższym linku.
źródło
Próbowałem zmienić rozmiar niektórych zdjęć do pokazu slajdów i dlatego chciałem nie tylko jednego maksymalnego wymiaru, ale maksymalnej szerokości i maksymalnej wysokości (rozmiaru klatki wideo).
I zawsze istniała możliwość wideo portret ...
Image.thumbnail
metoda została obiecujące, ale nie mogłem zrobić to ekskluzywny mniejszy obraz.Więc po tym, jak nie mogłem znaleźć oczywistego sposobu, aby to zrobić tutaj (lub w niektórych innych miejscach), napisałem tę funkcję i umieściłem ją tutaj dla tych, które mają przyjść:
źródło
Prosta metoda utrzymania ograniczonych proporcji i przekroczenia maksymalnej szerokości / wysokości. Nie najładniejsza, ale wykonuje pracę i jest łatwa do zrozumienia:
Oto skrypt Pythona, który używa tej funkcji do uruchamiania zmiany wielkości obrazu wsadowego.
źródło
Zaktualizowałem powyższą odpowiedź przez „tomvon”
źródło
Mój brzydki przykład.
Funkcja pobiera plik w rodzaju: „pic [0-9a-z]. [Rozszerzenie]”, zmienia rozmiar na 120x120, przenosi sekcję do środka i zapisuje w „ico [0-9a-z]. [Rozszerzenie]”, działa z portretem i krajobraz:
źródło
Zmieniłem rozmiar obrazu w taki sposób i działa bardzo dobrze
źródło
Dodam również wersję zmiany rozmiaru, która utrzymuje stały współczynnik kształtu. W takim przypadku dostosuje wysokość, aby dopasować szerokość nowego obrazu, na podstawie początkowego współczynnika kształtu asp_rat , który jest zmiennoprzecinkowy (!). Aby jednak dopasować szerokość do wysokości, wystarczy skomentować jedną linię i odkomentować drugą w pętli else . Zobaczysz gdzie.
Nie potrzebujesz średników (;), zachowuję je tylko po to, aby przypomnieć sobie składnię języków, których używam częściej.
I gotowe. Próbowałem to udokumentować, jak tylko potrafię, więc jest jasne.
Mam nadzieję, że może się przydać komuś!
źródło
Otwórz plik obrazu
Użyj metody PIL Image.resize (size, resample = 0) , w której zamieniasz (szerokość, wysokość) obrazu na rozmiar 2-krotny.
Spowoduje to wyświetlenie obrazu w oryginalnym rozmiarze:
Spowoduje to wyświetlenie obrazu w rozmiarze 1/2:
Spowoduje to wyświetlenie obrazu w rozmiarze 1/3:
Spowoduje to wyświetlenie obrazu w rozmiarze 1/4:
itd itd
źródło
display()
i gdzie się znajduje?źródło
Możesz zmienić rozmiar obrazu za pomocą poniższego kodu:
źródło