Genere cientos de resoluciones a partir de una sola imagen.

8

Estoy trabajando en un proyecto donde necesito una sola imagen en múltiples resoluciones. Afortunadamente, la imagen tiene una resolución de ancho / alto idéntica y funcionaría bien con todas las resoluciones con la misma altura y ancho, es decir, 80x80px 100x100px, etc.

Obviamente, podría hacer esto a mano en Adobe Photoshop, pero literalmente necesito cientos de resoluciones diferentes, desde 73 píxeles hasta 1000 píxeles, y esto tomaría una cantidad tonta de tiempo manual. He buscado en la red y todo lo que sigo obteniendo son generadores de miniaturas o el protector de lotes de Adobe Photoshop, que aún tomaría una cantidad considerable de tiempo.

Entonces, lo que me lleva a mi pregunta: ¿Cómo puedo crear cientos de resoluciones de una sola imagen lo más rápido posible, ya sea en Windows o Linux?

Simon Hayter
fuente
1) tienen CDN como ImgIx que redimensionará las imágenes dinámicamente para usted. 2) He usado ThumbNailer de Smaller Animals ($ 15) para procesar imágenes por lotes. Simplemente lo ejecuta a través de la línea de comando con "perfiles" que configura y llama a través de la línea de comando. Para cada resolución, necesitaría un perfil separado. Dado que sus imágenes son 1: 1 y no necesita ninguna opción de cambio de tamaño "inteligente", creo que ImageMagick será más que suficiente.
Dom
¿Podrías usar una sola imagen vectorial en su lugar?
Anonsage
2
Tengo curiosidad sobre el proyecto que requeriría cientos de la misma imagen en diferentes tamaños. No es relevante para la respuesta, pero de todos modos tengo curiosidad.
2
¿Estás SEGURO de que necesitas una imagen en tantas resoluciones? Piénselo de nuevo, mucho más cuidadosamente. Discuta con otras personas. No puedo descartar que haya un caso límite en algún lugar donde este sea realmente el caso, pero si tuviera que apostar, apostaría a "lo estás haciendo mal".
o0 '.
@Lohrois tiene derecho, no los necesitamos a todos, pero por el bien de 30mb en total (1000pngs) no es un gran problema para PNG no utilizados.
Simon Hayter

Respuestas:

19

¡Quiero hacer muchas imágenes basadas en una imagen fuente!

Obviamente podría hacer esto a mano en Adobe Photoshop ... y esto tomaría una cantidad tonta de tiempo manual.

Tienes mucha razon. Deje que la computadora haga el trabajo repetitivo fácil; para eso son buenos. Como señala la respuesta de Tom Ruh , puedes usarlo ImageMagickpara esto.

Sin embargo, hay un problema:

Afortunadamente, la imagen tiene una resolución de 4: 3 y funcionaría bien con todas las resoluciones con la misma altura y ancho, es decir, 80x80px 100x100px, etc.

(énfasis mío)

No está claro qué resolución desea: 4: 3 según lo establecido, o 1: 1 según lo implícito.

Sin embargo, en función de sus requisitos de mínimo 73px y máximo 1000px y cientos de resoluciones ; He escrito un pequeño script que debería cubrir la mayoría de las posibilidades (incluido el cambio de tamaño líquido en el caso de que no lo desee) que se puede configurar cambiando algunas variables.

Script, también disponible desde pastebin aquí para una copia más fácil :

#!/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: Un poco exagerado en subcapas para calcular valores y tal, pero bueno ho. Como se señaló, las printflíneas pueden ser descomentadas para tener una idea de lo que está sucediendo, de lo contrario, operará en silencio de forma predeterminada según la Regla de Silencio . Algunas imágenes no tendrán dimensiones exactamente como se calcularon (p. Ej., 193px frente a 138.54545454545454545452px) porque de una manera útil no puede tener píxeles fraccionales.

bertieb
fuente
1
Woohoo, genial! solo probé y funcionó de maravilla, lamentablemente esto crea un nuevo problema de etiquetas de archivo, ya que 1, 2, 3, 4, etc.no me informan la resolución sin tener que hacer algunos cálculos o inspeccionar la imagen. ¿Sabes cómo puedo adaptar el script para agregar resolución al nombre de archivo, es decir, en filename-500x500.pnglugar defilename-1.png
Simon Hayter
Me alegro de que funcione para tu mayor o menor satisfacción. Gracias por aclarar, actualizaré la respuesta con un nombre de archivo más descriptivo. Sería filename-width.pngsuficiente? Uno de los modos ( mantener la relación de aspecto original ) no calcula directamente una altura explícita. Fácilmente puedo obtener la información (vía identify), pero ahorraría una llamada adicional por imagen en casos de relación de aspecto original.
bertieb
Woah, gracias por la rápida respuesta! Sí, el ancho haría el trabajo, ya que asumiría automáticamente el mismo número para la altura.
Simon Hayter
Con respecto a lo que quise decir con 4: 3 era la relación de aspecto que se encuentra en televisores y monitores, los cuadrados ... es decir, google.co.uk/… y no en el buzón 16: 9, etc.
Simon Hayter
1
Tendré que descargarlo, gracias! escucha! ... eres una leyenda, el guión funciona de maravilla! gracias por toda tu ayuda.
Simon Hayter
7

Siempre que pueda manejar alguna línea de comando y escribir algunos scripts simples de BASH. Puedes usar ImageMagick

Tom Ruh
fuente
1
Si la resolución está en una relación de aspecto 4: 3, entonces por cada 4 píxeles de ancho, subes otros 3. Además, las resoluciones de 80x80 o 100x100 tienen una relación de aspecto 1: 1. Como pasará de una relación de 4: 3 a una relación de 1: 1, tendrá que estirar la imagen o recortar el exceso de píxeles. ¿No está seguro de si es importante pero no podría simplemente mantener su resolución 4: 3 para evitar esto?
Geruta
1
Es reconfortante saber que una solución es posible, pero esto no responde cómo lograrla. ¿Puedes ampliar tu respuesta con un ejemplo o algunas instrucciones? Gracias.
fijador1234
1) Puede usar convert.exe, que forma parte de ImageMagic con la opción -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Dom