Comment redimensionner une image en utilisant PIL et maintenir son format?
est - ce qu'il y a une façon évidente de faire ça que je ne vois pas? J'essaie juste de faire des miniatures.
11 réponses
définit une taille maximale.
Ensuite, calculez un rapport de redimensionnement en prenant min(maxwidth/width, maxheight/height)
.
la taille appropriée est oldsize*ratio
.
il y a bien sûr aussi une méthode de bibliothèque pour faire cela: la méthode Image.thumbnail
.
Vous trouverez ci-dessous un exemple (modifié) tiré de la documentation PIL .
import os, sys
import Image
size = 128, 128
for 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")
except IOError:
print "cannot create thumbnail for '%s'" % infile
ce script redimensionne une image (somepic.jpg) en utilisant PIL (Python Imaging Library) à une largeur de 300 pixels et une hauteur proportionnelle à la nouvelle largeur. Il le fait en déterminant quel pourcentage 300 pixels est de la largeur originale (img.taille[0]), puis en multipliant la hauteur d'origine (img.taille[1]) par ce pourcentage. Changez "basewidth" en n'importe quel autre nombre pour changer la largeur par défaut de vos images.
from PIL import Image
basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('sompic.jpg')
je recommande également d'utiliser la méthode des vignettes PIL, car elle élimine tous les tracas de ratio de vous.
un indice important: remplacer
im.thumbnail(size)
avec
im.thumbnail(size,Image.ANTIALIAS)
par défaut, PIL utilise l'Image.Filtre le plus proche pour le redimensionnement qui se traduit par de bonnes performances, mais de mauvaise qualité.
basé à @tomvon, j'ai fini en utilisant ce qui suit:
largeur de redimensionnement:
new_width = 680
new_height = new_width * height / width
redimensionnement hauteur:
new_height = 680
new_width = new_height * width / height
puis juste:
img = img.resize((new_width, new_height), Image.ANTIALIAS)
PIL a déjà l'option de recadrer une image
img = ImageOps.fit(img, size, Image.ANTIALIAS)
si vous essayez de maintenir le même format d'image, alors ne redimensionneriez-vous pas d'un certain pourcentage de la taille d'origine?
par exemple, la moitié de la taille d'origine
half = 0.5
out = im.resize( [int(half * s) for s in im.size] )
from PIL import Image
img = Image.open('/your iamge path/image.jpg') # image extension *.png,*.jpg
new_width = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what u want ,*.png,*jpg,*.gif
from PIL import Image
from resizeimage import resizeimage
def resize_file(in_file, out_file, size):
with open(in_file) as fd:
image = resizeimage.resize_thumbnail(Image.open(fd), size)
image.save(out_file)
image.close()
resize_file('foo.tif', 'foo_small.jpg', (256, 256))
j'utilise cette bibliothèque:
pip install python-resize-image
mon horrible exemple.
"151910920 de la Fonction" extraire le fichier comme: "pic[0-9a-z].[extension]", les redimensionner à 120x120, déplace la section au centre et enregistrer à "ico[0-9a-z].[extension]", œuvres avec portrait et paysage:def imageResize(filepath):
from PIL import Image
file_dir=os.path.split(filepath)
img = Image.open(filepath)
if img.size[0] > img.size[1]:
aspect = img.size[1]/120
new_size = (img.size[0]/aspect, 120)
else:
aspect = img.size[0]/120
new_size = (120, img.size[1]/aspect)
img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:])
img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:])
if img.size[0] > img.size[1]:
new_img = img.crop( (
(((img.size[0])-120)/2),
0,
120+(((img.size[0])-120)/2),
120
) )
else:
new_img = img.crop( (
0,
(((img.size[1])-120)/2),
120,
120+(((img.size[1])-120)/2)
) )
new_img.save(file_dir[0]+'/ico'+file_dir[1][3:])
je mets à jour cette question avec un papier d'emballage plus moderne Cette bibliothèque enveloppe oreiller (une fourchette de PIL) https://pypi.org/project/python-resize-image /
vous Permettant de faire quelque chose comme ceci :-
from PIL import Image
from resizeimage import resizeimage
fd_img = open('test-image.jpeg', 'r')
img = Image.open(fd_img)
img = resizeimage.resize_width(img, 200)
img.save('test-image-width.jpeg', img.format)
fd_img.close()
regroupe d'autres exemples dans le lien ci-dessus.
méthode simple pour maintenir des rapports contraints et passer une largeur / hauteur maximale. Pas le plus beau, mais obtient le travail fait et est facile à comprendre:
def resize(img_path, max_px_size, output_folder):
with Image.open(img_path) as img:
width_0, height_0 = img.size
out_f_name = os.path.split(img_path)[-1]
out_f_path = os.path.join(output_folder, out_f_name)
if max((width_0, height_0)) <= max_px_size:
print('writing {} to disk (no change from original)'.format(out_f_path))
img.save(out_f_path)
return
if width_0 > height_0:
wpercent = max_px_size / float(width_0)
hsize = int(float(height_0) * float(wpercent))
img = img.resize((max_px_size, hsize), Image.ANTIALIAS)
print('writing {} to disk'.format(out_f_path))
img.save(out_f_path)
return
if width_0 < height_0:
hpercent = max_px_size / float(height_0)
wsize = int(float(width_0) * float(hpercent))
img = img.resize((max_px_size, wsize), Image.ANTIALIAS)
print('writing {} to disk'.format(out_f_path))
img.save(out_f_path)
return
voici un script python qui utilise cette fonction pour lancer le redimensionnement d'image par lots.