Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算在PIL中保持两个已绘制句子之间的空间所需的X坐标?_Python_Python 3.x_Math_Python Imaging Library - Fatal编程技术网

Python 如何计算在PIL中保持两个已绘制句子之间的空间所需的X坐标?

Python 如何计算在PIL中保持两个已绘制句子之间的空间所需的X坐标?,python,python-3.x,math,python-imaging-library,Python,Python 3.x,Math,Python Imaging Library,我正在尝试制作一个Python脚本来生成一个虚假的Discord消息,到目前为止,这是我的代码: 从PIL导入图像、ImageFont、ImageDraw text=“你好” name=“用户名…” date=“今天上午10:30” comment=Image.open(“message.png”) text\u font=ImageFont.truetype(“whitneybook.otf”,31) name\u font=ImageFont.truetype(“whitneymedium.

我正在尝试制作一个Python脚本来生成一个虚假的Discord消息,到目前为止,这是我的代码:

从PIL导入图像、ImageFont、ImageDraw
text=“你好”
name=“用户名…”
date=“今天上午10:30”
comment=Image.open(“message.png”)
text\u font=ImageFont.truetype(“whitneybook.otf”,31)
name\u font=ImageFont.truetype(“whitneymedium.otf”,32)
date\u font=ImageFont.truetype(“whitneymedium.otf”,25)
draw=ImageDraw.draw(注释)
draw.text((129,70),text,(215,215,215),font=text\u font)
draw.text((129,25),name,(250250250),font=name\u font)
draw.text((356,32),日期,(120,120,120),font=date\u font)
comment.show()
这就是结果:

这段代码可以工作,但我希望时间和名称能够是动态的。如果我将
name
变量更改为“一个很长的用户名”,我会得到以下结果:

如何计算阻止用户名和日期重叠所需的X坐标?

字体对象有一种方法,可以满足您的需要。无论如何,这解决了你所有的问题

在最简单的情况下,您只需要找到日期的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

现在你可能不想让你的约会偏离图像的边缘。事实上,假设您希望始终为其确保10px的正确余量。在这种情况下,您可能需要通过在其他两行之间插入以下内容来稍微调整x坐标:

max_date_x = comment.width - 10 -  date_font.getsize(date)[0]
date_x = min(date_x, max_date_x)
最后,如果用户名超过一定长度,您可能需要截断它。因为每个字母的大小不同,所以这就不那么琐碎了。您的目标空间量为
date\u 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\u name
,而不是
name

您需要逐个字符(或二进制搜索)采样字符串长度,直到找到所需的长度。@mad物理学家您能更详细地解释一下吗?我不太清楚你的意思。喜欢这个答案。谢谢!这很有效:D