So reduzieren Sie die Größe der Bilddatei mit PIL

75

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.

Yashwanth Kumar
quelle
Was definieren Sie als "zu viel" Qualitätsverlust? Wenn Sie die Dateigröße um den Faktor 10 bis 20 reduzieren möchten, ist es am einfachsten, die Pixelanzahl zu reduzieren. Wenn Sie sowohl die Breite als auch die Höhe um 2/3 reduzieren, erhalten Sie ein Bild, das etwa 1/9 der Größe des Originals entspricht. Aber das ist ziemlich viel Auflösung, die Sie verlieren.
Roland Smith

Antworten:

129

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

Ryan G.
quelle
4
Aktualisierung des ANTIALIAS-Methodennamens: Ab 2.7.0 sind alle Größenänderungsmethoden ANTIALIAS und der tatsächliche (neue) Name für den spezifischen ANTIALIAS-Filter lautet LANCZOS. (Tho Antialias ist derzeit aus Gründen der
hbrannan
21

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.

Nash
quelle
5

Der Hauptbildmanager in PIList PILdas ImageModul.

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=Truezu 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.

Lied
quelle
3

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

Kryptit
quelle
1
Gibt es eine Möglichkeit, die Dateigröße zu reduzieren, indem die Abmessungen konstant gehalten werden? für PNG-Formate.
Yashwanth Kumar
1
Wenn Sie die gleichen Abmessungen beibehalten möchten, können Sie nur versuchen, die Qualitätseinstellung beim Speichern des Bildes festzulegen. Schauen Sie sich diese Antwort an
Cryptite
1
Aber das Qualitätsattribut macht für PNG-Formate keinen Unterschied. Auch wenn ich die Qualität ändere, bleibt die Dateigröße gleich.
Yashwanth Kumar
In diesem Fall fürchte ich, ich weiß es nicht. PNGs sind aufgrund ihres Komprimierungsformats traditionell größer. Sind PNGs ein Muss? Wenn nicht, haben Sie darüber nachgedacht, GIFs auszuprobieren?
Kryptit
Konvertieren Sie für PNG das Bild in eine kleinere Farbpalette. Verwenden Sie beim Schreiben der Datei die Option "Bits" mit einem Wert <8.
Roland Smith