簡體   English   中英

我將如何計算在 PIL 中保持兩個繪制句子之間的空間所需的 X 坐標?

[英]How would I calculate the X coordinate required to keep space between 2 drawn sentences in PIL?

我正在嘗試制作 Python 腳本來生成假的 Discord 消息,這是我到目前為止的代碼:

from PIL import Image, ImageFont, ImageDraw

text = "Hello"
name = "A username...."
date = "Today at 10:30 AM"

comment = Image.open("message.png")

text_font = ImageFont.truetype("whitneybook.otf", 31)
name_font = ImageFont.truetype("whitneymedium.otf", 32)
date_font = ImageFont.truetype("whitneymedium.otf", 25)
    
draw = ImageDraw.Draw(comment)

draw.text((129, 70), text, (215, 215, 215), font=text_font)
draw.text((129, 25), name, (250, 250, 250), font=name_font)
draw.text((356, 32), date, (120, 120, 120), font=date_font)

comment.show()

這是結果:

測試 1

此代碼有效,但我希望時間和名稱能夠是動態的。 如果我將name變量更改為“A very long username”,我會得到以下結果:

測試 2

如何計算阻止用戶名和日期重疊所需的 X 坐標?

字體對象有一個getsize方法,應該可以滿足您的目的。 一種或另一種方式,這解決了你所有的問題。

在最簡單的情況下,您只想找到日期的 x 坐標:

date_x = name_font.getsize(name)[0] + 129 + 32
draw.text((date_x, 32), date, (120, 120, 120), font=date_font)

date_x中的偏移量對於文本的左偏移量是 129,對於名稱日期填充是 32。

現在您可能不想在圖像邊緣運行您的日期。 事實上,假設您希望始終確保 10 像素的右邊距。 在這種情況下,您可能需要通過在其他兩行之間插入以下內容來稍微調整 x 坐標:

max_date_x = comment.width - 10 -  date_font.getsize(date)[0]
date_x = min(date_x, max_date_x)

最后,如果用戶名超過一定長度,您可能希望截斷用戶名。 這有點不重要,因為每個字母的大小不同。 您要定位的空間量是date_x - 129 ,但還要考慮截斷名稱和一些填充后的省略號。 讓我們做一個線性搜索:

name_width = name_font.getsize(name)[0]
name_space = date_x - 129 - 10
n = 0
while name_width > name_space:
    n += 1
    name_width = name_font.getsize(name[:-n] + '...')
display_name = name[:-n] + '...' if n else name

您可以對n的正確值進行二進制搜索來執行相同的操作。 不要忘記在這個版本中繪制display_name而不是name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM