Hasilkan ratusan resolusi dari satu gambar

8

Saya sedang mengerjakan sebuah proyek di mana saya membutuhkan satu gambar dalam beberapa resolusi. Cukup beruntung gambar adalah resolusi lebar / tinggi yang identik dan akan bekerja dengan baik dengan semua resolusi dengan tinggi dan lebar yang sama, yaitu 80x80px 100x100px dll.

Jelas saya bisa melakukan ini dengan tangan dalam Adobe Photoshop tetapi saya benar-benar membutuhkan ratusan resolusi yang berbeda dari 73px hingga 1000px dan ini akan memakan waktu manual yang konyol. Saya telah mencari di internet dan semua yang saya dapatkan adalah thumbnail thumbnail atau Adobe Photoshop batch saver yang masih membutuhkan banyak waktu.

Jadi, yang membawa saya ke pertanyaan saya, Bagaimana saya bisa membuat ratusan resolusi dari satu gambar secepat mungkin, baik di Windows atau Linux.

Simon Hayter
sumber
1) mereka memiliki CDN seperti ImgIx yang akan mengubah ukuran gambar secara dinamis untuk Anda. 2) Saya telah menggunakan ThumbNailer oleh Smaller Animals ($ 15) untuk mengolah gambar. Anda hanya menjalankannya melalui baris perintah dengan "profil" yang Anda konfigurasikan dan panggil melalui baris perintah. Untuk setiap resolusi, Anda memerlukan profil terpisah. Karena gambar Anda 1: 1 dan Anda tidak memerlukan opsi pengubahan ukuran "cerdas", saya pikir ImageMagick akan lebih dari cukup.
Minggu
Bisakah Anda menggunakan gambar vektor tunggal saja?
Anonsage
2
Saya ingin tahu tentang proyek yang akan membutuhkan ratusan gambar yang sama pada ukuran yang berbeda. Itu tidak relevan dengan jawabannya, tapi saya penasaran.
2
Apakah Anda yakin Anda membutuhkan gambar dalam begitu banyak resolusi? Pikirkan lagi, lebih hati-hati. Diskusikan dengan orang lain. Saya tidak bisa mengesampingkan ada kasus tepi di suatu tempat di mana ini benar-benar terjadi, tetapi jika saya harus bertaruh, saya akan bertaruh pada "Anda salah melakukannya".
o0 '.
@ Lohro adalah hak Anda, kami tidak membutuhkan semuanya, tetapi demi total 30mb (1000pngs), ini bukan masalah besar bagi PNG yang tidak digunakan.
Simon Hayter

Jawaban:

19

Saya ingin membuat banyak gambar berdasarkan gambar sumber!

Jelas saya bisa melakukan ini dengan tangan di Adobe Photoshop ... dan ini akan membutuhkan waktu manual yang konyol.

Kamu sangat benar. Biarkan komputer melakukan pekerjaan berulang yang mudah; itulah yang mereka kuasai. Seperti yang dicatat oleh jawaban Tom Ruh , Anda dapat menggunakannya ImageMagickuntuk ini.

Namun, ada masalah:

Cukup beruntung gambar adalah resolusi 4: 3 dan akan bekerja dengan baik dengan semua resolusi dengan tinggi dan lebar yang sama, yaitu 80x80px 100x100px dll.

(penekanan milikku)

Tidak jelas resolusi apa yang Anda inginkan- 4: 3 seperti yang dinyatakan, atau 1: 1 sebagaimana tersirat.

Namun, berdasarkan pada persyaratan Anda minimum 73px dan maksimum 1000px dan hundered resolusi ; Saya telah menulis sebuah skrip kecil yang harus mencakup sebagian besar kemungkinan (termasuk mengubah ukuran cair jika Anda menginginkannya) yang dapat diatur dengan mengubah beberapa variabel.

Script, juga tersedia dari pastebin di sini untuk menyalin lebih mudah :

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

Catatan: Sedikit over-the-top pada subkulit untuk menghitung nilai dan semacamnya, tapi hei ho. Seperti yang disebutkan, printfbaris - baris tersebut dapat di-uncommented untuk sebuah ide tentang apa yang sedang terjadi, jika tidak maka akan beroperasi secara diam-diam sesuai dengan Rule of Silence . Beberapa gambar tidak akan menjadi dimensi persis seperti yang dihitung (misalnya 193px vs 138.54545454545454545452px) karena Anda tidak dapat memiliki piksel fraksional yang bermanfaat.

bertieb
sumber
1
Woohoo, keren! baru diuji dan itu bekerja dengan baik, sayangnya ini menciptakan masalah baru label file, karena 1, 2, 3, 4 dll tidak memberitahu saya resolusi tanpa harus melakukan perhitungan matematika atau dengan memeriksa gambar. Apakah Anda kebetulan tahu bagaimana saya bisa mengadaptasi skrip untuk menambahkan resolusi ke nama file yaitu filename-500x500.pngdaripadafilename-1.png
Simon Hayter
Senang itu bekerja untuk kepuasan Anda lebih atau kurang. Terima kasih telah menjelaskan, saya akan memperbarui jawabannya dengan nama file yang lebih deskriptif. Apakah filename-width.pngcukup? Salah satu mode ( pertahankan rasio aspek asli ) tidak secara langsung menghitung ketinggian eksplisit. Saya dapat dengan mudah mendapatkan informasi (melalui identify) tetapi akan menghemat panggilan per-gambar tambahan dalam kasus rasio aspek asli.
bertieb
Woah, terima kasih atas tanggapan cepatnya! ya lebar akan melakukan pekerjaan karena saya akan otomatis menganggap nomor yang sama untuk ketinggian.
Simon Hayter
Mengenai apa yang saya maksud dengan 4: 3 adalah rasio aspek yang ditemukan di TV dan Monitor, yang Square .. yaitu google.co.uk/… dan bukan kotak surat 16: 9 dll.
Simon Hayter
1
Saya harus mengunduhnya, terima kasih! dengarkan! .... legenda Anda, naskahnya bekerja dengan luar biasa! terima kasih atas semua bantuannya.
Simon Hayter
7

Selama Anda dapat menangani beberapa baris perintah dan menulis beberapa skrip BASH sederhana. Anda dapat menggunakan ImageMagick

Tom Ruh
sumber
1
Jika resolusinya dalam rasio aspek 4: 3, maka untuk lebar 4 piksel, Anda lanjut naik 3. Selain itu, resolusi 80x80 atau 100x100 memiliki rasio aspek 1: 1. Karena Anda beralih dari rasio 4: 3 ke rasio 1: 1, Anda harus meregangkan gambar atau memotong piksel berlebih. Tidak yakin apakah itu penting tetapi tidak bisakah Anda menjaga resolusi 4: 3 Anda untuk menghindari ini?
Geruta
1
Sangat menyenangkan mengetahui bahwa suatu solusi itu mungkin, tetapi ini tidak menjawab bagaimana mencapainya. Bisakah Anda memperluas jawaban Anda dengan contoh atau beberapa instruksi? Terima kasih.
fixer1234
1) Anda dapat menggunakan convert.exe yang merupakan bagian dari ImageMagic dengan opsi -ukuran: imagemagick.org/discourse-server/viewtopic.php?t=15438
Sun