Gimp, python-fu: RuntimeError: ошибка выполнения в pdb.gimp_image_merge_down

Моя цель - поместить одно изображение поверх другого и сохранить полученное изображение в виде файла jpeg. Первый новый, размер 450x300 и белый фон. Второй загружается из файла и его видимая часть добавляется как слой к первому.

Я добавил следующий скрипт Python в папку /usr/lib/gimp/2.0/plug-ins

#!/usr/bin/python
import os

from gimpfu import *
import gimpfu

import logging
def scale(timg, tdrawable, imageName):
    logger = logging.getLogger()
    logger.info('got logo file {0}'.format(imageName))

    newImage = pdb.gimp_image_new(450, 300, RGB)

    newLayer = pdb.gimp_layer_new(newImage, 450, 300, 0, "background", 100.0, NORMAL_MODE)

    pdb.gimp_context_set_background((255, 255, 255))
    pdb.gimp_drawable_fill(newLayer, gimpfu.BACKGROUND_FILL)
    logger.info('Created new background image {0}')
    newImage.add_layer(newLayer, 0)

    timg = pdb.gimp_file_load(imageName, imageName)

    tdraw = pdb.gimp_layer_new_from_visible(timg, newImage, 'logo')      
    newImage.add_layer(tdraw, 1)
    finalLayer = pdb.gimp_image_merge_down(newImage,tdraw,1)
    fileNameNoExt = os.path.splitext(imageName)[0]
    pdb.file_jpeg_save(newImage, finalLayer, fileNameNoExt + '.jpg', fileNameNoExt + '.jpg', 1.0, 0.0, 1, 1, '', 0, 0, 0, 0)

Запуск через

gimp --no-interface -b '(python-fu-my RUN-NONINTERACTIVE 0 0 "logo.png")' -b '(gimp-quit 0)'

возвращается

(gimp:4224): GLib-CRITICAL **: g_error_new_literal: утверждение 'domain!= 0' не удалось Traceback (последний последний вызов): File "/usr/lib/gimp/2.0/python/gimpfu.py", строка 821 , в _run return apply(func, params[1:]) File "/usr/lib/gimp/2.0/plug-ins/my.py", строка 31, в масштабе finalLayer = pdb.gimp_image_merge_down(newImage,tdraw,1 ) RuntimeError: ошибка выполнения. Пакетная команда столкнулась с ошибкой выполнения: Ошибка: (: 1) Не удалось выполнить процедуру python-fu-my

Что случилось? Как это сделать правильно и понять первопричину проблемы.

Редактировать. Следующие предложения xenoid: 1) Использование gimp_image_merge_down приводит к logo.jpeg с белым фоном размером 450, 300

def my(timg, tdrawable, imageName):
    logger = logging.getLogger()
    logger.info('got logo file {0}'.format(imageName))

    newImage = pdb.gimp_image_new(450, 300, RGB)

    newLayer = pdb.gimp_layer_new(newImage, 450, 300, 0, "background", 100.0, NORMAL_MODE)

    pdb.gimp_context_set_background((255, 255, 255))
    # pdb.gimp_context_set_foreground((255, 255, 255))
    pdb.gimp_drawable_fill(newLayer, gimpfu.BACKGROUND_FILL)
    logger.info('Created new background image {0}')
    newImage.add_layer(newLayer, 0)

    logger.info('loading logo {0}'.format(imageName))
    logo = pdb.gimp_file_load(imageName, imageName)
    # logoDrawable = pdb.gimp_image_get_active_layer(logo)

    #
    visibleLayer = pdb.gimp_layer_new_from_visible(logo, newImage, 'logo')
    newImage.add_layer(visibleLayer, 1)
    mergedL = pdb.gimp_image_merge_down(newImage, newLayer, 0)

    fileNameNoExt = os.path.splitext(imageName)[0]
    pdb.file_jpeg_save(newImage, mergedL, fileNameNoExt + '.jpg', fileNameNoExt + '.jpg', 1.0, 0.0, 1, 1, '', 0, 0, 0, 0)

2) Использование newImage.add_layer(visibleLayer, 0) приводит к исходному изображению png, указанному в качестве входных данных, сохраненному в формате jpg

def scale(logo, tdrawable, imageName):
    logger = logging.getLogger()
    logger.info('got logo file {0}'.format(imageName))

    newImage = pdb.gimp_image_new(450, 300, RGB)

    newLayer = pdb.gimp_layer_new(newImage, 450, 300, 0, "background", 100.0, NORMAL_MODE)

    pdb.gimp_context_set_background((255, 255, 255))
    # pdb.gimp_context_set_foreground((255, 255, 255))
    pdb.gimp_drawable_fill(newLayer, gimpfu.BACKGROUND_FILL)
    logger.info('Created new background image {0}')
    newImage.add_layer(newLayer, 0)

    logger.info('loading logo {0}'.format(imageName))
    logo = pdb.gimp_file_load(imageName, imageName)
    # logoDrawable = pdb.gimp_image_get_active_layer(logo)

    #
    visibleLayer = pdb.gimp_layer_new_from_visible(logo, newImage, 'logo')
    newImage.add_layer(visibleLayer, 0)
    # mergedL = pdb.gimp_image_merge_down(newImage, newLayer, 0)

    fileNameNoExt = os.path.splitext(imageName)[0]
    pdb.file_jpeg_save(newImage, visibleLayer, fileNameNoExt + '.jpg', fileNameNoExt + '.jpg', 1.0, 0.0, 1, 1, '', 0, 0, 0, 0)

person rok    schedule 05.05.2017    source источник
comment
Вещи, которые вы пишете, должны находиться не в /usr/lib/gimp/2.0/plug-ins, а в ~/.gimp-2.8/plugins (обратите внимание на начальную точку, скажите проводнику показать скрытые файлы). Или вы помещаете его в более видимый каталог и добавляете этот каталог в Edit>Preferences>Folders>Plug-ins. Вы также можете добавить в ~/.gimp-2.8/plugins программную ссылку на фактическое местоположение файла.   -  person xenoid    schedule 06.05.2017


Ответы (1)


Этот:

tdraw = pdb.gimp_layer_new_from_visible(timg, newImage, 'logo')      
newImage.add_layer(tdraw, 1)

Добавляет слой не как верхний, а под существующий верхний. Если это второй слой, то он становится нижним. И в этом случае merge_down не на чем сливать.

person xenoid    schedule 05.05.2017
comment
спасибо, так как бы вы правильно выполнили задачу? - person rok; 06.05.2017
comment
Либо примените merge_down к другому слою, либо используйте newImage.add_layer(tdraw, 0), чтобы добавить слой в качестве верхнего слоя. - person xenoid; 06.05.2017
comment
Привет спасибо. Я попробовал ваши предложения без успеха. Может быть, я скучаю по чему-л. ( - person rok; 28.05.2017
comment
Да, file-xxx-save() сохраняет только данный рисунок, поэтому вам нужно сгладить изображение перед сохранением. - person xenoid; 28.05.2017