快速開始
萬事起頭難,所以我們需要一個簡單的開始。
從一個字串開始
先給定一個基本宣告,然後就可以開始使用了。
from wordcanvas import WordCanvas
gen = WordCanvas()
全部使用預設功能,直接調用函數即可生成文字圖像。
text = "你好!Hello, World!"
img, infos = gen(text)
print(img.shape)
# >>> (67, 579, 3)
提示
在預設模式下,輸出影像的尺寸取決於:
- 字型大小:預設為 64,隨著字型大小的增加,影像尺寸也會增加。
- 文字長度:文字越長,影像寬度也會增加,具體長度由
pillow
決定。
指定特定字型
使用 font
參數可以指定自己喜歡的字型。
gen = WordCanvas(
font_path="/path/to/your/font/OcrB-Regular.ttf"
)
text = 'Hello, World!'
img, infos = gen(text)
當字型不支援輸入文字時,會出現豆腐字。
text = 'Hello, 中文!'
img, infos = gen(text)
提示
檢查字型是否支援的方法:
目前我沒有這種需求,所以我留下了一個基礎的方法。這個方法是一個簡單的檢查,每次只能檢查一個字元,所以需要遍歷所有的字元。如果你有其他需求,請自行擴展。
check_font.py
from wordcanvas import is_character_supported, load_ttfont
target_text = 'Hello, 中文!'
font = load_ttfont("/path/to/your/font/OcrB-Regular.ttf")
for c in target_text:
status = is_character_supported(font, c)
if not status:
print(f"Character: {c}, Not Supported!")
# >>> Character: 中, Not Supported!
# >>> Character: 文, Not Supported!
設定影像尺寸
使用 output_size
參數可以調整影像尺寸。
gen = WordCanvas(output_size=(64, 1024)) # 高度 64,寬度 1024
img, infos = gen(text)
print(img.shape)
# >>> (64, 1024, 3)
當設定的尺寸小於文字圖像的尺寸時,會自動縮放文字圖像。
也就是說,文字會擠在一起,變成瘦瘦地長方形,例如:
text = '你好' * 10
gen = WordCanvas(output_size=(64, 512)) # 高度 64,寬度 512
img, infos = gen(text)
調整背景顏色
使用 background_color
參數可以調整背景顏色。
gen = WordCanvas(background_color=(255, 0, 0)) # 藍色背景
img, infos = gen(text)
調整文字顏色
使用 text_color
參數可以調整文字顏色。
gen = WordCanvas(text_color=(0, 255, 0)) # 綠色文字
img, infos = gen(text)
調整文字對齊
注意
還記得剛才提到的影像尺寸嗎?在預設的情況下,設定文字對齊是沒有意義的。你必須讓文字影像有多餘的空間,才能看到對齊的效果。
使用 align_mode
參數可以調整文字對齊模式。
from wordcanvas import AlignMode, WordCanvas
gen = WordCanvas(
output_size=(64, 1024),
align_mode=AlignMode.Center
)
text = '你好! Hello, World!'
img, infos = gen(text)
-
中間對齊:
AlignMode.Center
-
靠右對齊:
AlignMode.Right
-
靠左對齊:
AlignMode.Left
-
分散對齊:
AlignMode.Scatter
提示在分散對齊的模式中,不是每個字元都會分散開來,而是以單詞為單位進行分散。在中文中,單詞的單位是一個字;在英文中,單詞的單位是一個空格。
以上圖為例:輸入文字是 "你好! Hello, World!"。這個字串會被拆分為:
-
["你", "好", "!", "Hello,", "World!"]
並忽略空白後,再進行分散對齊。
另外,當輸入文字只能拆分出一個單詞的時候,中文單詞的分散對齊等價於置中對齊,英文單詞則會被拆分成單字後,再進行分散對齊。
這個部分我們使用的邏輯是:
def split_text(text: str):
""" Split text into a list of characters. """
pattern = r"[a-zA-Z0-9\p{P}\p{S}]+|."
matches = regex.findall(pattern, text)
matches = [m for m in matches if not regex.match(r'\p{Z}', m)]
if len(matches) == 1:
matches = list(text)
return matches -