Generieren Sie Hunderte von Auflösungen aus einem einzelnen Bild

8

Ich arbeite an einem Projekt, bei dem ich ein einzelnes Bild in mehreren Auflösungen benötige. Glücklicherweise hat das Bild eine identische Auflösung in Breite / Höhe und funktioniert gut mit allen Auflösungen mit derselben Höhe und Breite, dh 80x80px 100x100px usw.

Natürlich könnte ich dies in Adobe Photoshop von Hand tun, aber ich benötige buchstäblich Hunderte verschiedener Auflösungen von 73px bis 1000px, und dies würde eine dumme Menge an manueller Zeit in Anspruch nehmen. Ich habe im Internet gesucht und bekomme nur Miniaturansichten oder Adobe Photoshop Batch Saver, was immer noch viel Zeit in Anspruch nehmen würde.

Das bringt mich zu meiner Frage: Wie kann ich aus einem einzelnen Image so schnell wie möglich Hunderte von Auflösungen erstellen, entweder unter Windows oder Linux.

Simon Hayter
quelle
1) Sie haben CDNs wie ImgIx, die die Größe von Bildern dynamisch für Sie ändern. 2) Ich habe ThumbNailer von Smaller Animals (15 US-Dollar) verwendet, um Bilder stapelweise zu verarbeiten. Sie führen es einfach über die Befehlszeile mit "Profilen" aus, die Sie konfigurieren und über die Befehlszeile aufrufen. Für jede Auflösung benötigen Sie ein separates Profil. Da Ihre Bilder 1: 1 sind und Sie keine "intelligenten" Größenänderungsoptionen benötigen, wird ImageMagick meiner Meinung nach mehr als ausreichend sein.
So
Könnten Sie stattdessen ein einzelnes Vektorbild verwenden?
Anonsage
2
Ich bin gespannt auf das Projekt, für das Hunderte desselben Bildes in verschiedenen Größen erforderlich sind. Es ist nicht relevant für die Antwort, aber ich bin trotzdem neugierig.
2
Sind Sie sicher, dass Sie ein Bild in so vielen Auflösungen benötigen? Denken Sie noch einmal viel genauer darüber nach. Besprechen Sie es mit anderen Menschen. Ich kann nicht ausschließen, dass es irgendwo einen Randfall gibt, in dem dies wirklich der Fall ist, aber wenn ich wetten müsste, würde ich auf "Sie machen es falsch" wetten.
o0 '.
@Lohrois Ihr Recht, wir brauchen sie nicht alle, aber für insgesamt 30 MB (1000pngs) ist es kein großes Problem für PNGs, die nicht verwendet werden.
Simon Hayter

Antworten:

19

Ich möchte viele Bilder basierend auf einem Quellbild machen!

Natürlich könnte ich dies in Adobe Photoshop von Hand tun ... und dies würde eine dumme Menge an manueller Zeit in Anspruch nehmen.

Du hast ja so recht. Lassen Sie den Computer die einfache Wiederholungsarbeit erledigen. Darin sind sie gut. Wie die Antwort von Tom Ruh vermerkt , können Sie ImageMagickdies verwenden.

Es gibt jedoch ein Problem:

Glücklicherweise hat das Bild eine Auflösung von 4: 3 und funktioniert gut mit allen Auflösungen mit der gleichen Höhe und Breite, dh 80x80px 100x100px usw.

(Hervorhebung von mir)

Es ist nicht klar, welche Auflösung Sie möchten - 4: 3 wie angegeben oder 1: 1 wie impliziert.

Basierend auf Ihren Anforderungen von mindestens 73px und maximal 1000px und Hunderten von Auflösungen ; Ich habe ein kleines Skript geschrieben, das die meisten Möglichkeiten abdecken sollte (einschließlich der Größenänderung von Flüssigkeiten, wenn Sie dies nicht möchten), das durch Ändern einiger Variablen festgelegt werden kann.

Skript, hier auch über Pastebin erhältlich, um das Kopieren zu vereinfachen :

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

Anmerkungen: Etwas übertrieben bei Unterschalen zur Berechnung von Werten und dergleichen, aber hey ho. Wie bereits erwähnt, können die printfZeilen für eine Vorstellung davon, was vor sich geht, unkommentiert werden. Andernfalls wird standardmäßig gemäß der Stille-Regel stumm gearbeitet . Einige Bilder haben nicht genau die berechneten Abmessungen (z. B. 193 Pixel gegenüber 138,54545454545454545452 Pixel), da Sie in nützlicher Weise keine gebrochenen Pixel haben können.

Bertieb
quelle
1
Woohoo, großartig! Ich habe es gerade getestet und es hat wunderbar funktioniert. Leider entsteht dadurch eine neue Ausgabe von Dateibeschriftungen, da 1, 2, 3, 4 usw. mich nicht über die Auflösung informieren, ohne etwas rechnen oder das Bild untersuchen zu müssen. Wissen Sie zufällig, wie ich das Skript anpassen kann, um die Auflösung an den Dateinamen anzuhängen, dh filename-500x500.pngnichtfilename-1.png
Simon Hayter
Ich bin froh, dass es zu Ihrer mehr oder weniger Zufriedenheit funktioniert. Vielen Dank für die Klarstellung, ich werde die Antwort mit einem aussagekräftigeren Dateinamen aktualisieren. Würde filename-width.pngausreichen? In einem der Modi ( ursprüngliches Seitenverhältnis beibehalten ) wird eine explizite Höhe nicht direkt berechnet. Ich kann die Informationen leicht genug identifyabrufen (via ), aber es würde einen zusätzlichen Aufruf pro Bild bei einem ursprünglichen Seitenverhältnis sparen.
Bertieb
Woah, danke für die schnelle Antwort! Ja, die Breite würde den Job machen, da ich automatisch die gleiche Zahl für die Höhe annehmen würde.
Simon Hayter
In Bezug auf das, was ich mit 4: 3 meinte, war das Seitenverhältnis in Fernsehgeräten und Monitoren, quadratischen .. dh google.co.uk/… und nicht Briefkasten 16: 9 usw.
Simon Hayter
1
Ich muss es herunterladen, danke! Hören Sie! .... Sie sind eine Legende, das Skript funktioniert super! danke für all deine Hilfe.
Simon Hayter
7

Solange Sie mit einer Befehlszeile umgehen und einfache BASH-Skripte schreiben können. Sie können ImageMagick verwenden

Tom Ruh
quelle
1
Wenn die Auflösung im 4: 3-Seitenverhältnis liegt, werden Sie für immer 4 Pixel breit um weitere 3 Pixel erhöht. Darüber hinaus haben Auflösungen von 80 x 80 oder 100 x 100 ein Seitenverhältnis von 1: 1. Da Sie von einem Verhältnis von 4: 3 zu einem Verhältnis von 1: 1 wechseln, müssen Sie entweder das Bild strecken oder überschüssige Pixel zuschneiden. Sie sind sich nicht sicher, ob es wichtig ist, aber können Sie nicht einfach Ihre 4: 3-Auflösung beibehalten, um dies zu vermeiden?
Geruta
1
Es ist beruhigend zu wissen, dass eine Lösung möglich ist, aber dies beantwortet nicht, wie dies erreicht werden soll. Können Sie Ihre Antwort mit einem Beispiel oder einer Anleitung erweitern? Vielen Dank.
Fixer1234
1) Sie können convert.exe, das Teil von ImageMagic ist, mit der Option -resize verwenden
So