Здравствуй Хабр! На этот раз я хотел бы поделиться с вами интересным способом создания большого количества шаблонных картинок с разными данными за очень короткий промежуток времени с помощью небольшого количества программирования. Начнем с того, что у некоторых людей иногда встает задача сделать много однотипных картинок, схожих по структуре, но с разной наполненностью и на это уходит порядочно времени. При чем часто данные для этих картинок лежат в экселе или могут быть экспортированы в него. Собственно с помощью него мы и будем создавать магию по созданию контента. Сразу оговорюсь, все примеры шуточные и на настоящий контент ну никак не тянут. Я не дизайнер и эта статья про принцип работы, а не про то как сделать классный контент. Уверен, что комбинируя разные элементы, красивый текст, удачные картинки можно добиться легкого создания картинок, выполненных в одном стиле со вкусом. Существуют приложения с похожим функционалом, но может, кому-то данный тутор будет полезен, тем более что здесь все можно настроить под себя)
Настройка "датасета"
Сперва подготовим эксель табличку с данными. Она должна быть прямоугольной: количество ячеек в каждой строке должно быть одинаковым без пропусков. В первой строке указываем имя столбца, желательно емкое и в одно слово. Количество столбцов не должно превышать 13(или около того, точно не припомню). В ячейках может быть любой текст или путь до картинки на вашем компьютере. Не забывайте указывать разрешение файла. Для примера я сделал вот такой датасет:
Далее сохраняем сие деяние в формате CSV - разделитель запятая. На самом деле подойдет любой CSV, главное глянуть какой там разделитель. Фотошоп принимает только разделитель запятую и, по моим наблюдениям, только txt формат, но об этом позже.
Стоит обратить отдельное внимание на пустые строки после таблицы. Их быть не должно. Проверить их наличие и удалить можно открыв сохраненный файл через блокнот(там будет что-то вроде ';;;;;;;;')
Немного кода
Так как настроить все с первого раза, еще и грамотно вряд ли получится, плюс эксель не лучший способ генерировать рандомные данные и обрабатывать их, воспользуемся скриптом на питоне для обработки получившегося файла. В конкретном случае я имитировал проблему того, что некоторые имена написаны в неполном виде (не Дмитрий а Дима), а некоторые в полоном. Прочитаем файл, разобьем каждую строку по разделителю ";". Тут если честно наверное моя частная проблема, потому что при сохранении в формате CSV - разделитель запятая через эксель, разделитель как был так и остается точкой с запятой. Поэтому я разбиваю строки таблицы по нему и дальше обрабатываю имена. Вам стоит открыть CSV через блокнот и посмотреть какой у вас разделитель. В силу того, что строки подобны друг другу, можно без опасений обращаться через индексы к конкретному слову. Я создал словарь имен и если имя написано не полно, то заменяю его на полную версию. Дальше записываю получившиеся строки уже через запятую обратно в файл. Тут можно не открывать старый файл, как сделал я, а сразу сохранять в новый текстовик, так будет даже проще. На этапе изменения данных вы можете преобразовывать их как угодно. Важно: не трогать первую строку, она должна остаться такой какая есть, разве что поменяются разделители и сохранить количество отделяемых разделителем слов в строке. Стоит пару раз данные вывести в консоль, что бы глянуть все ли в порядке.
Итоговый CSV файл должен быть такой (тут пример пустых строк, такие стоит удалить заранее, мой скрипт такое предусматривает и не ломается)
Экспорт данных в фотошоп
После того как файл будет перезаписан, конвертируем его в txt, если вы этого не сделали раньше. Сделать это можно открыв CSV файл эксель через блокнот и нажав кнопку "сохранить как".
Далее открываем наш любимый фотошоп. Нам нужно набросать примерный эскиз будущего изображения. Важно сделать слои, которые вы будете менять (текстовые и растровые) отдельными от себе подобных, которые изменятся не будут. Допустим в моем примере name - отдельный текстовый слой Дмитрий, sname - отдельный текстовый слой Васичкин, img - отдельное растровое поле Слой2, они будут изменяться.
Теперь нам нужно определить переменные - то есть слои, которые будут меняться
В поле слой нужно выбрать для каждого изменяющегося слоя тип его замещения (замена текста для текста или замещение пикселей для растра) и определить имя переменной. Это как раз названия столбцов, которые были в изначальном эксель файле. Определяем для каждой переменной соответствующий слой
Рядом с уже определенными слоями появится звездочка в списке слоев. Когда все переменные будут определены жмем кнопку далее. Откроется меню выбора набора данных. Импортируем наш текстовый файл с данными, кодировку можно поставить автомат. Количество переменных должно быть меньше или равно количеству данных в строке. Если импорт прошел успешно, внизу появятся ваши данные из файла
Нажимаем окей, данные добавлены
Запускаем цех по производству контента
Все готово что бы начать колдовать. Под кнопкой переменные, которую мы уже нажимали, есть кнопка применить наборы данных. Жмякаем, ставим галочку на предпросмотр и наслаждаемся автоматической подстановкой данных.
Собственно останется немного поправить расположение слоев, или еще чего-то, но это уже мелочи. Потратив один раз время на настройку такого способа создания контента вы сэкономите тонну времени и нервов. Удачного копипаста!
Комментарии (27)
damnsonwheredyafindthis
19.04.2022 09:47Я бы всё-таки посоветовал для этого использовать data merge в индизайне, а в ps готовить только мастеры и прочий растр
skrutikovksy Автор
19.04.2022 09:48Может быть, так удобнее, однако я своей целью ставил ознакомление с данной возможностью фотошопа.
lab412
19.04.2022 09:52поздравительные тексты содержат одни и те-же данные. "первое место", "второе место"... а так же "молодец", "поздравляю"... указывайте просто номер места - 1/2/3, а текст берите из другого места. поздравлений так же сделайте 10 вариантов и берите случайно для каждого получателя. так вы упростите редактирование таблиц и без труда добавите новые поздравления потом в систему без необходимости редактировать мега таблицы с руками рандомизировать строки
я не увидел привязки картинке к месту или еще чему, а значит они тоже рандомно могут браться. даже таблицы не надо - просто прочитайте что в папке и берите любую картинку из имеющихся
для "красоты" работы лучше брать картинки и поздравления без повторов, ну конечно для случаев если у вас поздравлений более чем количество бумажек что надо сгенерировать
саму картинку на задний фон так же можно генерировать на лету. скажем там кубок нарисован - вы можете его ставить слева или справа. можно добавить набор картинок с альфой где будут нарисованы всякие рамочки, линии с завитушками и т.п. - так же берете их случайно из папки и вставляете...
у меня куча таких "проектов" по генерации контента и видео в том числе. только я в Nuke делаю, а не в фотошопе. не знаю можно ли в фотошопе "рисовать" рамки на лету под текст. скажем я сделал некую рамочку из простых элементов - линий, закругленных углов т.п. написал простой экспрешен где на вход подаются размеры рамочки, а экспрешен раздвигает всё под эти размеры. в итоге на входе текст. он рисуется, потом берется его линейные размеры и под эти размеры делается рамочка...
в общем если взялись за скриптование - не стесняйтесь делать много всего. это и интересно и позволит сильно разнообразить контент на выходе
skrutikovksy Автор
19.04.2022 09:58Я особо не стал углубляться в тему, скорее дал дорогу для дальнейшего творчества. Не многие про эту функцию знают и еще меньше тех, кто ей пользуется. Так что тут скорее обзор на минимальный функционал данного инструмента фотошопа, чем полный гайд. Для многих и предоставленного материала будет достаточно, лично я в своих работах ограничивался им.
vconst
19.04.2022 10:00Этот функционал лучше реализован в индизе, как выше заметили. И годится он только для генерации тонны визиток, билетов, скидочных карточек и тп шаблонной продукции.
skrutikovksy Автор
19.04.2022 10:03Данные я просто написал рандомные и потом прокопипастил дабы не занимать у себя много времени. вполне можно создать кастомные данные и с помощью скриптов, сгенерировать огромное количество наборов данных (у меня доходило до 50 тысяч уникальных наборов данных). Хоть датасеты создавай. Картинки так же можно закинуть в папку и условно пронумеровать от 1 до n и в скрипте подставлять в конце директории итератор + расширение, что бы пройтись по ним всем. В общем странные замечания про данные как по мне, ибо тут пример просто на пальцах и в целом эти данные могут быть абсолютно любыми.
morgreek
21.04.2022 11:14Да, в фш можно автоматизировать много чего, как с помощью макросов (экшенов), так и с помощью скриптов на js, vbs или applescript. Главное, пройтись через дебри документации по js (хотя, сейчас она стала значительно лучше) и объектной модели документа. В идеале постичь Action Manager.
Я раньше для родителей чеки оплаты кварплаты с сайта банка сохранял в пдф, а затем через скрипт фотошопа объединял в один файлик на одном листе A4, с жирным выделением суммы и поставщика услуг.
vconst
19.04.2022 09:58И зачем здесь этот вольный пересказ хелпа к фотошопу? Просто решили поделиться своим «открытием»?
Особенно порадовал «экспорт» csv в txt. Мы на Хабре или где? Для этого недостаточно просто поменять расширение?
Да и скрипт не особо нужен, поиск/замена справится с такой задачей без проблемskrutikovksy Автор
19.04.2022 10:07Не многие знают про данный функционал, постарался максимально просто изложить его. На счет скрипта, по мне проще написать пару строк на питоне чем копаться в функциях экселя, хоть он и позволяет решить 90% задач, однако порой без макросов не обойтись, а это, в свою очередь, тоже скрипт.
vconst
19.04.2022 10:22Я вас уверяю, в фотошлопе есть еще много того, о чем мало кто знает. Но вряд ли надо пересказывать на Хабре адобовский хелп, потому что никаких киллер-фич в этом нет, как и чего-то интересного
К генерации контента эта функция тоже имеет весьма отдаленное отношение
Хабр это не свиттер, не стоит тут сообщать о всех личных событиях и успехах
randomsimplenumber
19.04.2022 11:20+1Думаю, напечатать шаблонный текст поверх картинки можно 100500 способов придумать. Начиная с однострочника на bash + imagemagick ;). У кого есть Photoshop - почему бы и не воспользоваться.
vanyas
19.04.2022 13:54-1А зачем тут, собственно, фотошоп? Чего бы уже в питоне и не накладывать текст на фото, библиотек хватает для этого, или тот же imagemagic использовать.
randomsimplenumber
19.04.2022 14:06+1В Фотошопе результат виден сразу. В чисто программном решении -будет как минимум долгая игра со шрифтами.
vanyas
19.04.2022 14:08-1Ну так поиграл со шрифтами в GUI редакторе, выбрал подходящий и запускай пакетную обработку на imagemagic c нужным шрифтом
randomsimplenumber
19.04.2022 14:44+1.. высветление вокруг букв (не знаю как это по типографски) нарисовал..
vconst
19.04.2022 15:04Фотошоп автор знает, а библиотеки питона — не знает
skrutikovksy Автор
19.04.2022 15:30Я не претендовал на знание питоновских библиотек) Раз на то пошло в питоне есть библиотеки вообще на все, смело можно под каждой статьей писать «можно было использовать %name% библиотеку питона». Тут статья по большей части для работы непосредственно в фотошопе с использованием небольшого скрипта, который в целом можно и заменить другим средством создания шаблонного текста
skrutikovksy Автор
19.04.2022 15:35В фотошопе вагон и маленькая тележка средств обработки текста, картинок и тому подобное. Он для этого и предназначен собственно. Не думаю что захочется писать тыщу строк кода ради одного шаблона который можно было бы спокойно сделать в фотошопе за пять минут как сделал я. Да и условный дизайнер или фрилансер скорее всего достаточным наыком программирования, что бы написать таковой.
randomsimplenumber
19.04.2022 21:32+2Вот именно. Мне тоже кажется, что нарисовать макет в Фотошопе и прикрутить к нему автоматизацию проще чем кодить графику в Python (игры с цветами,шрифтами, отступами..).. У минусующих, похоже, свои соображения ;)
lxsmkv
20.04.2022 05:53Простите, оффтоп, но не могу промолчать.
Если бы я был футболистом в юношеском клубе или школьной команде, я бы побрезговал принять такую грамоту. В ней не то что отсутствует всякий намек на эстетику, это просто неуважение к человеку и его заслуге. Получается автоматизация неуважения какая-то. Может есть пример поприличнее?avkor2021
20.04.2022 10:36Сейчас вообще как-то много дают наград просто так детям, собственно от этого они обесцениваются Если в конкурсе участвуешь и что-то сделал хорошее вот тебе грамота, если отличное - вот тебе диплом за первое место. Участвует 100 человек - будет 30 дипломов за первое место, 30 за второе, 30 за третье и остальным сертификаты. Всё это складывается в папку под названием "портфолио" и зачем-то храниться, маленьким детям это ещё интересно, а с возрастом начинают понимать что ценности у таких "наград" никакой нет.
skrutikovksy Автор
20.04.2022 13:16+1Если бы я увлекался дизайном, непременно сделал бы все красиво. Можно делать очень красивые стилистические посты данным способом, но у меня к сожалению руки не из того места для этого. Лично я использовал для печати справок с разными текстовыми данными, очень даже удобно получилось тк речь шла о тысячных масштабах. В данном примере я хотел показать, что и с графикой тоже получится работать.
prinv
С кодом на python надо бы поработать - это не python-style
Например, код for i in range(len(read_file)) прекрасно превращается в for i in read_file. Ну дальше подобное имеется в нескольких местах.
Такое впечатление, что код на C переписали на python
skrutikovksy Автор
Я особо не парился на счет кода, написал что бы принцип показать. Плюс я сначала так и написал через for in file, но тогда исходный массив не изменялся если я изменял i, а заводить отдельный массив не очень хотелось