


Umbrechen und rendern Sie mehrzeiligen Text auf Bildern mit der Pillow-Bibliothek von Python
Jan 14, 2025 am 08:59 AMPython-Bildverarbeitung: Die Pillow-Bibliothek implementiert die automatische Zeilenumbruch-Textanmerkung
Python hat sich mit seinen umfangreichen Open-Source-Bibliotheken zur führenden Programmiersprache im Bereich der Bildverarbeitung entwickelt. Pillow ist eine der am h?ufigsten verwendeten Bildverarbeitungsbibliotheken. Sie ist einfach, benutzerfreundlich und verfügt über eine vollst?ndige Dokumentation. Sie wird h?ufig für Vorg?nge wie Bildskalierung, Zuschneiden, Helligkeitsanpassung und Anmerkungen verwendet.
Pillow hat jedoch ein Problem mit Textanmerkungen: Wenn der Text die Breite des Textfelds überschreitet, wird er nicht automatisch umbrochen. Die Pillow-Bibliothek selbst bietet diese Funktion nicht und wir müssen die Logikimplementierung selbst schreiben.
Dieses Tutorial zeigt, wie Sie mithilfe der Pillow-Bibliothek ein Textfeld mit Zeilenumbruch in Python hinzufügen, um eine korrekte Bildtextanmerkung zu erzielen. Der endgültige Effekt ist wie folgt:
Das Bild oben ist ein Screenshot meines Dev.to-Profils, wir werden dies als Beispiel zur Erl?uterung verwenden. Das grüne Textfeld ist die von uns hinzugefügte Textanmerkung.
Vorbereitung
Für dieses Tutorial müssen Sie über grundlegende Python-Programmierkenntnisse verfügen, z. B. über bedingte Anweisungen (if, else), for-Schleifen usw. Sie ben?tigen au?erdem die folgenden Tools und Software:
- Python3 : Interpreter zum Ausführen von Python-Skripten.
- Pillow: Python-Bildverarbeitungsbibliothek.
- Code-Editor: wie Pycharm, VScode usw.
Neues Projekt erstellen
Folgen Sie diesen Schritten, um ein neues Projekt zu erstellen:
A. Erstellen Sie einen neuen Ordner über das Terminal/die Befehlszeile:
mkdir image_annotation
B. Verwenden Sie pip, um virtualenv zu installieren (überspringen Sie diesen Schritt, wenn Sie es bereits installiert haben):
pip install virtualenv
C. Wechseln Sie das Arbeitsverzeichnis in den Ordner image_annotation:
cd image_annotation
D. Erstellen Sie eine neue virtuelle Umgebung:
virtualenv env
E. Virtuelle Umgebung aktivieren (Eingabeaufforderung für Windows verwenden):
Windows:
.\env\Scripts\activate
Linux/macOS:
source env/bin/activate
F. Verwenden Sie pip, um die Pillow-Bibliothek zu installieren:
pip install pillow
?ffnen Sie das Projekt im Code-Editor und erstellen Sie eine neue Python-Datei mit dem Namen script.py
im Projektordner.
Basis-Image vorbereiten
Das Bild, das Sie mit Anmerkungen versehen m?chten, ist das Basisbild. ?ffnen Sie das Bild und bereiten Sie es mit dem ImageDraw
-Modul von Pillow vor. Schreiben Sie den folgenden Code in die Datei script.py
:
from PIL import Image, ImageDraw, ImageFont image_file = "path_to_image" # 請?zhí)鎿Q為您的圖片路徑 # 打開圖像 image = Image.open(image_file) # 初始化ImageDraw draw = ImageDraw.Draw(image)
Bildanmerkung hinzufügen
Pillow kann einfachen Text und Textfelder mit Hintergrundfüllung hinzufügen. Der Text kann einzeilig oder mehrzeilig sein. Dieses Tutorial konzentriert sich auf das Hinzufügen eines mehrzeiligen Textfelds.
DieImageDraw.multiline_text()
-Methode kann mehrere Zeilen Klartext hinzufügen, jedoch keinen Hintergrundabstand. Die ImageDraw.rectangle()
-Methode kann ein Textfeld mit Hintergrundfüllung hinzufügen.
Fügen Sie den folgenden Code in die Datei script.py
ein:
mkdir image_annotation
Dieser Code legt den Text, die Schriftart und die Textfeldbreite fest. Die Variablen x
und y
stellen den Startpunkt der Zeichnung dar, und end_x
und end_y
stellen die Koordinaten der unteren rechten Ecke des Textfelds dar. Die Breite und H?he des Textfelds betragen 200 bzw. 50.
ImageDraw.rectangle()
und ImageDraw.multiline_text()
werden zum Zeichnen von Textfeldern bzw. mehrzeiligem Text verwendet. Die Methode image.show()
wird verwendet, um das verarbeitete Bild anzuzeigen. Sie k?nnen das Bild mit image.save("new_image.png")
speichern. Die Ergebnisse sind wie folgt:
Es gibt immer noch ein Problem mit der Anmerkung im Bild oben und der mehrzeilige Text wird nicht automatisch umgebrochen. Im n?chsten Abschnitt wird erl?utert, wie Sie dieses Problem l?sen k?nnen.
Realisieren Sie den automatischen Zeilenumbruch
Zeilenumbruchzeichen n
wird verwendet, um die Zeilenumbruchposition anzugeben. Im vorherigen Beispiel wird der Inhalt nach dem Zeilenumbruchzeichen n
umbrochen. In praktischen Anwendungen ist die Textl?nge jedoch normalerweise dynamisch und es ist schwierig, die Position des Zeilenumbruchzeichens zu bestimmen.
-Attribut des ImageDraw
-Moduls von .textlength()
Pillow kann die Textl?nge berechnen und sie mit der Textfeldbreite vergleichen, um die Position des Zeilenumbruchs zu bestimmen.
Erstellen Sie oben in der Datei script.py
(nach der Importanweisung) eine neue Funktion mit dem Namen wrap_text()
, die die Zeilenumbruchlogik enth?lt:
pip install virtualenv
Fügen Sie den folgenden Code nach den Variablen text
, font
, max_width
hinzu:
cd image_annotation
Ersetzen Sie die Methode draw.multiline_text()
durch den folgenden Code:
virtualenv env
Entfernen Sie Zeilenumbrüche aus dem Text n
und führen Sie den Code aus:
.\env\Scripts\activate
Das laufende Ergebnis zeigt, dass der Text immer noch die H?he des Textfelds überschreitet. W?hrend sich der Text automatisch an die Breite des Textfelds anpasst, ist die H?he des Textfelds fest, was dazu führt, dass der Text überl?uft.
Dynamische Textfeldh?he festlegen
Die H?he des dynamischen Textfelds wird anhand der Anzahl der Textzeilen bestimmt. Der erste Schritt besteht darin, die Variable end_y
des Textfelds in einen dynamischen Wert zu ?ndern:
source env/bin/activate
Diese Formel wurde nach vielen Experimenten entwickelt und scheint in diesem Anwendungsfall die beste L?sung zum Ermitteln der dynamischen Textfeldh?he zu sein. wrapped_lines
Die Liste enth?lt alle Zeilen, die dem Textfeld hinzugefügt werden sollen, sodass die L?nge der Liste der Gesamtzahl der Zeilen des Textfelds entspricht.
Die Ergebnisse sind wie folgt:
M?glicherweise müssen Sie die Gesamtzahl der Zeilen mit verschiedenen Werten multiplizieren, um die perfekte L?sung für Ihren Anwendungsfall zu erhalten.
Textauffüllung hinzufügen
Der Text befindet sich zu nah am Rand des Textfelds, was die Lesbarkeit und den Stil beeintr?chtigt. Sie k?nnen dieses Problem l?sen, indem Sie im Textfeld eine Auffüllung hinzufügen. Fügen Sie eine neue script.py
-Variable in der padding
-Datei hinzu und ?ndern Sie die Gr??e des Textfelds:
pip install pillow
Dieser Code erm?glicht den Abstand zwischen dem Text und den R?ndern des Textfelds.
Zeiger hinzufügen
Der Zeiger kann bequem auf den Teil des Bildes hinweisen, auf den sich die Anmerkung/Beschriftung bezieht. Der Zeiger sollte vor der Beschriftung stehen. Das bedeutet, dass der Zeiger an der aktuellen Position des Textfelds gezogen wird und das Textfeld nach rechts verschoben wird.
Daher wird die x-Achse des Textfelds mit der neuen Variablen box_x
verknüpft. Diese ?nderung muss sich auch in anderen Variablen widerspiegeln, die die X-Achse des Textfelds verwenden. Hier ist der aktualisierte Code:
mkdir image_annotation
Im obigen Code wird die Methode ImageDraw.circle()
(wobei 10 der Radius ist) verwendet, um den Zeiger am angegebenen Punkt zu zeichnen. box_x
Die Variable ist der neue Wert der x-Achse des Textfelds.
Vollst?ndiger Code
Das Folgende ist der vollst?ndige Code der script.py
-Datei:
pip install virtualenv
Fazit
Bildbearbeitung ist nicht immer so schwierig, wie es scheint. Obwohl einige Bildverarbeitungsbibliotheken Ihr Problem mit ihren Modulen nicht direkt l?sen k?nnen, k?nnen Sie vorhandene Module verwenden, um eine spezifische L?sung für Ihren Anwendungsfall zu implementieren. Das ist das Sch?ne am Codieren – Probleme l?sen zu k?nnen mit benutzerdefinierten und spezifischen L?sungen.
In diesem Tutorial haben Sie gelernt, wie Sie die Pillow-Bibliothek von Python verwenden, um Bilder mit Anmerkungen zu versehen, mehrzeilige Textfelder mit Wortumbruch hinzuzufügen und vieles mehr. Au?erdem haben Sie gelernt, mathematische Formeln zu schreiben, die Ihnen bei der Bildverarbeitung helfen k?nnen.
Einzelheiten zu den verwendeten Modulen finden Sie in der Pillow-Dokumentation.
Das obige ist der detaillierte Inhalt vonUmbrechen und rendern Sie mehrzeiligen Text auf Bildern mit der Pillow-Bibliothek von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

