Search code examples
pythongimpscript-fupython-fugimpfu

Gimp, python-fu: Align layer with respect to background layer in image


The following code is used to align layer with respect to bottom background layer.

import os    
from gimpfu import *
import gimpfu    
import logging

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)
    visibleLayer = pdb.gimp_layer_new_from_visible(logo, newImage, 'logo')
    pdb.gimp_image_add_layer(newImage, visibleLayer, 0)


    logger.info('Scaling logo to 435 width')
    pdb.gimp_layer_scale(visibleLayer, 435, 100, True)

    # logger.info('Align logo to background image')
    pdb.plug_in_align_layers(newImage, tdrawable, True, True)

    flattenedLayer = pdb.gimp_image_flatten(newImage)

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

register(
    "scale_logo",
    "Exports logo in jpeg format after custom scaling",
    "Exports  logo in jpeg format after custom scaling",
    "",
    "",
    "2017",
    "<Image>/Image/Scale  logo...",
    "RGB*, GRAY*",
    [
        (PF_STRING, 'file_name', 'file_name', 'logo.png')],
    [],
    scale)

main()

Expected line pdb.gimp_layer_scale(visibleLayer, 435, 100, True) to do the job, but the resulting file contains logo layer in the left upper corner of background white layer. How to align layer with respect to bottom background layer correctly?


Solution

  • The following sulution have worked for me. Thanks xenoid for the suggestion in comments

    import os    
    from gimpfu import *
    import gimpfu    
    import logging
    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_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)
    
        visibleLayer = pdb.gimp_layer_new_from_visible(logo, newImage, 'logo')
        pdb.gimp_image_add_layer(newImage, visibleLayer, 0)
    
        logger.info('Scaling logo to 435 width, 100 height')
        pdb.gimp_layer_scale(visibleLayer, 435, 100, True)
    
        logger.info('Align logo to background image')
        offx = (newLayer.width - visibleLayer.width) / 2
        offy = (newLayer.height - visibleLayer.height) / 2
        pdb.gimp_layer_set_offsets(visibleLayer, offx, offy)
        logger.info('Sharpening logo')
        pdb.plug_in_unsharp_mask(None, visibleLayer, 100.0, 0.5, 0)
    
        logger.info('Flatten all visible layers into a single layer')
        flattenedLayer = pdb.gimp_image_flatten(newImage)
    
        fileNameNoExt = os.path.splitext(imageName)[0]
        pdb.file_jpeg_save(newImage, flattenedLayer, fileNameNoExt + '.jpg', fileNameNoExt + '.jpg', 1.0, 0.0, 1, 1, '', 0, 0, 0, 0)
    
    register(
        "scale_logo",
        "Exports logo in jpeg format after custom scaling",
        "Exports logo in jpeg format after custom scaling",
        "",
        "",
        "2017",
        "<Image>/Image/Scale logo...",
        "RGB*, GRAY*",
        [
            (PF_STRING, 'file_name', 'file_name', 'logo.png')],
        [],
        scale)
    
    main()
    

    To run it one needs to use the following bash command sequence:

    cp scaleAndSharpenLogo.py /usr/lib/gimp/2.0/plug-ins/scaleAndSharpenLogo.py; gimp --no-interface -b '(python-fu-scale-logo RUN-NONINTERACTIVE 0 0 "logo.png")' -b '(gimp-quit 0)'