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