# ImageDraw.textsize()和ImageDraw.text()怎么使用
## 引言
在Python的圖像處理領域,Pillow庫(PIL的分支)是最常用的工具之一。其中`ImageDraw`模塊提供了強大的繪圖功能,而`textsize()`和`text()`方法是處理文本繪制的核心函數。本文將深入探討這兩個方法的使用技巧、參數解析以及實際應用場景。
## 一、環境準備與基礎概念
### 1.1 安裝Pillow庫
```python
pip install Pillow
from PIL import Image, ImageDraw, ImageFont
ImageDraw.Draw(): 創建繪圖對象ImageFont.truetype(): 加載字體文件ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left")
| 參數名 | 類型 | 說明 |
|---|---|---|
| xy | tuple | 文本左上角坐標(x,y) |
| text | str | 要繪制的文本內容 |
| fill | color | 文本顏色,支持RGB/RGBA格式 |
| font | ImageFont | 字體對象 |
| anchor | str | 文本錨點位置(如”mm”表示中心對齊) |
| spacing | int | 行間距(多行文本) |
| align | str | 對齊方式(left/center/right) |
# 創建空白圖像
image = Image.new('RGB', (400, 200), (255, 255, 255))
draw = ImageDraw.Draw(image)
# 繪制文本
draw.text((50, 50), "Hello Pillow!", fill=(0, 0, 0))
image.save("basic_text.png")
font = ImageFont.truetype("arial.ttf", size=24)
draw.text((100, 100), "Styled Text", fill="blue", font=font)
multiline_text = "This is\na multi-line\ntext example"
draw.text((50, 50), multiline_text, fill="black", spacing=10, align="center")
ImageDraw.textsize(text, font=None, spacing=0)
返回包含文本寬高的元組:(width, height)
text = "Centered Text"
font = ImageFont.truetype("arial.ttf", 30)
w, h = draw.textsize(text, font=font)
# 計算居中位置
x = (image.width - w) / 2
y = (image.height - h) / 2
draw.text((x, y), text, fill="red", font=font)
def wrap_text(text, font, max_width):
lines = []
words = text.split()
while len(words) > 0:
line = ''
while len(words) > 0:
test_line = line + words[0] + ' '
test_width = draw.textsize(test_line, font=font)[0]
if test_width <= max_width:
line = test_line
words.pop(0)
else:
break
lines.append(line)
return lines
# 使用示例
wrapped_lines = wrap_text("Long text that needs wrapping...", font, 200)
# 主文本
text = "Shadow Effect"
font = ImageFont.truetype("arial.ttf", 48)
# 計算文本尺寸
w, h = draw.textsize(text, font=font)
# 繪制陰影(偏移3像素)
draw.text((53, 53), text, fill="#888888", font=font)
# 繪制主文本
draw.text((50, 50), text, fill="#FF0000", font=font)
def add_watermark(image, text, angle=30):
# 創建透明層
watermark = Image.new("RGBA", image.size, (0,0,0,0))
waterdraw = ImageDraw.Draw(watermark)
# 設置字體
font = ImageFont.truetype("arial.ttf", 36)
w, h = waterdraw.textsize(text, font=font)
# 計算重復繪制的位置
for x in range(0, image.width, w+100):
for y in range(0, image.height, h+100):
waterdraw.text((x, y), text, fill=(255,255,255,50), font=font)
# 旋轉水印
watermark = watermark.rotate(angle)
# 合并圖像
return Image.alpha_composite(image.convert("RGBA"), watermark)
# 指定中文字體路徑
font = ImageFont.truetype("msyh.ttc", 20)
draw.text((10,10), "中文測試", fill="black", font=font)
| 方法 | 優點 | 缺點 |
|---|---|---|
| textsize() | 簡單直接 | 已棄用(Pillow 9.2.0+) |
| textlength() | 精確測量 | 僅返回寬度 |
| getbbox() | 完整邊界框 | 需要先繪制文本 |
從Pillow 9.2.0開始:
- textsize()被標記為棄用
- 推薦使用textbbox()或textlength()
# 舊方法
w, h = draw.textsize(text, font=font)
# 新方法
left, top, right, bottom = draw.textbbox((0,0), text, font=font)
w = right - left
h = bottom - top
掌握ImageDraw.text()和textsize()方法的組合使用,可以解決大多數圖像文本處理需求。雖然新版本中有API變化,但核心邏輯保持一致。建議在實際項目中:
1. 始終明確文本定位需求
2. 注意字體文件的跨平臺兼容性
3. 對復雜文本布局考慮使用更專業的排版引擎
通過文中的示例代碼和最佳實踐,開發者可以快速構建出專業的圖像文本處理功能。
附錄:常用顏色值參考表
| 顏色名 | RGB值 | HEX值 |
|---|---|---|
| 白色 | (255,255,255) | #FFFFFF |
| 黑色 | (0,0,0) | #000000 |
| 紅色 | (255,0,0) | #FF0000 |
| 半透明白 | (255,255,255,128) | #FFFFFF80 |
”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。