![](/img/trans.png)
[英]How do I calculate the distance between a set x, y coordinate and location variables?
[英]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()
這是結果:
此代碼有效,但我希望時間和名稱能夠是動態的。 如果我將name
變量更改為“A very long username”,我會得到以下結果:
如何計算阻止用戶名和日期重疊所需的 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.