首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Python将文本添加到多个图像

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

Stack Overflow用户
提问于 2018-06-03 07:03:24
回答 2查看 821关注 0票数 3

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

代码语言:javascript
复制
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)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-03 08:31:29

我不知道PIL,但是如果你的代码对第一个图像有效,而你的问题是迭代,那么你可以这样做:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-03 08:33:37

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

给定此示例XLS:

代码语言:javascript
复制
|   | 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 |

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

代码语言:javascript
复制
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)

这将导致

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50661910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档