3

我有一个主图像,我在 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 命令为其中一个图层检索正确的字体,但不为其他图层检索正确的字体。它似乎没有保留斜体等,我不希望它保留文本是否带下划线。

第三种选择是在字体中硬编码。我需要浏览所有文本字段,弄清楚字体参数是什么,并为每个参数硬编码。然后,如果我重新设计主文件(我会做很多),我必须重复这个过程。这不应该是必要的。

4

2 回答 2

2

我做了更多的研究并找到了一个在 gimp 中对我有用的解决方案,但是,如果您正在从脚本进行大量文本编辑,听起来您可能应该使用 gimp 以外的其他东西,例如 imagemagick。

解决方案是,当您在 gimp 编辑器中更改文本时,您需要在工具对话框中更改字体,因此将其设置为 layer 的属性,而不是仅选择文本并更改浮动字体框中的字体显示 - 更改您选择的文本的字体,但保持文本层的基本字体不变。

事实证明,gimp 文本功能很差,网上有很多关于此类问题的投诉。对未来有一些希望。显然 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

于 2017-06-22T17:56:00.220 回答
1

不是一个真正令人满意的答案,但太大而无法作为评论发布。

是的,文本层 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 插件,其工作方式类似于文本工具,但允许您编写多行文本,并让您能够在以后根据需要对其进行修改(文本/字体/字体大小/颜色/...)。

所以你可能是幸运的,或者不是......

于 2017-06-22T19:32:01.860 回答