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.

298
demandé sur Ali Afshar 2008-11-08 02:08:04

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
363
répondu gnud 2013-08-11 18:46:28

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') 
165
répondu tomvon 2017-08-11 07:08:51

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é.

48
répondu Franz 2009-06-02 16:03:07

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)
23
répondu muZk 2016-08-10 17:39:45

PIL a déjà l'option de recadrer une image

img = ImageOps.fit(img, size, Image.ANTIALIAS)
13
répondu Cícero Verneck Corrêa 2013-07-01 13:09:57

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] )
10
répondu Chris Cameron 2008-12-13 03:43:00
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
9
répondu Mohideen ibn Mohammed 2016-05-08 12:44:06
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
3
répondu guettli 2015-09-27 10:02:19

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:])
1
répondu Nips 2013-05-22 10:48:36

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.

0
répondu Shanness 2018-05-15 10:04:53

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.

0
répondu AlexG 2018-05-31 06:40:10