Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Alternatively: How do I take a non-square PNG and "fill out" the "rest" of the image with transparency so that the resulting square image has the original image centered in the square?

ULTIMATELY, what I want is to take any image of any GM-supported format of any size, and create a scaled-down PNG (say, 40 pixels maximum for either dimension), with aspect ratio maintained, transparency-padded for non-square original images, AND with an already-prepared 40x40 PNG transparency mask applied.

I already know how to scale down and keep aspect ratio; I already have the command for applying my composite. My only missing piece is square-alizing non-square images (padding with transparency).

Single command preferred; multi-command chain acceptable.

(edit)

Extra info: Here's the composite command I'm using:

gm composite -compose copyopacity mask.png source-and-target.png source-and-target.png

where mask.png has white pixels for what I want to keep of source-and-target.png and transparent pixels for what I want to remove (and become transparent) of source-and-target.png.

share|improve this question
up vote 4 down vote accepted

This command will take any sized input file and fit it best to a 40x40 square and pad with transparency:

convert \
   original.png \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
  -compose Copy_Opacity \
  -composite mask.png \
   original-resized.png

The gravity option ensures the image is centered in both directions, and transparent is used wherever there are no pixels. Then the compositing is done with the mask.png

share|improve this answer
    
So we can't do it in one shot with composite? – Pistos Apr 24 '12 at 1:23
    
@Pistos I am not clear on what you are doing with the composite - it is just a transparency mask to hide/show portions of the thumbnail after resizing? Can you edit and add the command sequence you have so far, so we can see if it can be combined? – Paul Apr 24 '12 at 2:47
    
Done. Thanks for your help so far. – Pistos Apr 24 '12 at 3:09
    
@Pistos I think the best approach is to do the compositing with -convert rather than the other way around. I have updated my answer above. – Paul Apr 24 '12 at 3:33
    
Close, but not quite. Your command didn't work as-is, and even with adjustments, it didn't work. It's okay, I'll do it in two steps. I'll update things here after I get the final, working CLI steps. Thanks again. – Pistos Apr 24 '12 at 3:53

One command to convert all PNGs from one folder:

mogrify \
 -resize 50x50 \
 -background transparent \
 -gravity center \
 -extent 50x50 \
 -format png \
 -path resized \
 *.png

mogrify is a command from ImageMagick package. You have to create output directory first.

share|improve this answer
    
Nice one. BTW, If you feel adventurous, you can omit -path resized to edit the files in place. – aaronk6 May 19 at 10:55

Here's what I eventually went with. A two step process:

gm convert \
  -thumbnail '40x40>' \
  -background transparent \
  -gravity center \
  -extent 40x40 \
   original.png \
   intermediate.png

gm composite \
  -compose in \
   intermediate.png \
   mask.png \
   out.png

Where mask.png is white pixels for what I wanted to keep, and transparent pixels for what I wanted to mask out (discard).

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .