Generuj setki rozdzielczości z jednego obrazu

8

Pracuję nad projektem, w którym potrzebuję jednego obrazu w wielu rozdzielczościach. Na szczęście obraz ma identyczną rozdzielczość szerokość / wysokość i działałby dobrze ze wszystkimi rozdzielczościami o tej samej wysokości i szerokości, tj. 80x80px 100x100px itp.

Oczywiście mógłbym to zrobić ręcznie w Adobe Photoshop, ale dosłownie potrzebuję setek różnych rozdzielczości, od 73px aż do 1000px, a to zajmie głupie ręczne użycie. Przeszukałem sieć i wciąż otrzymuję generatory miniatur lub wygaszacz partii Adobe Photoshop, co wciąż zajmuje dużo czasu.

Tak więc, co prowadzi mnie do pytania: Jak mogę stworzyć setki rozdzielczości z jednego obrazu tak szybko, jak to możliwe, w systemie Windows lub Linux.

Simon Hayter
źródło
1) mają CDN-y takie jak ImgIx, które będą dynamicznie zmieniać rozmiar obrazów dla Ciebie. 2) Użyłem ThumbNailer od Smaller Animals (15 USD) do przetwarzania wsadowego obrazów. Wystarczy uruchomić go za pomocą wiersza polecenia z „profilami”, które skonfigurujesz i wywołać za pomocą wiersza polecenia. Do każdej rozdzielczości potrzebny byłby osobny profil. Ponieważ twoje obrazy mają format 1: 1 i nie potrzebujesz żadnych „inteligentnych” opcji zmiany rozmiaru, myślę, że ImageMagick będzie więcej niż wystarczający.
niedz.
Czy możesz zamiast tego użyć jednego obrazu wektorowego?
Anonsage
2
Jestem ciekawy projektu, który wymagałby setek tego samego obrazu w różnych rozmiarach. Nie ma to znaczenia dla odpowiedzi, ale mimo to jestem ciekawy.
2
Czy jesteś SURE trzeba obrazu w wielu rozdzielczościach? Pomyśl o tym jeszcze raz, znacznie ostrożniej. Omów to z innymi ludźmi. Nie mogę wykluczyć, że gdzieś tak naprawdę jest przypadek na krawędzi, ale gdybym musiał postawić, postawiłbym na „źle robisz”.
o0 ”.
@Lohrois masz rację, nie potrzebujemy ich wszystkich, ale ze względu na 30 MB łącznie (1000 png) nie jest to duży problem w przypadku nieużywanych plików PNG.
Simon Hayter

Odpowiedzi:

19

Chcę zrobić wiele obrazów na podstawie obrazu źródłowego!

Oczywiście mógłbym to zrobić ręcznie w Adobe Photoshop ... i zajęłoby to niemądrze czas manualny.

Masz rację. Niech komputer wykona łatwą, powtarzalną pracę; w tym są dobrzy. Jak zauważa odpowiedź Toma Ruha , możesz ImageMagickdo tego użyć .

Istnieje jednak problem:

Na szczęście obraz ma rozdzielczość 4: 3 i działałby dobrze przy wszystkich rozdzielczościach o tej samej wysokości i szerokości, tj. 80x80px 100x100px itp.

(moje podkreślenie)

Nie jest jasne, jakiej rozdzielczości chcesz - 4: 3, jak podano, lub 1: 1, jak sugerowano.

Jednakże, w oparciu o wymagania minimalne 73px i maksymalnej 1000px i hundereds uchwał ; Napisałem mały skrypt, który powinien obejmować większość możliwości (w tym płynne zmienianie rozmiaru w przypadku nieoczekiwanego efektu ), które można ustawić, zmieniając niektóre zmienne.

Skrypt, dostępny również z pastebin tutaj dla łatwiejszego kopiowania :

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

Uwagi: Trochę przesadnie na temat podpowłoki do obliczania wartości i tym podobne, ale hej ho. Jak wspomniano, printfwiersze można odrzucić, aby zorientować się, co się dzieje, w przeciwnym razie domyślnie będzie działać cicho zgodnie z Regułą Ciszy . Niektóre obrazy nie będą mieć dokładnie takich wymiarów, jak obliczone (np. 193px vs 138.54545454545454545452px), ponieważ nie można w użyteczny sposób mieć pikseli ułamkowych.

bertieb
źródło
1
Woohoo, super! właśnie przetestowałem i działało pięknie, niestety tworzy to nowe wydanie etykiet plików, ponieważ 1, 2, 3, 4 itd. nie informuje mnie o rozdzielczości bez konieczności wykonywania matematyki lub sprawdzania obrazu. Czy zdarza ci się wiedzieć, jak mogę dostosować skrypt, aby dołączyć rozdzielczość do nazwy pliku, tj. filename-500x500.pngZamiastfilename-1.png
Simon Hayter
Cieszę się, że działa mniej lub bardziej satysfakcjonująco. Dzięki za wyjaśnienie, zaktualizuję odpowiedź bardziej opisową nazwą pliku. Czy filename-width.pngwystarczy? Jeden z trybów ( zachowaj oryginalne proporcje ) nie oblicza bezpośrednio wyraźnej wysokości. Mogę z łatwością uzyskać informacje (przez identify), ale zaoszczędziłoby to dodatkowego połączenia dla obrazu w przypadku oryginalnego współczynnika kształtu.
bertieb
Woah, dzięki za szybką odpowiedź! tak, szerokość wykonałaby zadanie, ponieważ automatycznie przyjęłbym tę samą liczbę dla wysokości.
Simon Hayter
Jeśli chodzi o to, co rozumiem przez 4: 3, to proporcje obrazu znalezione w telewizorach i monitorach, kwadratowe .. tj. Google.co.uk/... a nie skrzynka na listy 16: 9 itd.
Simon Hayter
1
Będę musiał go pobrać, dzięki! słuchaj! .... twoja legenda, skrypt działa niesamowicie! dziękuję Ci za całą twoją pomoc.
Simon Hayter
7

Tak długo, jak potrafisz obsługiwać niektóre wiersze poleceń i pisać proste skrypty BASH. Możesz użyć ImageMagick

Tom Ruh
źródło
1
Jeśli rozdzielczość wynosi proporcje 4: 3, wówczas dla szerokości zawsze 4 pikseli, przechodzisz o kolejne 3 w górę. Ponadto rozdzielczości 80 x 80 lub 100 x 100 mają współczynnik kształtu 1: 1. Ponieważ przechodząc ze stosunku 4: 3 do stosunku 1: 1, będziesz musiał rozciągnąć obraz lub przyciąć nadmiar pikseli. Nie jestem pewien, czy to ma znaczenie, ale czy nie możesz po prostu zachować rozdzielczości 4: 3, aby tego uniknąć?
Geruta
1
Pocieszające jest to, że rozwiązanie jest możliwe, ale to nie wyjaśnia, jak to osiągnąć. Czy możesz rozszerzyć swoją odpowiedź o przykład lub instrukcje? Dzięki.
fixer1234
1) Możesz użyć Convert.exe który jest częścią ImageMagick z opcją -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Sun