Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 重复在图像上创建文本的算法_Python_Arrays_Python Imaging Library - Fatal编程技术网

Python 重复在图像上创建文本的算法

Python 重复在图像上创建文本的算法,python,arrays,python-imaging-library,Python,Arrays,Python Imaging Library,使用Python和PIL,我打算在现有图像上绘制文本 我有一个图像,上面有12个部分,我有一个数组,如下所示: array = [ [1,'ABC'], [2,'DEF'], [3,'XYZ'], [4,'aa1'], [1,'pqr'], [7,'etc'], [3,'klm'], [9,'bb'], [2,'aa'], [10,'xyz'], [11,'abc'], [1,'def'], ] 现

使用Python和PIL,我打算在现有图像上绘制文本

我有一个图像,上面有12个部分,我有一个数组,如下所示:

array = [
    [1,'ABC'],
    [2,'DEF'],
    [3,'XYZ'],
    [4,'aa1'],
    [1,'pqr'],
    [7,'etc'],
    [3,'klm'],
    [9,'bb'],
    [2,'aa'],
    [10,'xyz'],
    [11,'abc'],
    [1,'def'],
]
现在,根据数组中
a[0]中的数字,我必须将
a[1]
的文本放置在图像的
1-12部分中。我试过这个:

for a in arr_vals:
    if a[0] == 1:
        draw.text((337, 140), a[1], (231, 76, 60), font=font)
    elif a[0] == 2:
        draw.text((149, 62), a[1], (231, 76, 60), font=font)
    elif a[0] == 3:
        draw.text((337, 156), a[1], (231, 76, 60), font=font)
显然,出现的问题是,比如在上面的例子中,
array[0]
array[4]
在第一个索引中具有相同的值。这将导致图像中的文本被覆盖。在这种情况下,如何防止覆盖?在图像上递归放置文本的理想算法是什么

编辑:

我想要的是:根据数组的不同,红色文本应该出现在12个部分中的任何一个

生成的当前图像:

如您所见,由于代码中的位置相同,生成的图像与文本重叠。

您可以将项目组织到一个集合中,并按相似的区号对其进行分组。然后,对于每个区域,可以使用递增的y坐标渲染第一行之外的每一行文本,以便后面的行显示在前面的行的下方,而不是直接显示在它们的上方。例如:

array = [
    [1,'ABC'],
    [2,'DEF'],
    [3,'XYZ'],
    [4,'aa1'],
    [1,'pqr'],
    [7,'etc'],
    [3,'klm'],
    [9,'bb'],
    [2,'aa'],
    [10,'xyz'],
    [11,'abc'],
    [1,'def'],
]

d = {}
for item in array:
    d.setdefault(item[0], []).append(item[1])
print d

#d now contains something that looks like:
#{1: ['ABC', 'pqr', 'def'], 2: ['DEF', 'aa'], 3:...}

#height of a single line of text, in pixels.
#I don't know what this should actually be. Depends on your font size, I guess.
line_height = 20

color = (231, 76, 60)
for area in d.iterkeys():
    #somehow get the base coordinates for this particular area.
    #you originally used a lot of if-elifs, but a dict could work too.
    coords = ???
    y_offset = 0
    for line in d[area]:
        draw.text(coords[0], coords[1]+y_offset, line, color, font=font)
        y_offset += line_height

你能澄清一下吗?如果您同时拥有
[1,'ABC']
[1,'pqr']
,您只希望写入第一个?不,我需要
ABC
pqr
都显示在同一部分中。我似乎无法解决的问题是如何防止文本被写在同一个区域。节和区域之间的区别是什么?也许你可以画一张你想要的输出和你得到的输出的图片。@Kevin,我添加了图片。这很有效!对于
coords
我只是根据
区域设置if条件,因为每个部分的起始位置是固定的。