Générer des centaines de résolutions à partir d'une seule image

8

Je travaille sur un projet pour lequel j'ai besoin d'une seule image dans plusieurs résolutions. Heureusement, la résolution largeur / hauteur est identique et convient à toutes les résolutions de même hauteur et largeur, c.-à-d. 80x80px 100x100px, etc.

Évidemment, je pouvais le faire à la main dans Adobe Photoshop, mais j’ai littéralement besoin de centaines de résolutions différentes allant de 73px jusqu’à 1000px, ce qui prendrait un temps manuel stupide. J'ai cherché sur le net et tout ce que je reçois, ce sont des générateurs de vignettes ou un économiseur de lot Adobe Photoshop qui prendrait encore beaucoup de temps.

Donc, ce qui m'amène à ma question, comment créer des centaines de résolutions à partir d'une seule image aussi rapidement que possible, sous Windows ou Linux.

Simon Hayter
la source
1) ils ont des CDN comme ImgIx qui redimensionneront les images dynamiquement pour vous. 2) J'ai utilisé ThumbNailer de petits animaux (15 $) pour traiter des images par lots. Vous venez de l'exécuter via la ligne de commande avec les "profils" que vous configurez et appelez via la ligne de commande. Pour chaque résolution, vous aurez besoin d'un profil distinct. Puisque vos images sont 1: 1 et que vous n’avez pas besoin d’options de redimensionnement "intelligentes", je pense que ImageMagick sera plus que suffisant.
dim.
Pourriez-vous utiliser une seule image vectorielle à la place?
Anonsage
2
Je suis curieux de savoir quel projet nécessiterait des centaines d'images identiques, de tailles différentes. Ce n'est pas pertinent pour la réponse, mais je suis néanmoins curieux.
Web Head
2
Êtes-vous sûr d'avoir besoin d'une image dans autant de résolutions? Pensez-y encore, beaucoup plus attentivement. Discutez-en avec d'autres personnes. Je ne peux pas exclure qu'il y ait un cas extrême où c'est vraiment le cas, mais si je devais parier, je parierais sur "vous ne le faites pas bien".
o0 '.
@Lohrois your right, nous n'en avons pas tous besoin, mais pour un total de 30 Mo (1000 png), ce n'est pas un gros problème pour les PNG non utilisés.
Simon Hayter

Réponses:

19

Je veux faire beaucoup d'images à partir d'une image source!

Évidemment, je pourrais le faire à la main dans Adobe Photoshop ... et cela prendrait une quantité de temps manuel stupide.

Tu as tellement raison. Laissez l’ordinateur faire le travail répétitif facile; c'est ce qu'ils sont bons à. Comme le note la réponse de Tom Ruh , vous pouvez l'utiliser ImageMagickpour cela.

Cependant, il y a un problème:

Heureusement, l’image a une résolution de 4: 3 et convient parfaitement à toutes les résolutions de même hauteur et largeur, c.-à-d. 80x80px 100x100px, etc.

(c'est moi qui souligne)

On ne sait pas quelle résolution vous voulez: 4: 3 comme indiqué, ou 1: 1 comme implicite.

Cependant, en fonction de vos exigences de minimum 73px et maximum 1000px et des centaines de résolutions ; J'ai écrit un petit script qui devrait couvrir la plupart des possibilités (y compris le redimensionnement liquide si vous le souhaitez), qui peut être défini en modifiant certaines variables.

Script, également disponible chez pastebin ici pour une copie plus facile :

#!/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: Un peu exagéré sur les sous-coques pour le calcul des valeurs, etc., mais hé ho. Comme indiqué précédemment, les printflignes peuvent être décommentées pour donner une idée de ce qui se passe, sinon le système fonctionnera en mode silencieux par défaut, conformément à la règle de silence . Certaines images ne seront pas des dimensions exactement telles que calculées (par exemple, 193 pixels par rapport à 138,54545454545454545452px) car vous ne pouvez pas, de manière utile, disposer de pixels fractionnaires.

Bertieb
la source
1
Woohoo, génial! Cela vient de tester et cela a fonctionné à merveille. Malheureusement, cela crée un nouveau problème d’étiquettes de fichiers, car 1, 2, 3, 4, etc. ne m’informe pas de la résolution sans avoir à faire des calculs ou à inspecter l’image. Savez-vous comment je peux adapter le script pour ajouter la résolution à nom de fichier, c'est-à-dire filename-500x500.pngplutôt quefilename-1.png
Simon Hayter
Heureux que cela fonctionne à votre satisfaction plus ou moins. Merci de clarifier, je vais mettre à jour la réponse avec un nom de fichier plus descriptif. Serait -elle filename-width.pngsuffisante? L'un des modes ( conserver les proportions d'origine ) ne calcule pas directement une hauteur explicite. Je peux facilement obtenir les informations (via identify), mais cela économiserait un appel supplémentaire image par image dans les cas où le format de l'image est original.
bertieb
Woah, merci pour la réponse rapide! oui, la largeur ferait l'affaire puisque je supposerais automatiquement le même nombre pour la hauteur.
Simon Hayter
En ce qui concerne ce que j’entendais par 4: 3, c’était le rapport de format trouvé dans les téléviseurs et les moniteurs, les téléviseurs carrés .. c.-à-d. Google.co.uk/… et non la boîte aux lettres 16: 9 etc.
Simon Hayter
1
Je vais devoir le télécharger, merci! écoutez! .... votre légende, le script fonctionne à merveille! je vous remercie pour votre aide.
Simon Hayter
7

Tant que vous pouvez gérer une ligne de commande et écrire un script BASH simple. Vous pouvez utiliser ImageMagick

Tom Ruh
la source
1
Si la résolution est au format 4: 3, pour toujours une largeur de 4 pixels, vous augmentez encore de 3. De plus, les résolutions 80x80 ou 100x100 ont un rapport de format 1: 1. Étant donné que vous passez d'un rapport 4: 3 à un rapport 1: 1, vous devrez soit étirer l'image, soit recadrer les pixels en excès. Vous ne savez pas si cela compte, mais ne pourriez-vous pas garder votre résolution 4: 3 pour éviter cela?
Geruta
1
Il est réconfortant de savoir qu’une solution est possible, mais cela ne dit pas comment le réaliser. Pouvez-vous développer votre réponse avec un exemple ou des instructions? Merci.
fixer1234
1) Vous pouvez utiliser convert.exe qui fait partie de ImageMagic avec l'option -resize
dim.