国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
準(zhǔn)備工作
創(chuàng)建新項目
準(zhǔn)備基礎(chǔ)圖像
添加圖像標(biāo)注
實現(xiàn)自動換行
設(shè)置動態(tài)文本框高度
添加文本填充
添加指針
完整代碼
結(jié)論
首頁 后端開發(fā) Python教程 使用 Python 的 Pillow 庫在圖像上包裹和渲染多行文本

使用 Python 的 Pillow 庫在圖像上包裹和渲染多行文本

Jan 14, 2025 am 08:59 AM

Python圖像處理:Pillow庫實現(xiàn)自動換行文本標(biāo)注

Python憑借其豐富的開源庫,已成為圖像處理領(lǐng)域的領(lǐng)先編程語言。Pillow便是其中一個常用的圖像處理庫,它簡潔易用且文檔完善,常用于圖像縮放、裁剪、亮度調(diào)整和標(biāo)注等操作。

然而,Pillow在文本標(biāo)注方面存在一個問題:當(dāng)文本超過文本框?qū)挾葧r,不會自動換行。Pillow庫本身并沒有提供此功能,需要我們自行編寫邏輯實現(xiàn)。

本教程將演示如何使用Pillow庫在Python中添加一個自動換行的文本框,從而實現(xiàn)正確的圖像文本標(biāo)注。最終效果如下:

Wrap and Render Multiline Text on Images Using Python

上圖是我的Dev.to個人資料截圖,我們將以此為例進(jìn)行講解。綠色文本框即為我們添加的文本標(biāo)注。

準(zhǔn)備工作

本教程要求您具備基本的Python編程知識,例如條件語句(if, else)、for循環(huán)等。您還需要以下工具和軟件:

  1. Python3 : 用于運行Python腳本的解釋器。
  2. Pillow: Python圖像處理庫。
  3. 代碼編輯器: 例如Pycharm、VScode等。

創(chuàng)建新項目

按照以下步驟創(chuàng)建一個新項目:

A. 使用終端/命令行創(chuàng)建新文件夾:

mkdir image_annotation

B. 使用pip安裝virtualenv (如果您已安裝,請?zhí)^此步驟):

pip install virtualenv

C. 將工作目錄切換到image_annotation文件夾:

cd image_annotation

D. 創(chuàng)建新的虛擬環(huán)境:

virtualenv env

E. 激活虛擬環(huán)境 (Windows使用命令提示符):

Windows:

.\env\Scripts\activate

Linux/macOS:

source env/bin/activate

F. 使用pip安裝Pillow庫:

pip install pillow

在代碼編輯器中打開項目,并在項目文件夾中創(chuàng)建一個名為script.py的新Python文件。

準(zhǔn)備基礎(chǔ)圖像

您要標(biāo)注的圖像即為基礎(chǔ)圖像。使用Pillow的ImageDraw模塊打開并準(zhǔn)備圖像。在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)

添加圖像標(biāo)注

Pillow可以添加純文本和帶背景填充的文本框,文本可以是單行或多行。本教程重點講解如何添加多行文本框。

ImageDraw.multiline_text()方法可以添加多行純文本,但沒有背景填充。ImageDraw.rectangle()方法可以添加帶背景填充的文本框。

script.py文件中添加以下代碼:

mkdir image_annotation

這段代碼設(shè)置了文本、字體和文本框?qū)挾取?code>x和y變量表示繪圖的起始點,end_xend_y表示文本框的右下角坐標(biāo)。文本框的寬度和高度分別為200和50。

ImageDraw.rectangle()ImageDraw.multiline_text()方法分別用于繪制文本框和多行文本。image.show()方法用于顯示處理后的圖像。您可以使用image.save("new_image.png")保存圖像。結(jié)果如下:

Wrap and Render Multiline Text on Images Using Python&#s Pillow Library

上圖中標(biāo)注仍然存在問題,多行文本沒有自動換行。下一節(jié)將講解如何解決這個問題。

實現(xiàn)自動換行

換行符n用于指定換行位置。在之前的例子中,換行符n之后的內(nèi)容會換行。但在實際應(yīng)用中,文本長度通常是動態(tài)的,很難確定換行符的位置。

Pillow的ImageDraw模塊的.textlength()屬性可以計算文本長度,將其與文本框?qū)挾冗M(jìn)行比較,從而確定換行位置。

script.py文件頂部(import語句之后)創(chuàng)建一個名為wrap_text()的新函數(shù),包含自動換行邏輯:

pip install virtualenv

text, font, max_width變量之后添加以下代碼:

cd image_annotation

