640 Stimmen

Wie kann ich die Größe eines Bildes mit PIL ändern und das Seitenverhältnis beibehalten?

Gibt es eine offensichtliche Möglichkeit, dies zu tun, die ich übersehe? Ich versuche nur, Miniaturansichten zu erstellen.

629voto

gnud Punkte 75549

Legen Sie eine maximale Größe fest. Berechnen Sie dann ein Größenänderungsverhältnis, indem Sie min(maxwidth/width, maxheight/height) .

Die richtige Größe ist oldsize*ratio .

Natürlich gibt es auch eine Bibliotheksmethode, um dies zu tun: die Methode Image.thumbnail .
Nachstehend ein (bearbeitetes) Beispiel aus der PIL-Dokumentation .

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

404voto

tomvon Punkte 4711

Dieses Skript ändert die Größe eines Bildes (somepic.jpg) mit PIL (Python Imaging Library) auf eine Breite von 300 Pixeln und eine Höhe, die proportional zur neuen Breite ist. Dazu ermittelt es den Prozentsatz von 300 Pixeln der ursprünglichen Breite (img.size[0]) und multipliziert dann die ursprüngliche Höhe (img.size[1]) mit diesem Prozentsatz. Ändern Sie "basewidth" in eine beliebige andere Zahl, um die Standardbreite Ihrer Bilder zu ändern.

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('somepic.jpg')

91voto

Franz Punkte 1214

Ich empfehle auch die Verwendung der PIL-Methode für Miniaturansichten, weil sie Ihnen alle Probleme mit dem Verhältnis erspart.

Allerdings gibt es einen wichtigen Hinweis: Ersetzen Sie

im.thumbnail(size)

mit

im.thumbnail(size,Image.ANTIALIAS)

Standardmäßig verwendet PIL den Filter Image.NEAREST für die Größenänderung, was zu einer guten Leistung, aber schlechter Qualität führt.

87voto

muZk Punkte 2678

Auf der Grundlage von @tomvon habe ich die folgende Methode angewendet (wählen Sie Ihren Fall):

a) Größenänderung der Höhe ( Ich kenne die neue Breite, also brauche ich die neue Höhe )

new_width  = 680
new_height = new_width * height / width 

b) Ändern der Breite ( Ich kenne die neue Höhe, also brauche ich die neue Breite )

new_height = 680
new_width  = new_height * width / height

Dann eben:

img = img.resize((new_width, new_height), Image.ANTIALIAS)

37voto

Wenn Sie versuchen, das gleiche Seitenverhältnis beizubehalten, müssten Sie dann nicht die Größe um einen bestimmten Prozentsatz der Originalgröße ändern?

Zum Beispiel, die Hälfte der ursprünglichen Größe

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X