【问题标题】:How do I change text in a python-fu gimp script without changing the font?如何在不更改字体的情况下更改 python-fu gimp 脚本中的文本?
【发布时间】:2017-11-26 01:36:39
【问题描述】:

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

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

【问题讨论】:

标签: gimp script-fu gimpfu python-fu


【解决方案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 似乎检测到了更改,假设图层文本数据已损坏,并使图层保存图像时的普通位图。

现在,仔细阅读源代码,您可以在 SourceForge 上找到一个 GDynText 插件,并宣传自己是:

GIMP 动态文本是一个 GIMP 插件,其工作方式类似于文本工具,但允许您编写多行文本,并让您能够在以后根据需要修改它(文本/字体/字体大小/颜色/ ...)。

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

【讨论】:

  • GDynText 只是古老的 - 我怀疑它是否适用于现代 GIMP。另一方面,你认为你可以为此开发补丁吗?
  • 确实很古老。刚看了一下代码,据我所知它生成文本层并将自己的数据保存在自己的寄生虫中,这使得以后更容易检索以在需要时重新创建文本层。没有什么是 Python 做不到的,但这仍然仅限于当前的文本 API。这也不能解释为什么 Gimp 代码为寄生虫名称做了一个特殊情况。
  • 特殊情况是允许从旧文件导入这些图层作为当前 GIMP 版本中的文本图层 - 因为 GIMP 的文本功能变得足够先进,可以完成旧插件已经实现的功能。
【解决方案2】:

我做了更多的研究并找到了一个在 gimp 中对我有用的解决方案,但是,如果您正在从一个脚本。

解决办法是,当你在gimp编辑器中改变文字时,你需要在工具对话框中改变字体,所以它被设置为图层的属性,而不是仅仅选择文字并更改显示的浮动字体框中的字体 - 这会更改您选择的文本的字体,但保持文本层的基本字体不变。

事实证明,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多