Как изменить текст в скрипте python-fu gimp без изменения шрифта?

У меня есть мастер-изображение, которое я редактирую в Gimp, чтобы получить желаемый внешний вид. Затем я хочу использовать скрипт Python для создания набора новых изображений с измененным текстом (на нескольких разных слоях). Я хотел бы оставить шрифт, размер, выделение курсивом или нет и т. д. в покое.

Я успешно изменил текст в своем пакетном скрипте с помощью этой функции:

pdb.gimp_text_layer_set_text(layer, text)

Проблема в том, что это также перезаписывает шрифт и другие параметры текста, которые я выбрал в мастер-файле. Есть ли способ изменить только текст и оставить шрифт в покое?

В качестве альтернативы, более неуклюжим способом было бы попытаться сохранить все важное о шрифте до изменения и попытаться применить его повторно. Это то, что я пробовал:

# Find the text layer
text1_layer = filter(lambda x: x.name == 'text1', im.layers)[0]

# Save the font                
font = pdb.gimp_text_layer_get_font(text1_layer)                              
font_size, font_unit = pdb.gimp_text_layer_get_font_size(text1_layer)

# Set the text       
pdb.gimp_text_layer_set_text(text1_layer, tex1_text)

# Restore the font                       
pdb.gimp_text_layer_set_font(text1_layer, font)                               
pdb.gimp_text_layer_set_font_size(text1_layer, font_size, font_unit)

К сожалению, это не работает последовательно. Похоже, что команды get_font и get_font_size получают правильный шрифт для одного из слоев, но не для других. Кажется, что он не сохраняет курсив и т. д., и я бы не ожидал, что он сохранится независимо от того, подчеркнут ли текст.

Третий вариант — жестко запрограммировать шрифт. Мне нужно было бы просмотреть все текстовые поля, выяснить, каковы параметры шрифта, и жестко закодировать их для каждого из них. Затем, если я переделаю мастер-файл (что я буду делать часто), мне придется повторить процесс. Это не должно быть необходимо.


person argentum2f    schedule 22.06.2017    source источник
comment
Это явно не то поведение, которое должно быть у pdb.gimp_text_layer_set_text. Не могли бы вы заполнить отчет об ошибке для этого на bugzilla.gnome.org/page .cgi?id=browse.html&product=GIMP ?   -  person jsbueno    schedule 23.06.2017


Ответы (2)


Я провел немного больше исследований и нашел решение, которое работает для меня в gimp, однако похоже, что вам, вероятно, следует использовать что-то другое, кроме gimp, например imagemagick, если вы много редактируете текст из скрипта.

Решение заключается в том, что когда вы изменяете текст в редакторе GIMP, вам нужно изменить шрифт в диалоговом окне инструмента, чтобы он устанавливался как свойство слоя, вместо того, чтобы просто выбирать текст и изменять шрифт в появившемся плавающем окне шрифта — это изменяет шрифт выбранного вами текста, но оставляет без изменений базовый шрифт текстового слоя.

Оказывается, функциональность gimp text довольно плохая, и в Интернете есть много жалоб на подобные проблемы. Есть некоторая надежда на будущее. По-видимому, gimp поддерживает язык разметки для текста. Вы можете получить разметку для своего текста следующим образом:

pdb.gimp_text_layer_get_markup(layer)

К сожалению, нет функции set_markup — хотя ее комментируют и просят уже 3-5 лет, так что не задерживайте дыхание. Если бы такая функция существовала, то функции get_markup и set_markup дали бы сценарию полный контроль над текстом. Однако его не существует, поэтому, если вы хотите изменить фрагменты текста (например, добавить курсив к слову), вы должны создать отдельные слои. Если весь ваш текст должен быть отформатирован одинаково, вы можете отредактировать его с помощью скрипта или редактора, если вы установите его в свойствах текстового слоя (с помощью панели инструментов в редакторе и единственный способ изменить шрифт в сценарии), тогда функция set_text в сценарии будет поддерживать шрифт и т. д.

https://bugzilla.gnome.org/show_bug.cgi?id=724101

http://gimpchat.com/viewtopic.php?f=9&t=10101&p=132782&hilit=change+text+markup#p132782

person argentum2f    schedule 22.06.2017

Не совсем удовлетворительный ответ, но слишком большой, чтобы публиковать его в качестве комментария.

Да, API текстового слоя не обновлялся, чтобы соответствовать новым возможностям. На самом деле вся информация находится в gimp-text-layer "паразите":

parasites=layer.parasite_list()
if parasites and 'gimp-text-layer' in parasites:
    data=layer.parasite_find('gimp-text-layer').data
    pdb.gimp_message('Text layer "%s": %s' % (layer.name,data))

Кажется, что этот паразит не существует, пока изображение не будет сохранено хотя бы один раз.

Однако, даже если вы можете заменить паразитные данные, это не изменит текстовый слой, и, что еще хуже, кажется, что Gimp обнаруживает изменение, предполагает, что текстовые данные слоя повреждены, и делает слой простым растровым изображением. при сохранении изображения.

Теперь, внимательно изучив исходный код, можно найти упоминания о подключаемом модуле GDynText, который можно найти на странице SourceForge и рекламирует себя как:

Динамический текст GIMP — это подключаемый модуль GIMP, который работает как текстовый инструмент, но позволяет вам писать многострочный текст и дает вам возможность изменять его позже по своему усмотрению (текст/шрифт/размер шрифта/цвет/... ).

Так что может повезло, а может и нет...

person xenoid    schedule 22.06.2017
comment
GDynText просто древний - я сомневаюсь, что он будет работать с современным GIMP. С другой стороны, как вы думаете, вы могли бы работать над патчем для этого? - person jsbueno; 23.06.2017
comment
Действительно древний. Только что взглянул на код, насколько я вижу, он генерирует текстовый слой и сохраняет свои собственные данные в своем собственном паразите, что упрощает извлечение позже для воссоздания текстового слоя при необходимости. Ничего, что нельзя было бы сделать в Python, но это все равно было бы ограничено текущим текстовым API. Это также не объясняет, почему код Gimp делает особый случай для имени паразита. - person xenoid; 23.06.2017
comment
Специальный корпус позволяет импортировать эти слои из старых файлов в качестве текстовых слоев в текущих версиях GIMP, потому что текстовые возможности GIMP стали достаточно продвинутыми, чтобы делать то, что реализовал этот старый плагин. - person Michael Schumacher; 26.06.2017