draw.multiline_text()方法替換為以下代碼:

virtualenv env

從文本中刪除換行符n并運行代碼:

.\env\Scripts\activate

運行結(jié)果顯示文本仍然超出文本框高度。雖然文本可以根據(jù)文本框?qū)挾茸詣诱{(diào)整,但文本框高度固定,導(dǎo)致文本溢出。

設(shè)置動態(tài)文本框高度

動態(tài)文本框高度根據(jù)文本行數(shù)確定。第一步是將文本框的end_y變量更改為動態(tài)值:

source env/bin/activate

此公式是在多次試驗后得到的,它似乎是此用例中獲得動態(tài)文本框高度的最佳解決方案。wrapped_lines列表包含所有要添加到文本框的行,因此該列表的長度等于文本框的總行數(shù)。

結(jié)果如下:

Wrap and Render Multiline Text on Images Using Python&#s Pillow Library

您可能需要將總行數(shù)乘以不同的值才能獲得適合您用例的完美解決方案。

添加文本填充

文本距離文本框邊緣太近,影響可讀性和樣式??梢酝ㄟ^在文本框內(nèi)添加填充來解決這個問題。在script.py文件中添加一個新的padding變量并更改文本框尺寸:

pip install pillow

這段代碼允許文本和文本框邊緣之間留出間距。

添加指針

指針可以方便地指示標(biāo)注/標(biāo)簽所指的圖像部分。指針應(yīng)該位于標(biāo)注之前。這意味著指針將繪制在文本框的當(dāng)前位置,而文本框?qū)⑾蛴乙苿印?/p>

因此,文本框的x軸將與新的box_x變量關(guān)聯(lián)。此更改也必須反映在使用文本框x軸的其他變量中。以下是更新后的代碼:

mkdir image_annotation

在上面的代碼中,ImageDraw.circle()方法(其中10是半徑)用于在指定點繪制指針。box_x變量是文本框x軸的新值。

完整代碼

以下是script.py文件的完整代碼:

pip install virtualenv

結(jié)論

圖像處理并不總是像看起來那么困難。雖然有些圖像處理庫無法直接用其模塊解決您的問題,但您可以使用現(xiàn)有模塊為您的用例實現(xiàn)特定解決方案。這就是編碼的魅力——能夠用自定義和特定解決方案來解決問題。

在本教程中,您學(xué)習(xí)了如何使用Python的Pillow庫來標(biāo)注圖像,添加自動換行的多行文本框等。您還學(xué)習(xí)了如何編寫可以幫助您進(jìn)行圖像處理的數(shù)學(xué)公式。

請參考Pillow文檔以詳細(xì)了解所用模塊。

以上是使用 Python 的 Pillow 庫在圖像上包裹和渲染多行文本的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Python的UNITDEST或PYTEST框架如何促進(jìn)自動測試? Python的UNITDEST或PYTEST框架如何促進(jìn)自動測試? Jun 19, 2025 am 01:10 AM

Python的unittest和pytest是兩種廣泛使用的測試框架,它們都簡化了自動化測試的編寫、組織和運行。1.二者均支持自動發(fā)現(xiàn)測試用例并提供清晰的測試結(jié)構(gòu):unittest通過繼承TestCase類并以test\_開頭的方法定義測試;pytest則更為簡潔,只需以test\_開頭的函數(shù)即可。2.它們都內(nèi)置斷言支持:unittest提供assertEqual、assertTrue等方法,而pytest使用增強版的assert語句,能自動顯示失敗詳情。3.均具備處理測試準(zhǔn)備與清理的機制:un

如何將Python用于數(shù)據(jù)分析和與Numpy和Pandas等文庫進(jìn)行操作? 如何將Python用于數(shù)據(jù)分析和與Numpy和Pandas等文庫進(jìn)行操作? Jun 19, 2025 am 01:04 AM

pythonisidealfordataanalysisionduetonumpyandpandas.1)numpyExccelSatnumericalComputationswithFast,多dimensionalArraysAndRaysAndOrsAndOrsAndOffectorizedOperationsLikenp.sqrt()

什么是動態(tài)編程技術(shù),如何在Python中使用它們? 什么是動態(tài)編程技術(shù),如何在Python中使用它們? Jun 20, 2025 am 12:57 AM

