8

I'm working on a project where I need a single image in multiple resolutions. Lucky enough the image is identical width/height resolution and would work well with all resolutions with the same height and width, i.e 80x80px 100x100px etc.

Obviously I could do this by hand in Adobe Photoshop but I literally need hundreds of different resolutions from 73px all the way up to 1000px and this would take a silly amount of manual time. I've searched the net and all I keep getting is thumbnail generators or Adobe Photoshop batch saver which would still take a considerable amount of time.

So, which brings me to my question, How can I create hundreds of resolutions from a single image as quickly as possible, either in Windows or Linux.

  • 1) they have CDNs like ImgIx that will resize images dynamically for you. 2) I've used ThumbNailer by Smaller Animals ($15) to batch process images. You just run it via command line with "profiles" you configure and call through command line. For each resolution, you would need a separate profile. Since your images are 1:1 and you don't need any "intelligent" resizing options, I think ImageMagick will be more than sufficient. – Sun Jul 13 '15 at 22:03
  • Could you use a single vector image instead? – Anonsage Jul 14 '15 at 1:18
  • 2
    I'm curious as to the project that would require hundreds of the same image at different sizes. It's not relevant to the answer, but I'm curious nonetheless. – Web Head Jul 14 '15 at 5:33
  • 2
    Are you SURE you need an image in so many resolutions? Think about it again, much more carefully. Discuss it with other people. I can't rule out there's an edge case somewhere where this is really the case, but if I had to bet, I'd bet on "you are doing it wrong". – o0'. Jul 14 '15 at 8:06
  • @Lohrois your right we don’t need them all, but for the sake of 30mb in total (1000pngs) it’s not a big issue for PNGs not used. – Simon Hayter Jul 14 '15 at 8:23
19

I want to make lots of images based on a source image!

Obviously I could do this by hand in Adobe Photoshop... and this would take a silly amount of manual time.

You are so right. Let the computer do the easy repetitive work; that's what they are good at. As Tom Ruh's answer notes, you can use ImageMagick for this.

However, there is a problem:

Lucky enough the image is 4:3 resolution and would work well with all resolutions with the same height and width, i.e 80x80px 100x100px etc.

(emphasis mine)

It's not clear what resolution you want- 4:3 as stated, or 1:1 as implied.

However, based on your requirements of minimum 73px and maximum 1000px and hundereds of resolutions; I've written up a little script which should cover most possibilities (including liquid resizing on the off-chance you'd like that) which can be set by changing some variables.

Script, also available from pastebin here for easier copying:

#!/bin/bash
# resizer.sh - resize target image between two resolutions
# accepts file as either first argument or by setting FILEPATH variable

# SETTINGS

SMALLEST_WIDTH=73   # px
LARGEST_WIDTH=1000  # px
FILEPATH=           # set if you don't want to pass in image as argument
NUM_OF_RESOLUTIONS=100      # number of images generated; will generate between
                    # $SMALLEST_WIDTH and $LARGEST_WIDTH
RATIO=                      # set if you want to specify width/height
                    # (eg 1/1, 4/3, 16/9), blank is preserve current ratio


# NOTE: resizing to other aspect ratios may be slow/distorty:
# as per http://www.imagemagick.org/Usage/resize/#noaspect
# Seamless resizing (default) may be preferred, see:
# http://www.imagemagick.org/Usage/resize/#liquid-rescale
# but note it is slower, particularly as images get larger

LIQUID=0

# SCRIPT BELOW
# silent by default; uncomment "printf" lines for a description of what is happening
die() { printf "$@\n" 1>&2 ; exit 1; }

if [ -z "$FILEPATH" ]; then
    if [ -z "$1" ]; then die "Need to supply file to work on either as argument or by setting FILEPATH!";
    else FILE="$1";
    fi
else
    FILE="$FILEPATH"
fi

# check file exists and is regular file

if [ ! -e "$FILE" ]; then die "$FILE does not exist!"; fi
if [ ! -f "$FILE" ]; then die "$FILE is not a regular file!"; fi

i=0
step=$(echo "($LARGEST_WIDTH - $SMALLEST_WIDTH) / ($NUM_OF_RESOLUTIONS - 1)" | bc -l)
#printf "Resolution step is: %s\n-------------" "$step"
while [ $i -lt $NUM_OF_RESOLUTIONS ]; do
    # handle ratio
    WIDTH=$(echo "$SMALLEST_WIDTH+($step*$i)" | bc -l)
    if [ -z "$RATIO" ]; then
            #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
    else
            HEIGHT=$(echo "$WIDTH * $RATIO" | bc -l)
            if [ "$LIQUID" -eq 0 ]; then
                    # Uncomment convert line for distorted ("squashed") resizing
                    #printf "convert %s -resize %sx%s\! %s\n" "$FILE" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            else
                    # Liquid resizing: http://www.imagemagick.org/Usage/resize/#liquid-rescale
                    # fast aspect ration resize first, then liquid
                    #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    #printf "%s details are now:\n %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$(identify "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}")"
                    #printf "convert %s -liquid-rescale %sx%s\! %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" -liquid-rescale "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            fi
    fi
    (( i++ ))
done

Notes: A bit over-the-top on subshells for calculating values and such, but hey ho. As noted, the printf lines can be uncommented for an idea of what is going on, otherwise it will operate silently by default as per the Rule of Silence. Some images wont be dimensions exactly as calculated (eg 193px vs 138.54545454545454545452px) because you can't in a useful way have fractional pixels.

  • 1
    Woohoo, awesome! just tested and it worked lovely, sadly however this creates a new issue of file labels, as 1, 2, 3, 4 etc doesn't inform me the resolution without having to do some math or by inspecting the image. Do you happen to know how I can adapt the script to append resolution to filename i.e filename-500x500.png rather than filename-1.png – Simon Hayter Jul 13 '15 at 20:40
  • Glad it works to your more-or-less satisfaction. Thanks for clarifying, I will update the answer with a more descriptive filename. Would filename-width.png suffice? One of the modes (keep original aspect ratio) doesn't directly calculate an explicit height. I can easily enough get the information (via identify) but it would save an additional per-image call in cases of original aspect ratio. – bertieb Jul 13 '15 at 20:43
  • Woah, thanks for the quick response! yep the width would do the job since I'd auto assume the same number for the height. – Simon Hayter Jul 13 '15 at 20:44
  • In regards of what I meant by 4:3 was aspect ratio found in TVs and Monitors, Square ones.. i.e google.co.uk/… and not letter box 16:9 etc. – Simon Hayter Jul 13 '15 at 20:45
  • 1
    I'll have to download it, thanks! listen!.... your a legend, the script works awesomely! thank you for all your help. – Simon Hayter Jul 13 '15 at 21:02
7

As long as you can handle some command line and write some simple BASH scripting. You can use ImageMagick

  • 1
    If the resolution is in 4:3 aspect ration, then for ever 4 pixels wide, you go another 3 up. In addition, 80x80 or 100x100 resolutions have a 1:1 aspect ratio. Since you going from a 4:3 ratio to a 1:1 ratio, you will either have to stretch the image or crop excess pixels. Not sure if it matters but couldn't you just keep your 4:3 resolution to avoid this? – Geruta Jul 13 '15 at 13:07
  • 1
    It's comforting to know that a solution is possible, but this doesn't answer how to accomplish it. Can you expand your answer with an example or some instructions? Thanks. – fixer1234 Jul 13 '15 at 21:20
  • 1) You can use convert.exe which is part of ImageMagic with the -resize option: imagemagick.org/discourse-server/viewtopic.php?t=15438 – Sun Jul 13 '15 at 22:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.