Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize image to fit canvas - Gimp

Tags:

I'm currently using Gimp to resize some images. I'm a web developer but I don't really use image manipulation software much as most of the images are provided by designers so the Gimp tool is very unfamiliar to me. I've looked through all of the tutorials and help guides on the Gimp site but I cannot find the answer to the simplest of questions:

How do you resize a layer to fit within the current canvas whilst maintaining the aspect ratio?

I'm essentially setting a fixed size on my Canvas and importing an image as a layer into my project. What I then wish to do is scale this much larger image down so that is can fit within the Canvas with the aspect ratio preserved. I have found a way of scaling the Canvas to fit a layer but this is not what I am looking for.

Any help would be greatly appreciated.

like image 795
jezzipin Avatar asked Jan 09 '14 10:01

jezzipin


People also ask

What is canvas size in GIMP?

Canvas Size. The “canvas” is the visible area of the image. By default the size of the canvas coincides with the size of the layers.


2 Answers

That feature is not in gimp for some reason. An alternative without any scripts is:

Layer -> Scale Layer
like image 74
Weston Ganger Avatar answered Oct 06 '22 00:10

Weston Ganger


This is easy to do, but among the hundreds of possible options to be put on the program UI, it was not "elected" to be there.

The way out is to use the program's scripting capabilities to perform the action: what have to be determined programatcially is whether the ratio of the image/layer is larger on the width or height, and use this ratio to scale tha layer, and then center the layer.

For your convenience, I wrote some Python code for this in a single line, in a way you can just copy and paste on the python console (filters->python->console) to apply the effect on the top layer of the most recent open image.

img = gimp.image_list()[0]; layer = img.layers[0]; factor = min (float(img.width) / layer.width, float(img.height) / layer.height); layer.scale(int(layer.width * factor), int(layer.height * factor)); layer.set_offsets((img.width - layer.width) / 2, (img.height - layer.height) / 2)

Since this can be done, but is not practical, even more because it does not allow you to pick the image or layer to resize, I formated it as a python-script for GIMP as well. Just check your edit->preferences->folders->plug-ins for your plug-in directory, paste the contents bellow as a file there (if on Windows, the file must have the ".py" extension. On Linux and Mac OS, any extension would work, but you have to give the file the "exectuable" property" ).

After restarting GIMP, you will have the new command conveniently located on your Layer menu:

#! /usr/bin/env python
# coding: utf-8

from gimpfu import *

def scale_layer_to_canvas_size(img, layer):
    pdb.gimp_image_undo_group_start(img)
    factor = min (float(img.width) / layer.width,
                 float(img.height) / layer.height)

    layer.scale(int(layer.width * factor), int(layer.height * factor))
    layer.set_offsets((img.width - layer.width) / 2,
        (img.height - layer.height) / 2)
    pdb.gimp_image_undo_group_end(img)

register("scale-layer-to-canvas-size",
    "Scale layer to canvas size",
    "Scales the layer to canvas size, keeping the aspect ratio",
    "João S. O. Bueno", "Public domain", "2014",
    N_("Scale layer to canvas size..."),
    "*",
    [(PF_IMAGE, "image",       "Input image", None),
     (PF_DRAWABLE, "layer", "Input drawable", None), ], [],
    scale_layer_to_canvas_size,  menu="<Image>/Layer/",
    )

main()

Note it is the same code than above, but "img" and "layer" are now suplied by GIMP when picking the action from the menu, and there are two extra calls so that both scalignand centering are "undone" as a single action - the remaining code is justtheneeded boiler plate to register the function with GIMP

like image 40
jsbueno Avatar answered Oct 06 '22 01:10

jsbueno