動態(tài)規(guī)劃(DP)通過將復(fù)雜問題分解為更簡單的子問題并存儲其結(jié)果以避免重復(fù)計算,來優(yōu)化求解過程。主要方法有兩種:1.自頂向下(記憶化):遞歸分解問題,使用緩存存儲中間結(jié)果;2.自底向上(表格化):從基礎(chǔ)情況開始迭代構(gòu)建解決方案。適用于需要最大/最小值、最優(yōu)解或存在重疊子問題的場景,如斐波那契數(shù)列、背包問題等。在Python中,可通過裝飾器或數(shù)組實現(xiàn),并應(yīng)注意識別遞推關(guān)系、定義基準(zhǔn)情況及優(yōu)化空間復(fù)雜度。

如何使用__ITER__和__NEXT __在Python中實現(xiàn)自定義迭代器? 如何使用__ITER__和__NEXT __在Python中實現(xiàn)自定義迭代器? Jun 19, 2025 am 01:12 AM

要實現(xiàn)自定義迭代器,需在類中定義__iter__和__next__方法。①__iter__方法返回迭代器對象自身,通常為self,以兼容for循環(huán)等迭代環(huán)境;②__next__方法控制每次迭代的值,返回序列中的下一個元素,當(dāng)無更多項時應(yīng)拋出StopIteration異常;③需正確跟蹤狀態(tài)并設(shè)置終止條件,避免無限循環(huán);④可封裝復(fù)雜邏輯如文件行過濾,同時注意資源清理與內(nèi)存管理;⑤對簡單邏輯可考慮使用生成器函數(shù)yield替代,但需結(jié)合具體場景選擇合適方式。

Python編程語言及其生態(tài)系統(tǒng)的新興趨勢或未來方向是什么? Python編程語言及其生態(tài)系統(tǒng)的新興趨勢或未來方向是什么? Jun 19, 2025 am 01:09 AM

Python的未來趨勢包括性能優(yōu)化、更強的類型提示、替代運行時的興起及AI/ML領(lǐng)域的持續(xù)增長。首先,CPython持續(xù)優(yōu)化,通過更快的啟動時間、函數(shù)調(diào)用優(yōu)化及擬議中的整數(shù)操作改進(jìn)提升性能;其次,類型提示深度集成至語言與工具鏈,增強代碼安全性與開發(fā)體驗;第三,PyScript、Nuitka等替代運行時提供新功能與性能優(yōu)勢;最后,AI與數(shù)據(jù)科學(xué)領(lǐng)域持續(xù)擴張,新興庫推動更高效的開發(fā)與集成。這些趨勢表明Python正不斷適應(yīng)技術(shù)變化,保持其領(lǐng)先地位。

如何使用插座在Python中執(zhí)行網(wǎng)絡(luò)編程? 如何使用插座在Python中執(zhí)行網(wǎng)絡(luò)編程? Jun 20, 2025 am 12:56 AM

Python的socket模塊是網(wǎng)絡(luò)編程的基礎(chǔ),提供低級網(wǎng)絡(luò)通信功能,適用于構(gòu)建客戶端和服務(wù)器應(yīng)用。要設(shè)置基本TCP服務(wù)器,需使用socket.socket()創(chuàng)建對象,綁定地址和端口,調(diào)用.listen()監(jiān)聽連接,并通過.accept()接受客戶端連接。構(gòu)建TCP客戶端需創(chuàng)建socket對象后調(diào)用.connect()連接服務(wù)器,再使用.sendall()發(fā)送數(shù)據(jù)和.recv()接收響應(yīng)。處理多個客戶端可通過1.線程:每次連接啟動新線程;2.異步I/O:如asyncio庫實現(xiàn)無阻塞通信。注意事

如何在Python中切片列表? 如何在Python中切片列表? Jun 20, 2025 am 12:51 AM

Python列表切片的核心答案是掌握[start:end:step]語法并理解其行為。1.列表切片的基本格式為list[start:end:step],其中start是起始索引(包含)、end是結(jié)束索引(不包含)、step是步長;2.省略start默認(rèn)從0開始,省略end默認(rèn)到末尾,省略step默認(rèn)為1;3.獲取前n項用my_list[:n],獲取后n項用my_list[-n:];4.使用step可跳過元素,如my_list[::2]取偶數(shù)位,負(fù)step值可反轉(zhuǎn)列表;5.常見誤區(qū)包括end索引不

__name__ ==' __ -main __”構(gòu)造的目的是什么? __name__ ==' __ -main __”構(gòu)造的目的是什么? Jun 19, 2025 am 01:09 AM

InPython,__name__isaspecialvariablethatindicateswhetherascriptisrundirectlyorimportedasamodule.Whenafileisexecuteddirectly,__name__issetto"__main__",butifit'simported,__name__becomesthemodule'sname.Thisallowscodeinsideif__name__=="__ma

See all articles