Ich verwende PIL, um die Größe der Bilder dort zu ändern, indem ich größere Bilder in kleinere konvertiere. Gibt es Standardmethoden, um die Dateigröße des Bildes zu reduzieren, ohne die Qualität zu stark zu verlieren? Nehmen wir an, die Originalgröße des Bildes beträgt 100 KB. Ich möchte sie auf 5 oder 10 KB reduzieren, insbesondere für PNG- und JPEG-Formate.
python
image
compression
python-imaging-library
Yashwanth Kumar
quelle
quelle
Antworten:
Ein integrierter Parameter zum Speichern von JPEGs und PNGs ist
optimize
.>>> from PIL import Image # My image is a 200x374 jpeg that is 102kb large >>> foo = Image.open("path\\to\\image.jpg") >>> foo.size (200,374) # I downsize the image with an ANTIALIAS filter (gives the highest quality) >>> foo = foo.resize((160,300),Image.ANTIALIAS) >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95) # The saved downsized image size is 24.8kb >>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95) # The saved downsized image size is 22.9kb
Die
optimize
Flagge führt einen zusätzlichen Durchgang für das Bild durch, um einen Weg zu finden, seine Größe so weit wie möglich zu reduzieren. 1,9 KB scheinen nicht viel zu sein, aber über Hunderte / Tausende von Bildern kann es sich summieren.Um nun zu versuchen, es auf 5 KB bis 10 KB zu reduzieren, können Sie den Qualitätswert in den Speicheroptionen ändern. Die Verwendung einer Qualität von 85 anstelle von 95 würde in diesem Fall Folgendes ergeben: Nicht optimiert: 15,1 KB Optimiert: 14,3 KB Die Verwendung einer Qualität von 75 (Standard, wenn das Argument weggelassen wird) würde Folgendes ergeben: Nicht optimiert: 11,8 KB Optimiert: 11,2 KB
Ich bevorzuge Qualität 85 mit Optimierung, da die Qualität nicht stark beeinträchtigt wird und die Dateigröße viel kleiner ist.
quelle
Nehmen wir an, Sie haben ein Modell namens Book und darauf ein Feld namens 'cover_pic'. In diesem Fall können Sie das Bild wie folgt komprimieren:
from PIL import Image b = Book.objects.get(title='Into the wild') image = Image.open(b.cover_pic.path) image.save(b.image.path,quality=20,optimize=True)
Ich hoffe, es hilft jedem, der darüber stolpert.
quelle
Der Hauptbildmanager in
PIL
istPIL
dasImage
Modul.from PIL import Image import math foo = Image.open("path\\to\\image.jpg") x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20) foo = foo.resize((x2,y2),Image.ANTIALIAS) foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
Sie können
optimize=True
zu den Argumenten hinzufügen , dass Sie die Größe noch weiter verringern möchten, aber die Optimierung funktioniert nur für JPEGs und PNGs. Bei anderen Bilderweiterungen können Sie die Qualität des neu gespeicherten Bildes verringern. Sie können die Größe des neuen Bildes ändern, indem Sie nur ein wenig Code löschen und die Bildgröße definieren. Sie können nur herausfinden, wie dies zu tun ist, wenn Sie sich den Code genau ansehen. Ich habe diese Größe definiert:x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20)
Nur um Ihnen zu zeigen, was (fast) normalerweise mit horizontalen Bildern gemacht wird. Für vertikale Bilder können Sie Folgendes tun:
x, y = foo.size x2, y2 = math.floor(x-20), math.floor(y-50)
. Denken Sie daran, dass Sie dieses Codebit weiterhin löschen und eine neue Größe definieren können.
quelle
Siehe die Miniaturbildfunktion des PIL-Bildmoduls. Sie können damit kleinere Versionen von Dateien als verschiedene Dateitypen speichern. Wenn Sie so viel Qualität wie möglich beibehalten möchten, sollten Sie den
ANTIALIAS
Filter verwenden, wenn Sie dies tun.Abgesehen davon bin ich mir nicht sicher, ob es eine Möglichkeit gibt, eine maximal gewünschte Größe anzugeben. Sie können natürlich eine Funktion schreiben, mit der versucht werden kann, mehrere Versionen der Datei mit unterschiedlichen Qualitäten zu speichern, bis eine bestimmte Größe erreicht ist. Der Rest wird verworfen und Sie erhalten das gewünschte Bild.
quelle