Como essa pergunta é bastante antiga, mas útil, e o travesseiro é bastante preferido, para um tutorial baseado em travesseiros, dê uma olhada no seguinte: pillow.readthedocs.org/en/latest/handbook/…
A última versão do PIL foi em 2006. A embalagem de travesseiros é a substituição, tanto quanto eu sei. O último lançamento do Pillow foi em 2 de abril de 2020.
David Medinets
Respostas:
477
Defina um tamanho máximo. Em seguida, calcule uma taxa de redimensionamento usando min(maxwidth/width, maxheight/height).
O tamanho adequado é oldsize*ratio.
Obviamente, também existe um método de biblioteca para fazer isso: o método Image.thumbnail.
Abaixo está um exemplo (editado) da documentação do PIL .
import os, sys
importImage
size =128,128for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0]+".thumbnail"if infile != outfile:try:
im =Image.open(infile)
im.thumbnail(size,Image.ANTIALIAS)
im.save(outfile,"JPEG")exceptIOError:print"cannot create thumbnail for '%s'"% infile
Como se costuma dizer, o exemplo foi da documentação do pil e esse exemplo (ainda) não usa a bandeira antialias. Como provavelmente é o que a maioria das pessoas gostaria, eu adicionei.
precisa saber é o seguinte
3
PIL define a altura da nova imagem para o tamanho fornecido (128 aqui) e calcula a largura para manter a proporção. Existe uma maneira de corrigir a largura em vez da altura? talvez eu faça isso em outra pergunta.
Eugene
6
@ Eugene: tente algo como s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)? (isso é para divisão de ponto flutuante :)
A documentação do Python 3 para PIL diz que thumbnailsó funciona se a imagem resultante for menor que a original. Por isso, acho que usar resizeé o melhor caminho.
S
253
Esse script redimensionará uma imagem (somepic.jpg) usando PIL (Python Imaging Library) para uma largura de 300 pixels e uma altura proporcional à nova largura. Ele faz isso determinando qual a porcentagem de 300 pixels da largura original (img.size [0]) e multiplicando a altura original (img.size [1]) por essa porcentagem. Altere "largura da base" para qualquer outro número para alterar a largura padrão das suas imagens.
Se você estiver usando este script no Zope como um método externo, precisará da linha "from PIL import Image" para evitar conflitos de namespace com a "Image" do Zope.
tomvon
Esse código me fornece um arquivo de saída de 0 byte sompic.jpg. Por que isso acontece? Estou usando o Python 3.x
imrek 26/03
- Atualização: o mesmo acontece no Python 2.7.
imrek
Eu posso ter descoberto. Se você estiver salvando um .jpeg, use img.save('sompic.jpg', 'JPEG').
Suas variáveis estão todas misturadas. Sua postagem diz redimensionar a largura e redimensiona a altura. E na resizechamada, você está usando o new_widthpara altura e largura?
Eu estava tentando redimensionar algumas imagens para um vídeo de apresentação de slides e, por isso, queria não apenas uma dimensão máxima, mas uma largura e uma altura máximas (o tamanho do quadro do vídeo).
E sempre havia a possibilidade de um vídeo em retrato ...
O Image.thumbnailmétodo era promissor, mas não consegui torná-lo melhor para uma imagem menor.
Então, depois que não consegui encontrar uma maneira óbvia de fazer isso aqui (ou em outros lugares), escrevi esta função e a coloquei aqui para as seguintes:
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)
Um método simples para manter relações restritas e passar uma largura / altura máximas. Não é a mais bonita, mas realiza o trabalho e é fácil de entender:
A função obtém um arquivo como: "pic [0-9a-z]. [Extension]", redimensiona-o para 120x120, move a seção para o centro e salva em "ico [0-9a-z]. [Extension]", trabalha com retrato e paisagem:
Também adicionarei uma versão do redimensionamento que mantém a proporção fixa. Nesse caso, ele ajustará a altura para corresponder à largura da nova imagem, com base na proporção inicial, asp_rat , que é flutuante (!). Mas, para ajustar a largura à altura, basta comentar uma linha e descomentar a outra no loop else . Você verá onde.
Você não precisa de ponto e vírgula (;), guardo-os apenas para me lembrar da sintaxe dos idiomas que utilizo com mais frequência.
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");
E está feito. Tentei documentá-lo o máximo possível, para que fique claro.
Respostas:
Defina um tamanho máximo. Em seguida, calcule uma taxa de redimensionamento usando
min(maxwidth/width, maxheight/height)
.O tamanho adequado é
oldsize*ratio
.Obviamente, também existe um método de biblioteca para fazer isso: o método
Image.thumbnail
.Abaixo está um exemplo (editado) da documentação do PIL .
fonte
s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)
? (isso é para divisão de ponto flutuante :)ANTIALIAS
não é mais preferido para os usuários do popular travesseiro de forquilha da PIL. pillow.readthedocs.org/pt/3.0.x/releasenotes/…thumbnail
só funciona se a imagem resultante for menor que a original. Por isso, acho que usarresize
é o melhor caminho.Esse script redimensionará uma imagem (somepic.jpg) usando PIL (Python Imaging Library) para uma largura de 300 pixels e uma altura proporcional à nova largura. Ele faz isso determinando qual a porcentagem de 300 pixels da largura original (img.size [0]) e multiplicando a altura original (img.size [1]) por essa porcentagem. Altere "largura da base" para qualquer outro número para alterar a largura padrão das suas imagens.
fonte
sompic.jpg
. Por que isso acontece? Estou usando o Python 3.x.jpeg
, useimg.save('sompic.jpg', 'JPEG')
.PIL.Image.ANTIALIAS
opção pararesize
, realmente deve serPIL.Image.LANCZOS
, embora sejam ambos1
em valor, ver pillow.readthedocs.io/en/3.1.x/reference/...Também recomendo usar o método de miniatura do PIL, porque ele remove todos os aborrecimentos da proporção.
Uma dica importante, no entanto: Substitua
com
por padrão, o PIL usa o filtro Image.NEAREST para redimensionar o que resulta em bom desempenho, mas baixa qualidade.
fonte
Image.thumbnail
.Baseado em @tomvon, terminei de usar o seguinte (escolha seu caso):
a) Redimensionando a altura ( conheço a nova largura, preciso da nova altura )
b) Redimensionando a largura ( eu conheço a nova altura, então preciso da nova largura )
Então apenas:
fonte
resize
chamada, você está usando onew_width
para altura e largura?O PIL já tem a opção de cortar uma imagem
fonte
fonte
Se você está tentando manter a mesma proporção, não redimensiona uma porcentagem do tamanho original?
Por exemplo, metade do tamanho original
fonte
Eu uso esta biblioteca:
fonte
Se você não deseja / não precisa abrir uma imagem com Pillow, use o seguinte:
fonte
Atualizando esta pergunta com um invólucro mais moderno. Esta biblioteca envolve o Pillow (um garfo do PIL) https://pypi.org/project/python-resize-image/
Permitindo que você faça algo assim: -
Amontoa mais exemplos no link acima.
fonte
Eu estava tentando redimensionar algumas imagens para um vídeo de apresentação de slides e, por isso, queria não apenas uma dimensão máxima, mas uma largura e uma altura máximas (o tamanho do quadro do vídeo).
E sempre havia a possibilidade de um vídeo em retrato ...
O
Image.thumbnail
método era promissor, mas não consegui torná-lo melhor para uma imagem menor.Então, depois que não consegui encontrar uma maneira óbvia de fazer isso aqui (ou em outros lugares), escrevi esta função e a coloquei aqui para as seguintes:
fonte
Um método simples para manter relações restritas e passar uma largura / altura máximas. Não é a mais bonita, mas realiza o trabalho e é fácil de entender:
Aqui está um script python que usa essa função para executar o redimensionamento de imagens em lote.
fonte
Atualizou a resposta acima por "tomvon"
fonte
Meu exemplo feio.
A função obtém um arquivo como: "pic [0-9a-z]. [Extension]", redimensiona-o para 120x120, move a seção para o centro e salva em "ico [0-9a-z]. [Extension]", trabalha com retrato e paisagem:
fonte
Eu redimensiono a imagem dessa maneira e está funcionando muito bem
fonte
Também adicionarei uma versão do redimensionamento que mantém a proporção fixa. Nesse caso, ele ajustará a altura para corresponder à largura da nova imagem, com base na proporção inicial, asp_rat , que é flutuante (!). Mas, para ajustar a largura à altura, basta comentar uma linha e descomentar a outra no loop else . Você verá onde.
Você não precisa de ponto e vírgula (;), guardo-os apenas para me lembrar da sintaxe dos idiomas que utilizo com mais frequência.
E está feito. Tentei documentá-lo o máximo possível, para que fique claro.
Espero que possa ser útil para alguém lá fora!
fonte
Abra seu arquivo de imagem
Use o método PIL Image.resize (tamanho, resample = 0) , onde você substitui (largura, altura) da sua imagem pelo tamanho 2-tupla.
Isso exibirá sua imagem no tamanho original:
Isso exibirá sua imagem com metade do tamanho:
Isso exibirá sua imagem em 1/3 do tamanho:
Isso exibirá sua imagem em 1/4 do tamanho:
etc etc
fonte
display()
e onde está localizado?fonte
Você pode redimensionar a imagem pelo código abaixo:
fonte