2017-05-05 1 views
0

Mon objectif est de placer une image par-dessus l'autre et de sauvegarder l'image résultante en fichier jpeg. Le premier est neuf, il a une dimension de 450x300 et un fond blanc. Le second est chargé à partir du fichier et sa partie visible est ajoutée en tant que couche au premier.Gimp, python-fu: RuntimeError: erreur d'exécution dans pdb.gimp_image_merge_down

J'ai ajouté le script python suivant pour /usr/lib/gimp/2.0/plug-ins dossier

#!/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) 

Exécution via

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

retours

(gimp:4224): GLib-CRITICAL **: g_error_new_literal: assertion 'domain != 0' failed Traceback (most recent call last): File "/usr/lib/gimp/2.0/python/gimpfu.py", line 821, in _run return apply(func, params[1:]) File "/usr/lib/gimp/2.0/plug-ins/my.py", line 31, in scale finalLayer = pdb.gimp_image_merge_down(newImage,tdraw,1) RuntimeError: execution error batch command experienced an execution error: Error: (: 1) Procedure execution of python-fu-my failed

Qu'est-ce qui ne va pas? Comment le faire correctement et comprendre la cause profonde du problème.

Modifier. suggérés par la suite xenoid: 1) en utilisant gimp_image_merge_down résultats dans logo.jpeg avec un fond blanc de 450, 300 taille

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) En utilisant newImage.add_layer (visibleLayer, 0) résultats en d'origine .png image donnée en entrée stockée dans jpg Format

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) 
+0

Les choses que vous écrivez ne devraient pas aller dans /usr/lib/gimp/2.0/plug-ins, mais dans ~/.gimp-2.8/plug-ins (notez le point principal, dites à l'exploration d'afficher les fichiers cachés) . Ou vous le placez dans un répertoire plus "visible" et ajoutez ce répertoire dans "Edition> Préférences> Dossiers> Plug-ins". Vous pouvez également ajouter ~/.gimp-2.8/plug-ins un lien vers l'emplacement réel du fichier. – xenoid

Répondre

1

Ce:

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

ne pas ajouter la couche comme celle du haut, mais sous le haut existant. Si c'est la deuxième couche, elle devient la couche inférieure. Et dans ce cas merge_down n'a rien à fusionner.

+0

merci, alors comment voulez-vous accomplir la tâche correctement? – user1264304

+1

Appliquez merge_down à l'autre couche ou utilisez 'newImage.add_layer (tdraw, 0)' pour ajouter la couche en tant que couche supérieure. – xenoid

+0

Salut, merci. J'ai essayé vos suggestions sans succès. Peut-être, je manque smth. ( – user1264304