Genera centinaia di risoluzioni da una singola immagine


8

Sto lavorando a un progetto in cui ho bisogno di una singola immagine in più risoluzioni. Fortunatamente l'immagine ha identica risoluzione larghezza / altezza e funzionerebbe bene con tutte le risoluzioni con la stessa altezza e larghezza, cioè 80x80px 100x100px ecc.

Ovviamente potrei farlo manualmente in Adobe Photoshop, ma ho letteralmente bisogno di centinaia di risoluzioni diverse da 73 pixel fino a 1000 pixel e questo richiederebbe una quantità sciocca di tempo manuale. Ho cercato in rete e tutto ciò che continuo a ricevere sono generatori di miniature o risparmiatori batch di Adobe Photoshop che richiederebbero comunque una notevole quantità di tempo.

Quindi, il che mi porta alla mia domanda, come posso creare centinaia di risoluzioni da una singola immagine il più rapidamente possibile, sia in Windows che in Linux.


1) hanno CDN come ImgIx che ridimensioneranno le immagini dinamicamente per te. 2) Ho usato ThumbNailer di Smaller Animals ($ 15) per elaborare in batch le immagini. È sufficiente eseguirlo tramite riga di comando con "profili" configurati e chiamare tramite riga di comando. Per ogni risoluzione, è necessario un profilo separato. Poiché le tue immagini sono 1: 1 e non hai bisogno di opzioni di ridimensionamento "intelligenti", penso che ImageMagick sarà più che sufficiente.
Dom

Potresti invece utilizzare una singola immagine vettoriale?
Anonsage

2
Sono curioso del progetto che richiederebbe centinaia della stessa immagine con dimensioni diverse. Non è rilevante per la risposta, ma sono comunque curioso.

2
Sei sicuro di aver bisogno di un'immagine con così tante risoluzioni? Pensaci di nuovo, molto più attentamente. Discutilo con altre persone. Non posso escludere che ci sia un caso limite da qualche parte in cui questo è davvero il caso, ma se dovessi scommettere, scommetterei su "stai sbagliando".
o0 '.

@Lohro è un tuo diritto, non ne abbiamo bisogno tutti, ma per un totale di 30 MB (1000png) non è un grosso problema per i PNG non utilizzati.
Simon Hayter,

Risposte:


19

Voglio fare molte immagini basate su un'immagine sorgente!

Ovviamente potrei farlo a mano in Adobe Photoshop ... e questo richiederebbe una quantità sciocca di tempo manuale.

Hai ragione. Lascia che il computer faccia il semplice lavoro ripetitivo; ecco cosa sono bravi. Come nota la risposta di Tom Ruh , puoi usarlo ImageMagickper questo.

Tuttavia, c'è un problema:

Fortunatamente l'immagine ha una risoluzione di 4: 3 e funzionerebbe bene con tutte le risoluzioni con la stessa altezza e larghezza, cioè 80x80px 100x100px ecc.

(enfatizzare il mio)

Non è chiaro quale risoluzione desideri: 4: 3 come indicato o 1: 1 come implicito.

Tuttavia, in base alle esigenze di 73px minima e massima 1000px e hundereds di risoluzioni ; Ho scritto una piccola sceneggiatura che dovrebbe coprire la maggior parte delle possibilità (incluso il ridimensionamento dei liquidi nell'occasione che ti piacerebbe) che può essere impostata modificando alcune variabili.

Script, disponibile anche da pastebin qui per una copia più semplice :

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

Note: un po 'esageratamente sui subshells per il calcolo di valori e simili, ma hey ho. Come notato, le printflinee possono essere decommentate per avere un'idea di ciò che sta succedendo, altrimenti funzionerà silenziosamente di default secondo la Regola del silenzio . Alcune immagini non avranno dimensioni esattamente come calcolate (ad es. 193px contro 138.54545454545454545452px) perché non è possibile avere pixel frazionari in modo utile.


1
Woohoo, fantastico! appena testato e ha funzionato benissimo, purtroppo tuttavia questo crea un nuovo numero di etichette di file, in quanto 1, 2, 3, 4 ecc. non mi informano sulla risoluzione senza dover fare un po 'di matematica o ispezionando l'immagine. Ti capita di sapere come posso adattare lo script per aggiungere la risoluzione al nome del file, cioè filename-500x500.pngpiuttosto chefilename-1.png
Simon Hayter,

Sono contento che funzioni per la tua soddisfazione più o meno. Grazie per il chiarimento, aggiornerò la risposta con un nome file più descrittivo. Sarebbe filename-width.pngsufficiente? Una delle modalità ( mantieni le proporzioni originali ) non calcola direttamente un'altezza esplicita. Posso abbastanza facilmente ottenere le informazioni (tramite identify) ma risparmierebbe una chiamata aggiuntiva per immagine in caso di proporzioni originali.
bertieb,

Woah, grazie per la rapida risposta! sì, la larghezza farebbe il lavoro poiché assumerei automaticamente lo stesso numero per l'altezza.
Simon Hayter,

Per quanto riguarda ciò che intendevo per 4: 3 era il rapporto di formato trovato in TV e monitor, quelli quadrati ... vale a dire google.co.uk/… e non la cassetta delle lettere 16: 9 ecc.
Simon Hayter,

1
Dovrò scaricarlo, grazie! ascolta! .... sei una leggenda, la sceneggiatura funziona meravigliosamente! grazie per tutto il tuo aiuto.
Simon Hayter,

7

Finché è possibile gestire alcune righe di comando e scrivere alcuni semplici script BASH. Puoi usare ImageMagick


1
Se la risoluzione è in formato 4: 3, quindi per sempre 4 pixel di larghezza, si sale di un altro 3. Inoltre, le risoluzioni 80x80 o 100x100 hanno un rapporto 1: 1. Dato che stai passando da un rapporto 4: 3 a un rapporto 1: 1, dovrai allungare l'immagine o ritagliare i pixel in eccesso. Non sei sicuro che sia importante ma non puoi semplicemente mantenere la risoluzione 4: 3 per evitarlo?
Geruta,

1
È confortante sapere che una soluzione è possibile, ma questo non risponde a come realizzarla. Puoi espandere la tua risposta con un esempio o alcune istruzioni? Grazie.
fixer1234,

1) Puoi usare convert.exe che fa parte di ImageMagic con l'opzione -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Dom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.