Python-Bildkomprimierung

Ammar Ali 15 Februar 2024
Python-Bildkomprimierung

In diesem Tutorial wird das Komprimieren eines Bildes mit der Bibliothek PIL in Python erläutert.

Bevor Sie die Bibliothek PIL verwenden, installieren Sie sie mit pip oder python.

pip install Pillow

Python-Bildkomprimierung mit der PIL-Bibliothek

Bildkomprimierung wird verwendet, um die Größe eines Bildes zu reduzieren. Wir wissen, dass Bilder aus Pixeln bestehen, die Farb- oder Intensitätswerte enthalten.

Es gibt hauptsächlich zwei Möglichkeiten, die Größe eines Bildes zu reduzieren oder das Bild zu komprimieren. Eine Möglichkeit besteht darin, die Größe des Bildes zu ändern, um die Anzahl der vorhandenen Pixel zu reduzieren.

Wenn das Bild beispielsweise 500 x 500 Pixel groß ist, können wir es komprimieren oder seine Dateigröße reduzieren, indem wir die Anzahl der Pixel von 500 x 500 auf 100 x 100 Pixel reduzieren. Das resultierende Bild wird komprimiert, aber es wird klein, und die Dateigröße nimmt ebenfalls ab.

Je mehr wir die Anzahl der Pixel verringern, desto mehr nimmt die Dateigröße ab, aber das Bild wird kleiner. Möglicherweise müssen wir das in der Größe geänderte Bild zoomen, um es richtig zu sehen.

Wir können die Funktion resize() des Image-Moduls der PIL-Bibliothek verwenden, um die Größe eines Bildes zu ändern. Die grundlegende Syntax der Funktion resize() ist unten.

MyImage.resize(size, resample, box, reducing_gap)

Im obigen Code ist MyImage das Modulobjekt Image, das das Eingabebild enthält. Der Parameter Größe enthält die Größe des Ausgabebildes und sollte ein zweiwertiges Tupel wie (Breite, Höhe) sein.

Der Parameter resample ist optional und standardmäßig auf None eingestellt und wird verwendet, um den Resampling-Filter einzustellen, der auf das Bild angewendet wird, um es zu glätten wie PIL.Image.Resampling.NEAREST -Filter, der jedes Pixel unter Verwendung seiner nächsten Pixel glättet.

Der Parameter box ist ebenfalls optional, wobei der Standardwert auf None gesetzt ist und verwendet wird, um den interessierenden Bereich des Bildes festzulegen, und es sollte ein Tupel mit 4 Werten sein, das die Position der Box enthält, wie (0,0,width,height).

reducing_gap ist ebenfalls ein optionales Argument und wird verwendet, um eine Optimierung auf das Bild anzuwenden, wodurch die Größe des Bildes weiter reduziert wird, und standardmäßig ist sein Wert auf none gesetzt.

Der Wert von reducing_gap sollte eine Ganzzahl sein; Ein kleinerer Wert bedeutet eine schnelle Größenänderung und ein großer Wert bedeutet eine langsame Größenänderung, aber ein besseres Ergebnis.

Lassen Sie uns beispielsweise ein Bild mit der Funktion resize() komprimieren. Siehe Code unten.

from PIL import Image

input_img = Image.open("test.jpg")
print("input image size:", input_img.size)

output_img = input_img.resize((300, 300))
print("output image size:", output_img.size)
output_img.save("testNew.jpg")

Ausgang:

input image size: (600, 600)
output image size: (300, 300)

verkleinerte Bilder

Im obigen Code haben wir die Funktionen open() und save() des Image-Moduls der PIL-Bibliothek verwendet, um die Bilder zu öffnen und zu speichern.

Wir haben nur den Namen und die Erweiterung des Bildes in der Funktion open() angegeben, da sich das Bild und die Python-Codedatei im selben Verzeichnis befinden, aber wenn sie nicht im selben Verzeichnis sind, müssen wir eine vollständige angeben Pfad zur Bilddatei zusammen mit ihrem Namen und ihrer Erweiterung, um sie zu lesen.

Wir haben auch einen Bildnamen und eine Erweiterung in der Funktion save() verwendet, die das Bild im aktuellen Verzeichnis der Python-Codedatei speichern, aber wir können das Bild auch in einem anderen Verzeichnis speichern, indem wir den vollständigen Pfad zusammen mit angeben den Bildnamen und die Erweiterung.

Im obigen Bild ist das Bild auf der linken Seite das Originalbild; seine Größe beträgt 21,6 KB, das Bild auf der rechten Seite ist das in der Größe geänderte Bild und seine Größe beträgt 6,88 KB.

Das Bild auf der rechten Seite ist auf 200 % gezoomt, sodass wir es leicht mit dem Originalbild vergleichen und einen kleinen Qualitätsunterschied in beiden Bildern erkennen können.

Im obigen Beispiel haben wir keine optionalen Argumente verwendet, aber wir können sie verwenden, um die Qualität des Ausgabebildes zu verbessern.

Eine weitere Methode zum Komprimieren eines Bildes besteht darin, die Bildqualität zu reduzieren. Bei dieser Methode bleibt die Anzahl der Pixel des Bildes gleich, aber die Qualität des Bildes nimmt zusammen mit der Dateigröße des Bildes ab.

Wir können die Argumente optimize und quality innerhalb der Funktion save() verwenden, um die Dateigröße eines Bildes zu reduzieren.

Das optimize-Argument wird auf true gesetzt, um eine Optimierung auf das Bild anzuwenden, wodurch die Größe reduziert wird, ohne viel Qualität zu verlieren, und das quality-Argument kann auf einen beliebigen Prozentsatz von 1 bis 100 gesetzt werden.

Wenn wir die Qualität auf 50 Prozent einstellen, halbiert sich die Größe der Bilddatei. Verwenden wir zum Beispiel die Funktion save() nur, um die Dateigröße im obigen Beispiel zu verringern.

Siehe Code unten.

from PIL import Image

input_img = Image.open("test.jpg")
output_img = input_img.save("testNew.jpg", optimize=True, quality=50)
input_img_2 = Image.open("testNew.jpg")
print("Input image size:", input_img.size)
print("Output Image Size:", input_img_2.size)

Ausgang:

Input image size: (600, 600)
Output Image Size: (600, 600)

Bildqualität reduzieren

In der obigen Ausgabe können wir sehen, dass die Anzahl der Pixel der Eingabe- und Ausgabebilder gleich ist und die Qualität des Ausgabebilds abnimmt. Das linke Bild ist das Originalbild und das rechte das Ausgabebild.

Wenn wir beide Beispiele vergleichen, ist die Qualität beider Ausgabebilder fast gleich, aber die Pixelgröße des Ausgabebildes im ersten Beispiel ist kleiner als die Pixelgröße des Ausgabebildes im zweiten Beispiel. Wir können auch die Funktionen resize() und save() kombinieren, um das gewünschte Ergebnis zu erhalten.

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - Python Image