Étant donné que cette question est assez ancienne mais utile et que l'oreiller est plutôt préféré, pour un tutoriel basé sur l'oreiller, jetez un œil à ceci: pillow.readthedocs.org/en/latest/handbook/…
Comme il est dit, l'exemple provient de la documentation de pil, et cet exemple n'utilise pas (encore) l'indicateur d'antialias. Comme c'est probablement ce que la plupart des gens voudraient, je l'ai ajouté.
gnud
3
PIL définit la hauteur de la nouvelle image à la taille indiquée (128 ici) et calcule la largeur pour conserver le rapport hauteur / largeur. Existe-t-il un moyen de fixer la largeur au lieu de la hauteur? je vais peut-être poser cette question dans une question distincte.
eugene
6
@Eugene: essayez quelque chose comme s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)? (c'est pour la division en virgule flottante cependant :)
La documentation Python 3 pour PIL indique que cela thumbnailne fonctionne que si l'image résultante est plus petite que l'image d'origine. Pour cette raison, je suppose que l'utilisation resizeest la meilleure façon.
So S
254
Ce script redimensionnera une image (somepic.jpg) à l'aide de PIL (Python Imaging Library) à une largeur de 300 pixels et une hauteur proportionnelle à la nouvelle largeur. Pour ce faire, il détermine le pourcentage de 300 pixels de la largeur d'origine (img.size [0]), puis multiplie la hauteur d'origine (img.size [1]) par ce pourcentage. Remplacez «basewidth» par tout autre nombre pour modifier la largeur par défaut de vos images.
Si vous utilisez ce script dans Zope comme méthode externe, vous aurez besoin de la ligne "from PIL import Image" pour éviter les conflits d'espace de noms avec "Image" de Zope.
Tomvon
Ce code me donne un fichier de sortie de 0 octet sompic.jpg. Pourquoi cela arrive-t-il? J'utilise Python 3.x
imrek
- Mise à jour: la même chose se produit dans Python 2.7.
imrek
J'ai peut-être compris. Si vous enregistrez un .jpeg, utilisez img.save('sompic.jpg', 'JPEG').
imrek
5
nit: il n'y a pas d' PIL.Image.ANTIALIASoption pour resize, devrait en fait être PIL.Image.LANCZOS, bien qu'ils soient tous les deux 1en valeur, voir pillow.readthedocs.io/en/3.1.x/reference/…
Fred Wu
66
Je recommande également d'utiliser la méthode des miniatures de PIL, car elle vous supprime tous les problèmes de rapport.
Un indice important, cependant: remplacer
im.thumbnail(size)
avec
im.thumbnail(size,Image.ANTIALIAS)
par défaut, PIL utilise le filtre Image.NEAREST pour le redimensionnement, ce qui se traduit par de bonnes performances mais une mauvaise qualité.
Vos variables sont toutes mélangées. Votre message indique le redimensionnement de la largeur, puis redimensionne la hauteur. Et dans l' resizeappel, vous utilisez à la new_widthfois la hauteur et la largeur?
J'essayais de redimensionner certaines images pour un diaporama vidéo et à cause de cela, je ne voulais pas seulement une dimension maximale, mais une largeur maximale et une hauteur maximale (la taille de l'image vidéo).
Et il y avait toujours la possibilité d'une vidéo portrait ...
La Image.thumbnailméthode était prometteuse, mais je ne pouvais pas la faire monter en gamme une image plus petite.
Donc, après que je n'ai pas trouvé de moyen évident de le faire ici (ou à d'autres endroits), j'ai écrit cette fonction et l'ai mise ici pour celles à venir:
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)
Une méthode simple pour garder des rapports contraints et passer une largeur / hauteur maximale. Pas le plus joli mais fait le travail et est facile à comprendre:
La fonction récupère le fichier comme: "pic [0-9a-z]. [Extension]", les redimensionne à 120x120, déplace la section au centre et l'enregistre dans "ico [0-9a-z]. [Extension]", fonctionne avec portrait et paysage:
J'ajouterai également une version du redimensionnement qui maintient le rapport d'aspect fixe. Dans ce cas, il ajustera la hauteur pour correspondre à la largeur de la nouvelle image, en fonction du rapport hauteur / largeur initial, asp_rat , qui est float (!). Mais, pour ajuster la largeur à la hauteur, à la place, il vous suffit de commenter une ligne et de décommenter l'autre dans l' autre boucle . Vous verrez où.
Vous n'avez pas besoin des points-virgules (;), je les garde juste pour me rappeler la syntaxe des langages que j'utilise le plus souvent.
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");
Et c'est fait. J'ai essayé de le documenter autant que possible, donc c'est clair.
J'espère que cela pourrait être utile à quelqu'un là-bas!
Réponses:
Définissez une taille maximale. Ensuite, calculez un rapport de redimensionnement en prenant
min(maxwidth/width, maxheight/height)
.La bonne taille est
oldsize*ratio
.Il y a bien sûr aussi une méthode de bibliothèque pour ce faire: la méthode
Image.thumbnail
.Voici un exemple (modifié) de la documentation PIL .
la source
s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)
? (c'est pour la division en virgule flottante cependant :)ANTIALIAS
n'est plus préféré pour les utilisateurs de la populaire fourchette Pillow de PIL. pillow.readthedocs.org/en/3.0.x/releasenotes/…thumbnail
ne fonctionne que si l'image résultante est plus petite que l'image d'origine. Pour cette raison, je suppose que l'utilisationresize
est la meilleure façon.Ce script redimensionnera une image (somepic.jpg) à l'aide de PIL (Python Imaging Library) à une largeur de 300 pixels et une hauteur proportionnelle à la nouvelle largeur. Pour ce faire, il détermine le pourcentage de 300 pixels de la largeur d'origine (img.size [0]), puis multiplie la hauteur d'origine (img.size [1]) par ce pourcentage. Remplacez «basewidth» par tout autre nombre pour modifier la largeur par défaut de vos images.
la source
sompic.jpg
. Pourquoi cela arrive-t-il? J'utilise Python 3.x.jpeg
, utilisezimg.save('sompic.jpg', 'JPEG')
.PIL.Image.ANTIALIAS
option pourresize
, devrait en fait êtrePIL.Image.LANCZOS
, bien qu'ils soient tous les deux1
en valeur, voir pillow.readthedocs.io/en/3.1.x/reference/…Je recommande également d'utiliser la méthode des miniatures de PIL, car elle vous supprime tous les problèmes de rapport.
Un indice important, cependant: remplacer
avec
par défaut, PIL utilise le filtre Image.NEAREST pour le redimensionnement, ce qui se traduit par de bonnes performances mais une mauvaise qualité.
la source
Image.thumbnail
.Basé à @tomvon, j'ai fini d'utiliser les éléments suivants (choisissez votre cas):
a) Hauteur de redimensionnement ( je connais la nouvelle largeur, j'ai donc besoin de la nouvelle hauteur )
b) Largeur de redimensionnement ( je connais la nouvelle hauteur, j'ai donc besoin de la nouvelle largeur )
Alors juste:
la source
resize
appel, vous utilisez à lanew_width
fois la hauteur et la largeur?PIL a déjà la possibilité de recadrer une image
la source
la source
Si vous essayez de conserver le même rapport hauteur / largeur, ne redimensionneriez-vous pas un certain pourcentage de la taille d'origine?
Par exemple, la moitié de la taille d'origine
la source
J'utilise cette bibliothèque:
la source
Si vous ne voulez pas / n'avez pas besoin d'ouvrir l'image avec Pillow, utilisez ceci:
la source
Juste mettre à jour cette question avec un wrapper plus moderne Cette bibliothèque enveloppe Pillow (une fourchette de PIL) https://pypi.org/project/python-resize-image/
Vous permettant de faire quelque chose comme ça: -
Des tas d'autres exemples dans le lien ci-dessus.
la source
J'essayais de redimensionner certaines images pour un diaporama vidéo et à cause de cela, je ne voulais pas seulement une dimension maximale, mais une largeur maximale et une hauteur maximale (la taille de l'image vidéo).
Et il y avait toujours la possibilité d'une vidéo portrait ...
La
Image.thumbnail
méthode était prometteuse, mais je ne pouvais pas la faire monter en gamme une image plus petite.Donc, après que je n'ai pas trouvé de moyen évident de le faire ici (ou à d'autres endroits), j'ai écrit cette fonction et l'ai mise ici pour celles à venir:
la source
Une méthode simple pour garder des rapports contraints et passer une largeur / hauteur maximale. Pas le plus joli mais fait le travail et est facile à comprendre:
Voici un script python qui utilise cette fonction pour exécuter le redimensionnement d'image par lots.
la source
Ont mis à jour la réponse ci-dessus par "tomvon"
la source
Mon vilain exemple.
La fonction récupère le fichier comme: "pic [0-9a-z]. [Extension]", les redimensionne à 120x120, déplace la section au centre et l'enregistre dans "ico [0-9a-z]. [Extension]", fonctionne avec portrait et paysage:
la source
J'ai redimensionné l'image de cette manière et ça fonctionne très bien
la source
J'ajouterai également une version du redimensionnement qui maintient le rapport d'aspect fixe. Dans ce cas, il ajustera la hauteur pour correspondre à la largeur de la nouvelle image, en fonction du rapport hauteur / largeur initial, asp_rat , qui est float (!). Mais, pour ajuster la largeur à la hauteur, à la place, il vous suffit de commenter une ligne et de décommenter l'autre dans l' autre boucle . Vous verrez où.
Vous n'avez pas besoin des points-virgules (;), je les garde juste pour me rappeler la syntaxe des langages que j'utilise le plus souvent.
Et c'est fait. J'ai essayé de le documenter autant que possible, donc c'est clair.
J'espère que cela pourrait être utile à quelqu'un là-bas!
la source
Ouvrez votre fichier image
Utilisez la méthode PIL Image.resize (size, resample = 0) , où vous remplacez (largeur, hauteur) de votre image par la taille 2-tuple.
Cela affichera votre image à sa taille d'origine:
Cela affichera votre image à la moitié de la taille:
Cela affichera votre image au 1/3 de la taille:
Cela affichera votre image à 1/4 de la taille:
etc
la source
display()
et où est-il situé?la source
Vous pouvez redimensionner l'image par le code ci-dessous:
la source