Gibt es eine offensichtliche Möglichkeit, dies zu tun, die ich übersehe? Ich versuche nur, Miniaturansichten zu erstellen.
Antworten
Zu viele Anzeigen?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
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')
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.
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)
- See previous answers
- Weitere Antworten anzeigen