Gere centenas de resoluções a partir de uma única imagem

8

Estou trabalhando em um projeto em que preciso de uma única imagem em várias resoluções. Por sorte, a imagem tem uma resolução de largura / altura idêntica e funcionaria bem com todas as resoluções com a mesma altura e largura, ou seja, 80x80px 100x100px, etc.

Obviamente, eu poderia fazer isso manualmente no Adobe Photoshop, mas eu literalmente preciso de centenas de resoluções diferentes de 73px até 1000px e isso exigiria um bocado de tempo manual. Eu pesquisei na rede e tudo o que eu recebo é geradores de miniaturas ou o Photoshop batch saver que ainda levaria uma quantidade considerável de tempo.

Então, o que me leva à minha pergunta: como criar centenas de resoluções a partir de uma única imagem o mais rápido possível, no Windows ou no Linux?

    
por Simon Hayter 13.07.2015 / 14:41

2 respostas

19

Eu quero fazer muitas imagens com base em uma imagem de origem!

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

Você está tão certo. Deixe o computador fazer o trabalho repetitivo fácil; é nisso que eles são bons. Como notas de resposta do Tom Ruh , você pode usar ImageMagick para isso.

No entanto, existe um problema:

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.

(ênfase minha)

Não está claro qual resolução você quer - 4: 3 como indicado, ou 1: 1 como implícito.

No entanto, com base nas suas necessidades de mínimo 73px e máximo de 1000px e hundereds de resoluções ; Escrevi um pequeno roteiro que deve abranger a maioria das possibilidades (incluindo o redimensionamento líquido no off- talvez você queira isso) que pode ser definido alterando algumas variáveis.

Script, também disponível de pastebin aqui para facilitar a cópia :

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

Notas: Um pouco over-the-top em subshells para calcular valores e tal, mas hey ho. Como observado, as linhas printf podem ser descomentadas para ter uma ideia do que está acontecendo, caso contrário, ele funcionará silenciosamente por padrão, conforme o Regra do silêncio . Algumas imagens não serão dimensionadas exatamente como calculadas (por exemplo, 193px vs 138.54545454545454545452px) porque você não pode, de maneira útil, ter pixels fracionários.

    
por 13.07.2015 / 17:05
6

Contanto que você possa manipular alguma linha de comando e escrever alguns scripts simples em BASH. Você pode usar o ImageMagick

    
por 13.07.2015 / 14:51