如何使用 Python 将文本添加到多个图像

Posted

技术标签:

【中文标题】如何使用 Python 将文本添加到多个图像【英文标题】:How to add text to multiple images using Python 【发布时间】:2018-11-12 16:29:09 【问题描述】:

我是使用 Python 的新手,但我遇到了一个无法解决的问题。我要做的是从包含三列(分别为图像地址、文本 1 和文本 2)的 excel 电子表格中,代码应选择第一个图像,然后插入属于其行的文本 1 和 2 .我能够完成单个图像的代码,但是当我尝试处理所有图像时遇到问题。

import pandas as pd
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

ruta_excel = pd.read_excel('C:/Users/san_2/Documents/Script/ARCPY/Direc.xls',
                           sheet_name=0)
ruta = ruta_excel.iat[0, 0]

image_files = Image.open(ruta)
font_type = ImageFont.truetype('C:/Windows.old/Windows/Fonts/Arial.ttf',18)
draw = ImageDraw.Draw(image_files)
draw.text(xy=(20, 550), text=ruta_excel.iat[0, 1], fill=(255, 255, 255),
          font=font_type)
draw.text(xy=(20, 570), text=ruta_excel.iat[0, 2], fill=(255, 255, 255),
          font=font_type)

image_files.save(ruta, 'JPEG', quality=90)

谢谢

【问题讨论】:

我相信我有一个解决方案,但是因为我之前没有使用过panadas模块,所以我想确认一件事,ruta=ruta_excel.iat[0,0]这行是不是,意思是先看看excel文件的行和第一列?,这是否意味着查看下一行,它需要是ruta=ruta_excel.iat[1,0]。这将帮助我确保我的答案是正确的。 【参考方案1】:

我不知道PIL,但如果您的代码适用于第一个图像并且您的问题是迭代,那么您可以这样做:

import pandas as pd
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

ruta_excel=pd.read_excel('C:/Users/san_2/Documents/Script/ARCPY/Direc.xls',sheet_name=0)
# iterate over rows with itertuples
for row in ruta_excel.itertuples(index=False):
    print (row) # to help you see what is happening but not necessary after
    # row is tuple, doing row[0] access to the first item (the first column)
    ruta=row[0]
    image_files = Image.open(ruta)
    font_type = ImageFont.truetype('C:/Windows.old/Windows/Fonts/Arial.ttf',18)
    draw = ImageDraw.Draw(image_files)
    # here you use row[1] and row[2]
    draw.text(xy=(20,550),text= row[1],fill=(255,255,255),font=font_type)
    draw.text(xy=(20,570),text= row[2],fill=(255,255,255),font=font_type)

    image_files.save(ruta, 'JPEG', quality=90)

【讨论】:

谢谢,它工作正常,现在我对这个功能有了更多了解。【参考方案2】:

您需要做的是遍历pd.read_excel 找到的项目。此函数返回一个DataFrame,因此您可以使用它的三个内置迭代器之一:itertuples、iteritems 或iterrows。

鉴于此示例 XLS:

|   | A              | B            | C             |
| - | -------------- |--------------| --------------|
| 1 | /a/file/path/1 | first text 1 | second text 1 |
| 2 | /a/file/path/2 | first text 2 | second text 2 |
| 3 | /a/file/path/3 | first text 3 | second text 3 |
| 4 | /a/file/path/4 | first text 4 | second text 4 |
| 5 | /a/file/path/5 | first text 5 | second text 5 |

当使用 pandas 读取文件并且 XLS 中没有标题行时,应指定 header=None 并在 names 中提供列名。如果您有标题行并且它是 XLS 的第一行,则只需传递 header=0 并省略 names。通过确保您可以将每列映射到列名,您可以使用itertuples,这对于您的用例来说是最适合的方法 - 您可以在循环中通过列名访问行值:

import pandas as pd

exc = pd.read_excel('file_text_map.xlsx', header=None, names=('file_path', 'text1', 'text2',))

for row in exc.itertuples(index=False):
  print('file_path:', row.file_path, ', text1:', row.text1, ', text2:', row.text2)

这会导致

file_path: /a/file/path/1 , text1: first text 1 , text2: second text 1
file_path: /a/file/path/2 , text1: first text 2 , text2: second text 2
file_path: /a/file/path/3 , text1: first text 3 , text2: second text 3
file_path: /a/file/path/4 , text1: first text 4 , text2: second text 4
file_path: /a/file/path/5 , text1: first text 5 , text2: second text 5

【讨论】:

感谢您的澄清,我会记住下一个脚本

以上是关于如何使用 Python 将文本添加到多个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何增加文本的笔画或使图像中的文本加粗?在 Python 中

使用 xslt 模板将多个图像添加到 docx 文件

如何将多个图像作为输入传递给python脚本

如何使 QPushButtons 将文本添加到 QLineEdit 框中?

如何将 SVG 图像添加到 vuetify 文本字段

使用 libgdx,如何将文本和图像添加到 ScrollPane?