Pythons untestestes und PyTest sind zwei weit verbreitete Test -Frameworks, die das Schreiben, Organisieren und Ausführen automatisierter Tests vereinfachen. 1. Beide unterstützen die automatische Entdeckung von Testf?llen und liefern eine klare Teststruktur: Unittest definiert Tests durch Erben der Testpase -Klasse und beginnt mit Test \ _; PyTest ist pr?gnanter, ben?tigen nur eine Funktion, die mit Test \ _ beginnt. 2. Sie alle haben eine integrierte Behauptungsunterstützung: Unittest bietet AssertEqual, AssertRue und andere Methoden, w?hrend PyTest eine erweiterte Anweisung für die Assert verwendet, um die Fehlerdetails automatisch anzuzeigen. 3. Alle haben Mechanismen für die Vorbereitung und Reinigung von Tests: un

PythonisidealfordataanalysisduetoNumPyandPandas.1)NumPyexcelsatnumericalcomputationswithfast,multi-dimensionalarraysandvectorizedoperationslikenp.sqrt().2)PandashandlesstructureddatawithSeriesandDataFrames,supportingtaskslikeloading,cleaning,filterin

Die dynamische Programmierung (DP) optimiert den L?sungsprozess, indem komplexe Probleme in einfachere Unterprobleme zerlegt und deren Ergebnisse gespeichert werden, um wiederholte Berechnungen zu vermeiden. Es gibt zwei Hauptmethoden: 1. Top-Down (Memorisierung): Das Problem rekursiv zerlegen und Cache verwenden, um Zwischenergebnisse zu speichern; 2. Bottom-up (Tabelle): Iterativ L?sungen aus der grundlegenden Situation erstellen. Geeignet für Szenarien, in denen maximale/minimale Werte, optimale L?sungen oder überlappende Unterprobleme erforderlich sind, wie Fibonacci -Sequenzen, Rucksackprobleme usw. In Python k?nnen sie durch Dekoratoren oder Arrays implementiert werden, und die Aufmerksamkeit sollte für die Identifizierung rekursiver Beziehungen gezahlt werden, und die Optimierung der Komplexit?t des Raums.

