Как добавить текст в несколько изображений с помощью Python - PullRequest
0 голосов
/ 03 июня 2018

Я новичок в использовании Python, и у меня есть проблема, которую я не могу решить.Я пытаюсь сделать так, чтобы из таблицы Excel, содержащей три столбца (адрес изображения, текст 1 и текст 2 соответственно), код должен выбрать первое изображение, а затем вставить текст 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)

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Что вам нужно сделать, так это перебрать предметы, найденные 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 |

При чтении файла с пандами, когда у вас нет строки заголовка в 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
0 голосов
/ 03 июня 2018

Я не знаю 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...