使用 Python 的 Pillow 庫在圖像上包裹和渲染多行文本
Python影像處理:Pillow庫實作自動換行文字標註
Python憑藉其豐富的開源函式庫,已成為影像處理領域的領先程式語言。 Pillow便是其中一個常用的影像處理庫,它簡潔易用且文件完善,常用於影像縮放、裁切、亮度調整和標註等操作。
然而,Pillow在文字標註方面存在一個問題:當文字超過文字方塊寬度時,不會自動換行。 Pillow程式庫本身並沒有提供此功能,需要我們自行編寫邏輯實作。
本教學將示範如何使用Pillow庫在Python中新增一個自動換行的文字框,從而實現正確的圖像文字標註。最終效果如下:
上圖是我的Dev.to個人資料截圖,我們將以此為例進行解說。綠色文字框即為我們新增的文字標註。
準備工作
本教學要求您具備基本的Python程式設計知識,例如條件語句(if, else)、for迴圈等。您還需要以下工具和軟體:
- Python3 : 用於執行Python腳本的解釋器。
- Pillow: Python影像處理庫。
- 程式碼編輯器: 例如Pycharm、VScode等。
建立新項目
請依照下列步驟建立一個新項目:
A. 使用終端機/命令列建立新資料夾:
mkdir image_annotation
B. 使用pip安裝virtualenv (如果您已安裝,請跳過此步驟):
pip install virtualenv
C. 將工作目錄切換到image_annotation資料夾:
cd image_annotation
D. 建立新的虛擬環境:
virtualenv env
E. 啟動虛擬環境 (Windows使用指令提示字元):
Windows:
.\env\Scripts\activate
Linux/macOS:
source env/bin/activate
F. 使用pip安裝Pillow庫:
pip install pillow
在程式碼編輯器中開啟項目,並在專案資料夾中建立一個名為script.py
的新Python檔案。
準備基礎影像
您要標註的影像即為基礎影像。使用Pillow的ImageDraw
模組開啟並準備影像。在script.py
檔案中編寫以下程式碼:
from PIL import Image, ImageDraw, ImageFont image_file = "path_to_image" # 请替换为您的图片路径 # 打开图像 image = Image.open(image_file) # 初始化ImageDraw draw = ImageDraw.Draw(image)
新增影像標註
Pillow可以添加純文字和帶有背景填充的文字框,文字可以是單行或多行。本教學重點在於講解如何新增多行文字方塊。
ImageDraw.multiline_text()
方法可以添加多行純文本,但沒有背景填充。 ImageDraw.rectangle()
方法可以新增帶有背景填滿的文字方塊。
在script.py
檔案中加入以下程式碼:
mkdir image_annotation
這段程式碼設定了文字、字體和文字方塊寬度。 x
和y
變數表示繪圖的起始點,end_x
和end_y
表示文字方塊的右下角座標。文字方塊的寬度和高度分別為200和50。
ImageDraw.rectangle()
和ImageDraw.multiline_text()
方法分別用於繪製文字方塊和多行文字。 image.show()
方法用於顯示處理後的影像。您可以使用image.save("new_image.png")
儲存影像。結果如下:
上圖中標註仍有問題,多行文字沒有自動換行。下一節將講解如何解決這個問題。
實現自動換行
換行符n
用來指定換行位置。在之前的例子中,換行符n
之後的內容會換行。但在實際應用中,文字長度通常是動態的,很難確定換行符的位置。
Pillow的ImageDraw
模組的.textlength()
屬性可以計算文字長度,將其與文字方塊寬度進行比較,從而確定換行位置。
在script.py
檔案頂部(import語句之後)建立一個名為wrap_text()
的新函數,包含自動換行邏輯:
pip install virtualenv
在text
, font
, max_width
變數之後加入以下程式碼:
cd image_annotation
將draw.multiline_text()
方法替換為以下程式碼:
virtualenv env
從文字中刪除換行符n
並執行程式碼:
.\env\Scripts\activate
運行結果顯示文字仍然超出文字方塊高度。雖然文字可以根據文字方塊寬度自動調整,但文字方塊高度固定,導致文字溢出。
設定動態文字方塊高度
動態文字方塊高度根據文字行數決定。第一步是將文字方塊的end_y
變數改為動態值:
source env/bin/activate
此公式是在多次試驗後得到的,它似乎是此用例中獲得動態文字框高度的最佳解決方案。 wrapped_lines
清單包含所有要加入到文字方塊的行,因此該清單的長度等於文字方塊的總行數。
結果如下:
您可能需要將總行數乘以不同的值才能獲得適合您用例的完美解決方案。
新增文字填充
文字距離文字框邊緣太近,影響可讀性和樣式。可以透過在文字方塊內添加填充來解決這個問題。在script.py
檔案中新增一個新的padding
變數並更改文字方塊尺寸:
pip install pillow
這段程式碼允許在文字和文字方塊邊緣之間留出間距。
加指針
指標可以方便地指示標註/標籤所指的影像部分。指針應該位於標註之前。這意味著指標將繪製在文字方塊的當前位置,而文字方塊將向右移動。
因此,文字方塊的x軸將與新的box_x
變數關聯。此變更也必須反映在使用文字方塊x軸的其他變數中。以下是更新後的程式碼:
mkdir image_annotation
在上面的程式碼中,ImageDraw.circle()
方法(其中10是半徑)用於在指定點繪製指標。 box_x
變數是文字框x軸的新值。
完整程式碼
以下是script.py
檔案的完整程式碼:
pip install virtualenv
結論
影像處理並不總是像看起來那麼困難。雖然有些影像處理庫無法直接用其模組解決您的問題,但您可以使用現有模組為您的用例實現特定解決方案。這就是編碼的魅力-能夠用自訂和特定解決方案來解決問題。
在本教程中,您學習如何使用Python的Pillow庫來標註圖像,添加自動換行的多行文字框等。您還學習如何編寫可以幫助您進行圖像處理的數學公式。
請參考Pillow文件以詳細了解所用模組。
以上是使用 Python 的 Pillow 庫在圖像上包裹和渲染多行文本的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。