Um einen benutzerdefinierten Iterator zu implementieren, müssen Sie die Methoden __iter__ und __next__ in der Klasse definieren. ① Die __iter__ -Methode gibt das Iteratorobjekt selbst, normalerweise selbst, um mit iterativen Umgebungen wie für Schleifen kompatibel zu sein. ② Die __Next__ -Methode steuert den Wert jeder Iteration, gibt das n?chste Element in der Sequenz zurück, und wenn es keine weiteren Elemente mehr gibt, sollte die Ausnahme der Stopperation geworfen werden. ③ Der Status muss korrekt nachverfolgt werden und die Beendigungsbedingungen müssen festgelegt werden, um unendliche Schleifen zu vermeiden. ④ Komplexe Logik wie Filterung von Dateizeilen und achten Sie auf die Reinigung der Ressourcen und die Speicherverwaltung; ⑤ Für eine einfache Logik k?nnen Sie stattdessen die Funktionsertrags für Generator verwenden, müssen jedoch eine geeignete Methode basierend auf dem spezifischen Szenario ausw?hlen.

Zukünftige Trends in Python umfassen Leistungsoptimierung, st?rkere Typ -Eingabeaufforderungen, der Aufstieg alternativer Laufzeiten und das fortgesetzte Wachstum des KI/ML -Feldes. Erstens optimiert CPython weiterhin und verbessert die Leistung durch schnellere Startzeit, Funktionsaufrufoptimierung und vorgeschlagene Ganzzahloperationen. Zweitens sind Typ -Eingabeaufforderungen tief in Sprachen und Toolchains integriert, um die Sicherheit und Entwicklung von Code zu verbessern. Drittens bieten alternative Laufzeiten wie Pyscript und Nuitka neue Funktionen und Leistungsvorteile; Schlie?lich erweitern die Bereiche von KI und Data Science weiter und aufstrebende Bibliotheken f?rdern eine effizientere Entwicklung und Integration. Diese Trends zeigen, dass Python st?ndig an technologische Ver?nderungen anpasst und seine führende Position aufrechterh?lt.

Das Python-Socket-Modul ist die Grundlage für die Netzwerkprogrammierung und bietet Niveau-Netzwerkkommunikationsfunktionen, die für das Erstellen von Client- und Serveranwendungen geeignet sind. Um einen grundlegenden TCP -Server einzurichten, müssen Sie Socket. Um einen TCP -Client zu erstellen, müssen Sie ein Socket -Objekt erstellen und .Connect () anrufen, um eine Verbindung zum Server herzustellen, und dann .Sendall () zum Senden von Daten und .recv () zum Empfangen von Antworten verwenden. Um mehrere Clients zu handhaben, k?nnen Sie 1. Threads verwenden: Starten Sie jedes Mal einen neuen Thread, wenn Sie eine Verbindung herstellen. 2. Asynchrone E/O: Zum Beispiel kann die Asyncio-Bibliothek eine nicht blockierende Kommunikation erreichen. Dinge zu beachten

Die Kernantwort auf die Python -Liste Slicing besteht darin, die Syntax [Start: Ende: Stufe] zu beherrschen und ihr Verhalten zu verstehen. 1. Das grundlegende Format der Listenschnitte ist die Liste [Start: Ende: Schritt], wobei der Start der Startindex (enthalten) ist, das Ende ist der Endindex (nicht enthalten) und Schritt ist die Schrittgr??e; 2. Start standardm??ig starten mit 0, lasse Ende standardm??ig bis zum Ende aus, standardm??ig standardm??ig 1 aus. 3.. Verwenden Sie My_List [: n], um die ersten N-Elemente zu erhalten, und verwenden Sie My_List [-n:], um die letzten N-Elemente zu erhalten. 4. Verwenden Sie den Schritt, um Elemente wie my_list [:: 2] zu überspringen, um gleiche Ziffern zu erhalten, und negative Schrittwerte k?nnen die Liste umkehren. 5. H?ufige Missverst?ndnisse umfassen den Endindex nicht

Der Polymorphismus ist ein Kernkonzept in der objektorientierten Programmierung von Python-Objekte und bezieht sich auf "eine Schnittstelle, mehrere Implementierungen" und erm?glicht eine einheitliche Verarbeitung verschiedener Arten von Objekten. 1. Polymorphismus wird durch Umschreiben durch Methode implementiert. Unterklassen k?nnen übergeordnete Klassenmethoden neu definieren. Zum Beispiel hat die Spoke () -Methode der Tierklasse unterschiedliche Implementierungen in Hunde- und Katzenunterklassen. 2. Die praktischen Verwendungen des Polymorphismus umfassen die Vereinfachung der Codestruktur und die Verbesserung der Skalierbarkeit, z. 3. Die Python -Implementierungspolymorphismus muss erfüllen: Die übergeordnete Klasse definiert eine Methode, und die untergeordnete Klasse überschreibt die Methode, erfordert jedoch keine Vererbung derselben übergeordneten Klasse. Solange das Objekt dieselbe Methode implementiert, wird dies als "Ententyp" bezeichnet. 4. Zu beachten ist die Wartung
