⚠️ Ini adalah situs terjemahan tidak resmi dan tidak berafiliasi dengan ImageMagick Studio LLC. Untuk informasi resmi, lihat halaman asli (https://usage.imagemagick.org/windows/index.html).

Contoh penggunaan ImageMagick -- penggunaan di Windows

 [ Pengantar](#intro)

Pengantar

Apa gunanya skrip IM di PC Windows saya?

Contoh-contoh berikut pada dasarnya mengandaikan bahwa IM dijalankan di komputer desktop Windows, kemungkinan besar yang terhubung ke jaringan. Nah, sudah ada banyak program manipulasi gambar yang siap pakai, seperti Adobe Photoshop, Paint Shop Pro dari Corel, IrfanView (http://www.irfanview.com/) dan bahkan GIMP (http://www.gimp.org/). Jadi mengapa harus repot melakukan pemrosesan gambar lewat program dan skrip baris perintah IM? Keunggulan sejati memakai ImageMagick alih-alih antarmuka berbasis tetikus adalah manipulasi rutin bisa diotomatiskan sepenuhnya, baik untuk satu file maupun untuk file dalam jumlah besar. Tugas seperti:

Konversi format secara massal
Ini ditawarkan cukup banyak program Windows, misalnya IrfanView. Namun keluwesan IM dalam urusan format gambar tak tertandingi. Seluruh halaman sebuah PDF, misalnya, bisa dikonversi menjadi rangkaian JPEG (jika GhostScript terpasang di komputer Anda).
Memperkecil dan mempraproses foto digital
Saat menyisipkan foto digital ke dalam dokumen pengolah kata, resolusinya biasanya perlu diturunkan agar dokumen bisa dicetak lebih cepat. Hal yang sama berlaku bila dokumen itu dikonversi menjadi PDF lewat driver printer PDF seperti FreePDF. Praproses juga bisa mencakup rutin koreksi warna dan koreksi lensa.

Menempatkan logo Anda pada sejumlah besar foto digital

Menerapkan serangkaian operasi pada sejumlah besar foto digital
Setelah menyusun serangkaian langkah kerja dengan program berbasis tetikus, Anda mungkin ingin mengotomatiskan langkah-langkah itu untuk pemrosesan massal di kemudian hari. Namun bahasa skrip (seperti Action Script dari Adobe) tidak begitu umum pada program pemrosesan gambar Windows.

Menggabungkan beberapa gambar menjadi satu gambar katalog

Meski sebagian tugas itu (terutama pengecilan massal) juga ditawarkan program freeware lain (terutama pemrosesan batch IrfanView), tak pernah ada kebebasan memilih langkah pemrosesan mana yang diterapkan: Anda harus menerima apa yang disediakan program itu. Pemrosesan batch IrfanView, misalnya, menawarkan penempatan untai teks pada sejumlah besar foto, tetapi bukan logo. Ia juga menawarkan pengubahan nilai gamma, tetapi histogram foto tak bisa dipangkas di kedua ujungnya (seperti dilakukan "-contrast-stretch" di IM, lihat Normalize dan contrast stretch). Skrip IM sangat cocok untuk penggunaan produktif di dalam jaringan perusahaan, karena skrip siap pakai dapat dijalankan siapa saja – pengguna akhir tidak harus tahu apa yang terjadi di balik layar. Dengan begitu langkah alur kerja standar pada gambar bisa diotomatiskan sepenuhnya (dan benar-benar dibakukan). Beberapa skrip yang disajikan berikut ini lahir dari penggunaan produktif di perusahaan kecil kami (yang bergerak di bidang rekonstruksi kecelakaan). Saya bukan pemrogram skrip Windows yang menonjol, bukan pula orang yang paling akrab dengan perkakas baris perintah IM. Mungkin ada pendekatan yang lebih elegan untuk sebagian masalah yang dibahas berikut ini. Yang ingin saya tunjukkan adalah:

  • mendemonstrasikan beberapa teknik dasar pemrograman skrip Windows dengan perkakas baris perintah IM.
  • membuktikan bahwa penggunaan skrip berbasis IM bukan seni demi seni, bukan pula hiburan akademis.
  • menunjukkan bahwa perkakas baris perintah IM bisa mengerjakan pekerjaan nyata di jaringan lokal (dan bukan hanya di webserver).

Seperti di bagian lain halaman contoh IM, kita hanya akan memakai perkakas baris perintah IM dan mengesampingkan berbagai antarmuka pemrogramannya. Skrip-skrip ini dimaksudkan berjalan di dalam jaringan lokal dengan huruf drive yang ditetapkan untuk tiap drive jaringan. Sebagian besar skrip dimaksudkan dijalankan di komputer klien jaringan tersebut, sedikit yang menyasar server (file) jaringan.

Lingkungan yang mungkin untuk perkakas baris perintah IM

Di Windows, perintah IM yang sederhana biasanya dijalankan di Windows Command Shell (sebuah "DOS Shell" yang dijalankan dengan memulai cmd.exe). Untuk operasi rumit, yang dilakukan dalam satu baris perintah panjang atau dalam serangkaian baris perintah, lebih baik menulis skrip. Untuk rangkaian perintah sederhana, skrip itu kemungkinan besar berupa file batch DOS yang dieksekusi di Windows Command Shell. Pendekatan ini punya kelemahan, sebab kumpulan perintah file batch cukup terbatas dibandingkan shell perintah UNIX yang lazim. Saat menjalankan IM di Windows, pada dasarnya tersedia alternatif berikut:

Shell perintah Windows ("jendela DOS")
Ini dijalankan oleh cmd.exe (mode 32-bit) pada Windows NT 4.0, Windows XP dan versi setelahnya, dan tersedia di komputer Windows mana pun. Lihat Menggunakan shell DOS dan file batch, serta catatan khusus tentang Masalah Convert.
Cygwin
Shell perintah mirip bash (http://www.cygwin.com/). Dengan shell ini, contoh IM yang disajikan di bagian usage lainnya bisa dijalankan persis seperti tertulis, karena Anda punya akses ke shell baris perintah bergaya UNIX. Lihat Menggunakan Cygwin di bawah.
Windows Script Host
Windows Script Host berbasis teknologi .COM. Ia ada di komputer Windows masa kini mana pun dan skrip WSH jauh lebih ampuh daripada file batch DOS biasa. Windows Script Host menawarkan beberapa antarmuka pemrograman, dengan VBScript (Visual Basic Script) dan JScript (Java Script) sebagai yang paling umum. Perkakas baris perintah IM dapat dipanggil memakai perintah shell DOS Run atau Exec dari objek Shell. Lihat Visual Basic Script (VBS) di bawah.
Windows Powershell
Penerus shell DOS lawas yang jauh lebih ampuh, berbasis teknologi .NET 2.0. Powershell disertakan mulai Windows 7 dan dijalankan oleh powershell.exe. Untuk Windows XP dan Vista, ia bisa diunduh di situs web Microsoft.

Menjalankan skrip secara efektif

Anggaplah Anda punya skrip Windows yang sempurna (file batch DOS, VBScript, atau apa pun) yang menerima nama file masukan sebagai parameter baris perintah, melakukan sejumlah manipulasi, lalu memuntahkan hasilnya sebagai satu gambar atau serangkaian gambar. Tentu Anda tak akan senang harus membuka shell perintah DOS (atau alternatifnya) setiap kali lalu mengetikkan nama file itu satu per satu. Untuk menghindari cara kerja yang merepotkan itu, pada dasarnya tersedia Drag & Drop atau SendTo: Dengan Drag & Drop, file batch DOS atau VBScript (atau apa pun) ditaruh di lokasi yang mudah dijangkau, seperti desktop atau direktori yang memuat file gambar yang akan diproses. File yang akan diproses lalu dipilih di Windows Explorer dan dijatuhkan begitu saja ke atas file skrip. Nama file akan diserahkan ke skrip sebagai parameter baris perintah dan bisa dirujuk di dalam skrip. Sebagai alternatif, skrip (atau tautan ke skrip) bisa ditaruh di direktori SendTo. Program di direktori ini muncul di menu konteks Windows Explorer saat mengeklik kanan di panel file Explorer. Lagi-lagi, nama file yang dipilih diserahkan ke skrip sebagai parameter baris perintah. Direktori SendTo bernama SendTo. Lokasinya tampaknya berpindah pada setiap versi Windows baru. Cara yang paling andal untuk menemukannya adalah mengetik shell:sendto di kotak run. Satu baris perintah di Windows XP atau setelahnya bisa sepanjang 8192 (= 213) karakter. Jadi jika perkakas IM dipanggil langsung dari baris perintah, entah secara langsung atau lewat file batch yang menyebut semua file yang dibutuhkan, batas ini hampir tak akan tersentuh. Namun Drag & Drop memakai rutin ExecShell, yang terbatas pada untai sepanjang "hanya" 2048 (= 211) karakter. Karena semua file diteruskan dengan nama file berkualifikasi penuh (yakni drive + path + nama), ini bisa menjadi masalah bagi file batch dan VBScript yang dijalankan lewat WSH bila nama path menjadi terlalu panjang. Error ini tak bisa ditangani dengan benar oleh skrip begitu terjadi, sebab error muncul sebelum skrip benar-benar dijalankan. Solusinya di Windows XP biasanya adalah menaruh file di lokasi dengan nama path yang lebih pendek.

Masalah Convert

Rutin instalasi Windows milik IM menambahkan direktori program IM ke path pencarian, sehingga perkakas baris perintah IM bisa dipanggil langsung dari prompt perintah tanpa menyebutkan nama path. Secara default Anda akan memakai magick sebagai perkakas baris perintah. Namun, jika nama program lawas yang dipilih, nama perkakas baris perintah IM tergolong tidak khas (misalnya convert, identify, compare ...) sehingga memancing bentrok nama dengan program lain. Terutama convert, yang merupakan perkakas sistem Windows dan berada di direktori sistem Windows (c:\Windows\system32\convert.exe), yang mengonversi sistem file FAT32 menjadi NTFS yang kini umum. Tetapi ada pula program lain bernama "convert.exe", misalnya utilitas pengonversi laporan Delphi. Perkakas konversi FAT ke NTFS pertama kali disertakan pada Windows XP dan menimbulkan bentrok nama dengan perkakas baris perintah IM "convert" karena direktori program IM ditambahkan di belakang path pencarian DOS (yakni variabel lingkungan PATH), sehingga perkakas sistem ditemukan lebih dulu dan pemanggilan sederhana "magick" pada skrip lama tidak teruraikan dengan benar. Versi program setup Windows IM sekarang menempatkan direktori program IM di awal path pencarian, sehingga memastikan bahwa bila terjadi bentrok nama, perkakas baris perintah IM biasanya ditemukan lebih dulu. Namun utilitas lain dengan nama sama (misalnya pengonversi laporan Delphi) menemui masalah yang sama dan menempuh solusi yang sama pula, yakni menempatkan path programnya di awal variabel path, yang berarti solusi ini tidak antigagal: Jika Delphi dipasang setelah IM, pemanggilan Convert yang sederhana akan memanggil perkakas pengonversi laporan, bukan Convert milik IM. Diperkenalkannya perkakas Convert pada Windows XP membuat banyak skrip lawas ambruk. Solusi yang lazim adalah mengganti nama perkakas Convert milik IM menjadi sesuatu yang lain, misalnya "IMconvert" (Perhatikan bahwa perintah sistem tidak bisa diganti namanya, karena service pack Windows berikutnya kemungkinan besar akan memulihkannya dan mengabaikan versi yang telah diganti nama.) Solusi ini, meski kini tak diperlukan lagi, masih bisa ditemukan di mana-mana di Internet. Cara terbaik menghindari kemungkinan bentrok nama di masa depan adalah memanggil perkakas baris perintah IM dengan nama path lengkapnya di setiap skrip. Artinya, menyimpan lokasinya dalam sebuah variabel atau konstanta. Jadi setiap file batch sebaiknya diawali baris seperti

  SETLOCAL EnableDelayedExpansion
  SET IMCONV="%PROGRAMFILES%\ImageMagick\Convert"
  ...
  %IMCONV% -size 128x128 xc:white test.gif

Kode itu mengandaikan IM dipasang di direktori bernama "ImageMagick" di bawah direktori program, yang bukan penamaan standar direktori instalasinya. (Lihat Memasang ImageMagick di Windows untuk rinciannya.) %PROGRAMFILES% adalah variabel lingkungan yang mengembang menjadi nama direktori program, yakni "Program Files" pada Windows versi Inggris dan "Programme" pada Windows versi Jerman. SETLOCAL akan membatasi definisi variabel lingkungan baru (seperti IMCONV) pada lingkup file batch itu saja. EnableDelayedExpansion sebenarnya tidak diperlukan di sini, tetapi memakai opsi ini setiap kali memakai SETLOCAL adalah kebiasaan yang baik; lihat Panduan pemrograman batch. untuk rinciannya. Ada cara yang lebih canggih dan lebih antigagal untuk mengetahui direktori instalasi IM, yang akan dibahas di Menyunting, men-debug, dan menguji error saat runtime. Kode VB-Script yang setara kira-kira seperti ini

  Set wsh = WScript.CreateObject("WScript.Shell")
  IMconv = wsh.ExpandEnvironmentStrings("%PROGRAMFILES%") & "\ImageMagick\Convert"

Demi kesederhanaan, kode ini tidak akan kita pakai setiap kali pada bagian berikut, tetapi sebaiknya Anda mengingatnya sebagai kebiasaan yang baik. Untuk ringkasan dan solusi alternatif yang bagus atas masalah ini lihat Ron Savage: MS Windows and convert.exe.

Pengodean karakter

ImageMagick mengodekan untai dalam Unicode, lebih tepatnya dalam UTF-8. Sebaliknya, DOS memakai codepage untuk mengodekan karakter (kebanyakan dalam 8 bit). Ini menimbulkan masalah saat menuliskan untai ke dalam gambar, misalnya saat bekerja dengan 'label' atau '-title': bila memakai karakter non-ASCII, pendekatan yang mudah akan meleset. Untuk membuat label berisi umlaut Jerman seperti 'ä', 'ö', 'ü', misalnya, di Linux cukup dipakai perintah berikut...

  magick label:äöü test.png

Tetapi ini tidak akan menghasilkan untai yang diinginkan di Windows. Meski begitu, untai berkode UTF-8 bisa dibaca dari sebuah file teks:

  magick label:umlauts.txt test.png

dan file teks itu bahkan bisa dibuat memakai "echo, asalkan codepage lebih dulu dialihkan ke UTF-8:

  CHCP 65001
  ECHO äöü > umlauts.txt
  magick label:umlauts.txt test.png

Tetapi jika ingin memproses keluaran sebuah perintah DOS, misalnya saat mencoba memberi judul pada cetakan indeks JPEG yang ada di suatu direktori dengan nama direktori itu, Anda akan menemui kesulitan. Beralih ke codepage 65001 tidak akan berhasil pada sebagian besar perintah DOS, terutama saat menelusuri pohon direktori. Dan mengganti codepage bolak-balik antara, katakanlah, 1252 (Latin Eropa Barat) dan 65001 biasanya juga tidak berhasil, atau setidaknya menjadi cukup rumit. Pendekatan paling aman adalah mengonversi untai saat dibutuhkan, memakai program baris perintah eksternal seperti "Iconv.exe", sebuah perkakas UNIX yang juga tersedia untuk Windows. Unduh file setup-nya dari SourgeForge dan pasang file-nya ke direktori standar C:\Program Files\GnuWin32. Lalu tuliskan keluaran perintah DOS ke sebuah file teks di dalam skrip Anda dan konversikan file itu ke UTF-8 sesudahnya:

  CHCP 1252
  DIR /B äöü.jpg > temp.txt
  "C:\Program Files\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 temp.txt > title.txt
  magick label:@title.txt äöü.jpg -append äöü_labelled.jpg

Parameter itu memberi tahu Iconv agar mentranskode dari ISO-8859-1 (codepage 1252) ke UTF-8. Iconv menulis keluarannya ke stdout, jadi keluaran itu harus dialihkan ke sebuah file agar bisa dipakai dengan 'label'. Perlu dicatat bahwa menuliskan keluaran ke file teks memang dianjurkan, sebab dengan begitu ImageMagick menafsirkan isi file secara harfiah, tanpa menganggap backslash Windows ("\") sebagai karakter escape. Tentu saja kode pada contoh di atas tidak terlalu masuk akal karena disajikan sekadar untuk demonstrasi. Pada file batch DOS yang nyata, nama file kemungkinan besar dihasilkan di dalam loop FOR. Contoh praktisnya diberikan di bawah (lihat Memproses pohon (sub-)direktori secara batch). Untuk lebih lanjut soal penanganan UTF lihat contoh dan informasi IM lainnya di Teks unicode atau berformat UTF8.

Memasang ImageMagick di Windows

ImageMagick terus dikembangkan, versi baru dirilis kira-kira sebulan sekali. Sangat dianjurkan memakai versi IM yang mutakhir, terutama bila IM tampak tidak mengerjakan sesuatu seperti yang Anda harapkan. Dalam kebanyakan kasus, memasang versi terkini akan menyelesaikan masalah. Program setup rilis biner terkini bisa ditemukan di https://imagemagick.org/script/binary-releases.php#windows. Versi ImageMagick yang mendukung HDRI (Floating Point Quality) dan FFT (Fast Fourier Transform) juga bisa diunduh dari Astronomy and Astrophotography Blog. Secara default, IM memasang dirinya di direktori program bernama C:\Program Files\ImageMagick x.x.x-x, dengan "x.x.x-x" sebagai nomor versinya. Secara default pula, program setup menyarankan perluasan variabel lingkungan PATH saat IM dipasang untuk pertama kali (yakni "Add application path to your system path" tercentang). Jika lupa menghapus versi lama, Anda akan cepat punya koleksi berbagai versi ImageMagick lengkap dengan perluasan PATH masing-masing. Karena itu di kantor kami terbiasa memasang IM ke C:\Program Files\ImageMagick, memasang versi baru menimpa yang lama dan membiarkan variabel lingkungan PATH tak tersentuh. Selama bertahun-tahun memakai cara ini kami tak menemukan yang keliru. Jika Anda benar-benar ingin tahu nomor versi IM, "convert -version" selalu bisa dipanggil, dan skrip yang antigagal bisa mengevaluasi nomor versi itu bila ia bergantung pada versi minimum tertentu. Lihat bagian "Menyunting, men-debug, dan menguji error saat runtime" untuk informasi lebih lanjut soal ini. ImageMagick menulis beberapa kunci Registry ke HKEY Local Machine\Software\ImageMagick. Jika Anda berurusan dengan beberapa versi IM yang terpasang, kunci terpenting adalah HKEY Local Machine\Software\ImageMagick\Current, tempat path ke biner IM juga bisa ditemukan, bernama BinPath. Entri registry ini bisa dikueri di awal skrip mana pun sehingga path program dapat ditentukan tanpa harus bergantung pada variabel lingkungan PATH. Lihat bagian "Menyunting, men-debug, dan menguji error saat runtime" untuk informasi lebih lanjut soal ini. Program setup IM menawarkan opsi memasang objek COM+ untuk ImageMagick lewat opsi Install ImageMagickObject OLE Control for VBscript, Visual Basic, and WSH. Opsi itu tidak tercentang secara default dan pemasangan objek COM+ bukan prasyarat untuk memakai IM dalam VBScript, seperti akan dibuktikan berikut ini. Bagaimanapun, jangan mengandalkan objek COM+ terpasang pada mesin sasaran skrip selain milik Anda sendiri. Saat bekerja dengan file PostScript, ImageMagick bergantung pada program lain, "Ghostscript", untuk membaca dan mengonversi file PostScript dan PDF menjadi format gambar yang bisa dipakainya. Artinya, untuk membaca dokumen semacam itu Ghostscript perlu terpasang di komputer Anda. Versi terbarunya bisa diunduh di SourceForge. Urutan pemasangan GhostScript dan ImageMagick tidak jadi soal. GhostScript tidak harus dipasang sebelum ImageMagick, dan ImageMagick akan berjalan baik tanpa GhostScript terpasang. Ia hanya dibutuhkan bila Anda ingin bekerja dengan file Postscript atau PDF. IM akan menentukan lokasi Ghostscript saat runtime, dengan mengueri Registry.

Kekhususan dan jebakan

Cukup luar biasa untuk ukuran program Windows, IM memungkinkan gambar ditulis ke stdout dan dibaca dari stdin, sehingga piping bisa dipakai untuk merangkai tugas pemrosesan gambar. Operasi

  magick -size 128x128 xc:white gif:- | magick - test.gif

setara dengan

  magick -size 128x128 xc:white test.gif

Pada perintah pertama dalam pipe, operator minus memberi tahu IM agar menulis gambar ke stdout, sedangkan operator minus pada perintah kedua memberi tahu IM agar membaca gambar dari stdin. Cara kerja ini memungkinkan kita menghindari penggunaan file sementara secara eksplisit. Ini terutama berguna bila suatu perintah tidak menawarkan operasi tertentu, misalnya trimming:

  montage -tile 2x2 -geometry 400x300+60+60 1.png 2.png 3.png 4.png miff:- | magick - -trim montage.png

Sebagai konsekuensi fitur ini, keluaran tekstual biasanya ditulis ke stderr dan bukan ke stdout. Misalnya: jika ingin mengalihkan keluaran tekstual Compare ke sebuah file teks, Anda harus menulis

  magick compare -metric PSNR 1.png 2.png dif_1_2.png 2>result.txt

Jadi yang harus dialihkan ke file teks adalah stderr ("2>"), bukan stdout ("1>" atau cukup ">").

Mendapatkan bantuan

Opsi baris perintah didokumentasikan secara luas di situs web IM, tetapi bagian Usage situs itulah yang benar-benar memperagakan cara membuatnya bekerja. Bagian situs ini tersusun cukup rapi sehingga memungkinkan pendekatan berorientasi masalah terhadap tugas yang ingin Anda kerjakan. Namun pendekatan cepat-dan-kotornya adalah pencarian Google pada bagian situs itu terkait opsi baris perintah yang ada di benak Anda. Jika ingin melakukan montage atas beberapa gambar dan ingin mencari tahu soal opsi -tile, Anda bisa melakukan pencarian Google pada salah satu dari

dan Anda akan cepat menemukan hal-hal pentingnya. Ingat saja bahwa cara ini akan menampilkan kode yang ditujukan untuk lingkungan UNIX / LINUX, yang harus sedikit disesuaikan agar bisa dipakai di Windows. Sumber informasi lain yang sangat membantu adalah papan diskusi IM, alias Discourse Server User Forum, yang sebaiknya dimasukkan ke bookmark / favorit peramban Anda. Sebagai anggota, Anda dapat mengajukan pertanyaan, yang umumnya cepat dijawab pengguna yang paham.

Program bantu dan alternatif

Ya, memang benar. Ada pekerjaan tertentu yang bisa dikerjakan program lain lebih baik daripada ImageMagick. Biasanya program yang dirancang khusus untuk format tertentu, bukan untuk manipulasi gambar umum seperti yang disediakan ImageMagick.

  • IrfanView mungkin penampil gambar paling umum di Windows, yang juga memungkinkan sedikit manipulasi gambar.
  • Program GUI seperti Adobe Photoshop atau Gimp lebih cocok untuk penyuntingan langsung dan pengujian langkah manipulasi gambar yang rumit.
  • Untuk manipulasi header EXIF foto digital, Jhead dan ExifTool lebih luwes daripada ImageMagick.
  • Ekstraksi aliran JPEG dari PDF sebaiknya dikerjakan dengan xPDF.
  • Pemrosesan video sebaiknya dikerjakan dengan VirtualDub, paling baik dikombinasikan dengan AviSynth dan editornya AvsP.

Ini bukan berarti ImageMagick harus diabaikan untuk pekerjaan gambar semacam itu. Justru jauh lebih banyak yang bisa dikerjakan dengan menggabungkan keduanya.


Menggunakan Cygwin

Seperti telah disebut di atas, ImageMagick dirancang dengan UNIX dan Linux dalam pikiran, jadi pendekatan termudah kemungkinan adalah memasang shell Bash di sistem Windows Anda lalu menjalankan aneka skrip IM yang sudah ditulis untuk sistem itu, misalnya skrip Fred Weinhaus. Cygwin – seperti dikatakan para pengembangnya, menyediakan "lingkungan mirip Linux untuk Windows". Ia terdiri atas semua perkakas yang biasanya tersedia di shell Linux. Saya sudah menguji beberapa skrip bash Fred Weinhaus di shell Bash Cygwin dan mendapatinya berfungsi penuh. Di bagian bawah halaman utama situs Cygwin ada tautan berlabel Install or update now!, yang akan mengunduh stub instalasi bernama Setup.exe. Saat program ini dijalankan, ia menawarkan daftar situs mirror. Setelah Anda memilih salah satunya, rutin itu akan menampilkan tampilan pohon berisi perkakas yang hendak dipasang. Pilihan standarnya tampak masuk akal bagi saya, jadi Anda bisa langsung melanjutkan. Rutin instalasi lalu mengunduh paket yang dibutuhkan dan memasang Cygwin di komputer Anda. Saat memasang, pastikan paket "bc" ikut disertakan, karena ia tidak diaktifkan secara default. Paket ini bisa dipasang sebagai opsi dari panel instalasi Cygwin. Ini utilitas matematika floating point dan bisa sangat penting dalam skrip IM, seperti yang dipakai Fred Weinhaus.
Saat Anda menjalankan Cygwin, shell Bash-nya terlihat mirip kotak DOS, yaitu jendela teks berlatar hitam. Seperti pada jendela DOS, fontnya bisa dipilih dengan mengeklik menu sistem jendela itu, yang terletak di kiri bilah judul. Perintah dasarnya adalah:
  • Direktori saat ini diubah dengan perintah CD, kurang lebih seperti di DOS. Namun backslash ("\") harus diganti dengan garis miring ("/"). Drive juga diubah lewat CD, seperti di DOS. Jadi CD w: akan beralih ke drive w: Tak seperti pada lingkungan Unix biasa, nama path tidak membedakan huruf besar-kecil. Karakter khusus, seperti umlaut, boleh dipakai. Untuk beberapa perintah, nama drive harus diteruskan dalam sintaksis khusus yang menghindari titik dua. Misalnya /cygdrive/w/test.
  • Cywin membaca variabel lingkungan PATH milik Windows dan menyetel PATH-nya sendiri sesuai itu. Anda bisa memeriksanya dengan mengetik echo $PATH di shell Bash. Catatan: Tak seperti di Windows, nama variabel lingkungan membedakan huruf besar-kecil, jadi PATH harus dirujuk dengan huruf kapital.
  • Tak seperti di Windows, direktori saat ini secara default tidak ada di path pencarian! Jika misalnya skrip shell "autolevel1" berada di W:\scripts, Anda tak bisa sekadar beralih ke direktori itu lalu memanggil skripnya. Setidaknya lokasi direktori minimal harus ditambahkan di awal nama skrip, seperti ini: ./autolevel1 (untuk skrip yang berada di direktori saat ini). Atau path lengkap skripnya, seperti ini /cygdrive/w/scripts.
  • Sebagai alternatif, direktori skrip itu bisa ditambahkan secara eksplisit ke path pencarian dengan PATH=$PATH:/cygdrive/w/scripts. Karena titik dua dipakai sebagai pemisah path, tata nama khusus ini harus dipakai, yakni /cygdrive/w/scripts alih-alih w:/scripts.

Uraian tentang shell Cygwin ini akan diperluas pada versi halaman ini berikutnya. Untuk sementara, informasi di atas semestinya cukup untuk memulai.


Menggunakan shell DOS dan file batch

Mengonversi skrip: shell UNIX ke DOS Windows

Saat memanggil perintah IM langsung dari shell perintah DOS (memakai cmd.exe) Anda harus memodifikasi skrip yang disajikan di situs contoh IM (bila skrip itu tidak berasal dari bagian ini), karena sebagian besar contoh yang disediakan (di bagian lain) umumnya dimaksudkan berjalan di shell perintah UNIX atau LINUX. Agar bisa dijalankan dari shell perintah DOS, modifikasi berikut harus dilakukan:

  • Paling sering, tanda kutip ganda '"' harus dipakai menggantikan tanda kutip tunggal ''' supaya argumen perintah tetap benar. Waspadai tanda kutip di dalam tanda kutip, seperti pada operator -draw. Tanda kutip tunggal boleh dipakai di dalam argumen berkutip ganda DOS karena tanda itu diteruskan ke IM untuk ditangani, bukan diproses oleh skrip.
  • Backslash '\' yang muncul di akhir baris contoh menyatakan 'lanjutan baris' yang menyambung baris berikutnya ke urutan baris perintah yang sama. Gantilah dengan karakter '^' untuk menyatakan lanjutan baris di file batch DOS. Untuk DOS, baris berikutnya juga perlu diawali spasi, tetapi itu praktik yang cukup lazim sehingga semestinya tak banyak jadi masalah. Semua baris juga bisa disambung menjadi satu baris dengan membuang backslash-nya, meski ini membuat penyuntingan dan pembacaan perintah jauh lebih sulit. Karena itu praktik tersebut tidak dianjurkan.
  • Semua karakter shell terpesan yang tidak berada di dalam tanda kutip ganda harus di-escape dengan '^' (caret atau sirkumfleks) bila dipakai dalam makna harfiah (yakni tidak menjalankan fungsi biasanya). Karakter shell terpesan itu adalah: '&', '|', '(', ')', '<', '>', '^'. Ini terutama berarti:
    • Karakter khusus '>' (dipakai untuk geometry resize) perlu di-escape memakai '^'. Misalnya "-resize 100x100^>"
    • Demikian pula flag 'internal fit resize' '^' perlu digandakan menjadi '^^'.
  • Backslash escape shell UNIX '\' tidak diperlukan untuk meng-escape tanda kurung '()' atau tanda seru '!'.
  • Selain itu backslash escape shell UNIX '\' perlu diganti dengan karakter sirkumfleks '^', ketika ia meng-escape karakter seperti '<' dan '>'.
    Misalnya: "-resize 100x100\>" akan menjadi "-resize 100x100^>".
  • Di file batch DOS, karakter persen '%' juga punya makna khusus karena ia merujuk ke parameter baris perintah. Misalnya %1, %2, ... (di shell UNIX tanda '$' dipakai untuk makna umum yang sama). Di file batch DOS, tanda persen tunggal (seperti yang muncul pada "perintah FOR") perlu digandakan menjadi '%%'. ImageMagick sendiri umumnya hanya melihat apakah ada tanda persen, dan tidak peduli bila diberikan lebih dari satu. Jadi kecuali ia bagian dari label teks atau untai komentar, menggandakan semua tanda persen umumnya tidak merugikan.
  • Ingatlah bahwa nama file Windows boleh mengandung karakter spasi. Spasi juga bisa dipakai di UNIX, tetapi tidak begitu umum. Nama file yang mungkin mengandung spasi harus diapit tanda kutip ganda "file name.jpg" atau "file name".jpg. Nama file yang diteruskan ke skrip atau file batch lewat Drag & Drop atau SendTo sebagai parameter baris perintah butuh perhatian khusus, sebab ia diteruskan ke skrip tanpa tanda kutip bila tidak mengandung spasi, dan dengan tanda kutip bila mengandung spasi.
  • Komentar dalam skrip shell UNIX diawali '#' tanpa kutip di mana pun dalam satu baris dan berlanjut sampai akhir baris. Pengaturan warna (seperti "#FF0000" untuk warna merah) sering diberi tanda kutip untuk menghilangkan makna khusus ini. Pengutipan itu tidak diperlukan di DOS, tetapi memakai tanda kutip ganda '"" di sekitarnya tidak jadi soal dan sebaiknya dipertahankan. Di DOS, komentar hanya boleh muncul di awal baris memakai awalan 'REM', '@REM', atau '::'. Meski begitu ia juga berlanjut sampai akhir baris. Terserah Anda metode pemberian komentar mana yang dipakai. Namun komentar yang baik pada file batch mana pun selalu dianjurkan, supaya Anda tahu apa yang hendak dilakukan perintah pada tiap langkah ketika kembali ke skrip itu berbulan-bulan atau bertahun-tahun kemudian. Ini juga jauh memudahkan orang lain memahaminya. Semua skrip sebaiknya diawali komentar yang agak panjang, yang menjelaskan apa yang dilakukan skrip dan bagaimana ia harus dipakai. Ini sekadar praktik pemrograman yang baik.
  • Saat sebuah file batch DOS dieksekusi, tiap perintah digemakan secara default. Artinya, perintah ditampilkan di kotak DOS keluaran. Di UNIX Anda justru perlu menambahkan perintah atau opsi khusus untuk mencetak perintah yang sedang dieksekusi dengan cara itu. Keluaran 'gema' ini bisa dimatikan dengan mengawali skrip memakai "@ECHO OFF". Komentar awal khusus "#!/path/to/shell" pada skrip shell UNIX tidak diperlukan untuk file batch DOS. Jadi baris itu bisa diganti dengan perintah "@ECHO OFF" untuk file batch DOS.

Misalnya, dengan mengikuti aturan di atas, skrip shell UNIX ini...

  #!/bin/sh
  # Create a negated rose image and overlay a comment
  magick -background none -fill red -gravity center \
          -font Candice -size 140x92 caption:'A Rose by any Name' \
          \( rose: -negate -resize 200% \) +swap -composite \
          output.gif

akan menjadi kira-kira seperti ini sebagai file batch DOS Windows...

  @ECHO OFF
  :: Create a negated rose image and overlay a comment
  magick -background none -fill red -gravity center  ^
          -font "C:\path\to the\font\candice.ttf"  ^
          -size 140x92   caption:"A Rose by any Name"  ^
          ( rose: -negate -resize 200%% ) +swap -composite  ^
          C:\where\to\save\output.gif

Saya telah menulis pengonversi dasar dari skrip shell Linux ke file batch DOS memakai SED (S treaming ED itor). SED adalah program manipulasi file teks UNIX / Linux yang lazim dan juga tersedia untuk Windows di http://sed.sourceforge.net/. Seperti IM yang merupakan manipulator gambar berbasis perintah, SED adalah editor berbasis perintah. Skrip SED cim.txt yang melakukan manipulasi yang dibutuhkan tampak seperti ini (setelah semua komentarnya dibuang):

  s/'/\"/g
  s/%/%%/g
  s/\\\([()!]\)/\1/g
  s/\([&|<>]\)/^\1/g
  s/^[ ]*#/::/
  s/\(^.*\)\( #.*$\)/\2\n\1/
  s/\(.:.*\.[a-z,A-Z]*\)[ ]/\"\1\" /g
  s/\\[ ]*$/^/
  s/^[ ][ ]//

Versi file yang berkomentar lengkap bisa Anda unduh di sed_script.zip. Jika skrip SED cim.txt ditaruh di direktori yang sama dengan skrip shell Linux yang akan dikonversi, konversi dijalankan dengan:

  %programfiles%\GnuWin32\bin\SED -f  cim.txt linux.scr > windows.bat

Konversi juga bisa dipanggil lewat SendTo atau Drag & Drop memakai file batch berikut:

SET SP=%programfiles%\GnuWin32\bin
%SP%\SED -f %SP%\cim.txt "%~1"> "%~dpn1.bat"

File batch ini mengandaikan skrip SED cim.txt sudah ditaruh di dalam direktori program SED. Ia menerima nama file skrip shell Linux sebagai satu-satunya parameter baris perintah dan menghasilkan file batch dengan nama sama, tetapi berekstensi '.bat', di direktori yang sama. (Manipulasi nama file yang tampak samar "%~dpn1.bat" dijelaskan di bagian berikutnya.) Perlu dicatat: Skrip SED di atas hanya melakukan penggantian dasar yang disebut di atas. Ia TIDAK akan mengubah skrip shell Linux yang canggih (seperti yang disajikan di situs Fred Weinhaus) menjadi file batch yang setara!

Penanganan nama file di file batch

Seperti telah disebut di atas, IM sangat berguna saat menerapkan urutan langkah pemrosesan yang baku pada sebuah file gambar. Dalam hal itu, nama file akan diteruskan ke skrip sebagai parameter baris perintah, entah lewat Drag & Drop atau lewat SendTo. Dengan teknik ini, nama file yang diserahkan ke file batch DOS berupa nama file berkualifikasi penuh, yakni mencakup nama drive dan path direktorinya. Anda bisa mengujinya dengan menjatuhkan sebuah file ke file batch berikut:

ECHO Filename: %1
PAUSE

Karena ada pernyataan PAUSE, kotak DOS akan tetap terbuka sampai pengguna menekan tombol, sehingga hasilnya bisa Anda periksa. Cobalah contoh di atas dengan nama file yang mengandung spasi dan Anda akan melihat bahwa nama file itu diapit tanda kutip ganda. Perlu dicatat bahwa di sini dan pada semua contoh berikutnya kami mengandaikan setiap file jaringan sudah diberi huruf drive. Dalam praktiknya, saya belum pernah melihat yang lain di jaringan komersial lokal. Saat bekerja dengan file batch, sebaiknya jangan mencoba menangani nama UNC: batch Anda mungkin saja jalan, tetapi ia akan mendatangkan banyak kerepotan yang tak perlu. Saat nama file ini dipakai dalam baris perintah Convert, perilaku tadi bisa menimbulkan masalah. Mari kita lakukan konversi sederhana dari format apa pun ke JPEG. Kode paling dasarnya adalah:

magick %1 %1.jpg
PAUSE

Ini akan menghasilkan file JPEG (dengan kualitas dan resolusi standar) di direktori yang sama, dengan tambahan ekstensi ".jpg" di belakangnya. Kode di atas bekerja pada nama file apa pun, mengandung spasi maupun tidak. Jika Anda ingin membuang ekstensi aslinya, urusannya jadi sedikit lebih rumit:

magick %1 "%~dpn1.jpg"
PAUSE

File batch di atas memanipulasi nama file memakai operator ~: %~1 mengembangkan %1 dengan membuang tanda kutip (") yang mengapitnya
%~f1 mengembangkan %1 menjadi nama path berkualifikasi penuh
%~d1 mengembangkan %1 menjadi huruf drive saja
%~p1 mengembangkan %1 menjadi path saja
%~n1 mengembangkan %1 menjadi nama file saja
%~x1 mengembangkan %1 menjadi ekstensi file saja
Pengubah ini bisa digabungkan, sehingga "%~dpn1" berarti "drive + path + nama tanpa ekstensi dan tanpa tanda kutip pengapit". Karena itu nama tersebut harus kita apit dengan tanda kutip ganda, supaya kodenya juga bekerja untuk nama file yang mengandung spasi. (Kalaupun tidak mengandung spasi, tanda kutip itu tidak merugikan.) Pernyataan PAUSE hanya untuk keperluan pengujian dan bisa dibuang pada file batch final. Jika Anda ingin sekadar menguji kode tanpa benar-benar memanggil IM, tulislah:
ECHO magick %1 "%~dpn1.jpg"
PAUSE

yang hanya akan menampilkan hasil manipulasi untai Anda.

Memproses beberapa file secara batch

Loop FOR

Perintah FOR DOS bisa dipakai untuk memproses serangkaian file dengan cara yang mirip seperti di UNIX. Untuk menskalakan semua file JPEG di direktori saat ini sebesar 50%, baris berikut bisa diketikkan di kotak DOS:

  FOR %a in (*.jpg) DO magick %a -resize 50% small_%a

Perhatikan bahwa tanda persennya tidak digandakan. Namun jika perintah ini ditaruh di sebuah file batch, ia harus diganti dengan

  FOR %%a in (*.jpg) DO magick %%a -resize 50%% small_%%a

Lagi-lagi, memanggil operasi massal ini lewat Drag & Drop atau SendTo memang praktis, dengan meneruskan nama file berkualifikasi penuh (atau nama direktori) ke file batch DOS yang mungkin berada di direktori lain (misalnya shell:sendto). Dalam hal ini, sebaiknya direktori file itu kita jadikan direktori saat ini pada langkah pertama:

  %~d1
  CD "%~p1"
  MD small
  FOR %%a in (*.jpg) DO magick %%a -resize 50%% small\%%a
  PAUSE

Di file batch ini kita

  • mengganti drive dengan menyebutkan nama drive (d: atau apa pun)
  • menjadikan direktori file itu sebagai direktori saat ini
  • membuat subdirektori bernama "small"
  • menskalakan semua file JPEG sebesar 50% dan menaruh versi yang sudah diperkecil itu di subdirektori baru.

Perlu dicatat: Karena tilde (~) membebaskan nama file yang diteruskan sebagai parameter baris perintah dari tanda kutip pengapit yang mungkin ada, biasanya hasil manipulasi semacam itu harus kita apit lagi dengan tanda kutip. Karena itu pada contoh di atas kita menulis CD "%~p1". Untuk perintah CD, tanda kutip pengapit itu sebenarnya bisa saja dihilangkan, sebab perintah ini hanya menerima satu parameter dan karena itu bisa menangani spasi tanpa tanda kutip pengapit. Menjadikan direktori file sebagai direktori saat ini pada langkah pertama memang membuat langkah lanjutannya sedikit lebih mudah, karena rujukan ke nama file jadi lebih ringkas dan lebih pendek. Tetapi kita juga bisa saja menulis:

  MD "%~dp1small"
  FOR %%a in ("%~dp1*.jpg") DO magick "%%a" -resize 50%% "%%~dpasmall\%%~nxa"
  PAUSE

Ini mungkin membuat kodenya sedikit lebih pendek, tetapi juga jauh lebih rumit. Perhatikan bahwa pengubah nama file juga bekerja pada variabel loop For %%a. Catatan kedua: Backslash terakhir adalah bagian dari nama path. Karena itu ia harus ditulis "%~dp1small" dan bukan "%~dp1\small", yang tidak membuat kodenya lebih mudah dibaca, terutama pada kasus "%%~dpasmall\%%~nxa". Ada beberapa kekurangan dan jebakan pada pernyataan FOR. Salah satunya, pada dasarnya hanya satu perintah tunggal yang bisa dijalankan setelah DO. Namun serangkaian perintah DOS bisa dikelompokkan dalam tanda kurung "(", ")" sehingga urutan perintah sederhana tetap bisa dijalankan:

  @ECHO OFF
  :: Lighten darker areas of all images in a directory
  %~d1
  CD "%~p1"
  FOR %%a in (*.jpg) DO (
    ECHO Processing file: "%%~nxa"
    magick %%a -blur 30 -negate %%a.miff
    magick composite %%a.miff %%a -compose overlay "%%~dpn1_light"%%~xa
    DEL %%a.miff
  )
  PAUSE

File batch ini akan memproses semua gambar yang ditemukan di direktori yang diteruskan sebagai argumen baris perintah. Mula-mula ia mengaburkan gambar asli dan menegasikannya, lalu menyimpan hasil antaranya di sebuah file dengan tambahan ekstensi ".miff". Lalu ia menumpangkan gambar asli di atas versi yang telah diubah itu, sehingga bagian yang lebih gelap pada gambar asli menjadi lebih terang. Terakhir gambar antara itu dihapus. Perhatikan bahwa pada contoh di atas penekanannya harus diberikan pada urutan perintah sederhana: lompatan GOTO tidak bisa dipakai di dalam blok itu. Jika Anda memerlukan perilaku semacam itu, file batch lain harus dipanggil oleh loop FOR:

  %~d1
  CD %~p1
  MD small
  FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa"

Di sini "process.bat" adalah file batch yang melakukan pekerjaan sesungguhnya dan berada di direktori yang sama dengan file batch pemanggil. Parameter baris perintah 0 ("%0") adalah nama file batch itu sendiri, sehingga "%~dp0process" memanggil file batch process.bat di direktori yang sama. Pernyataan FOR hanya menyediakan nama file, yang diubah menjadi nama file berkualifikasi penuh lewat "%~fa". Pada kasus ini, kode di file batch process.bat sama dengan kode yang tadi ditaruh di antara tanda kurung pada contoh di atas:

  magick %%1 -blur 30 -negate %%1.miff
  magick composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1
  DEL %%1.miff

Namun memakai file batch terpisah menawarkan seluruh kemungkinan (yang terbatas) dari file batch DOS. Pada contoh ini hal itu tidak membuat perbedaan, tetapi manfaat pendekatan tersebut akan kita tunjukkan lebih jauh di bawah. Jika Anda tak ingin repot dengan dua file batch, skripnya bisa dibuat menghasilkan skrip process.bat kedua (memakai ECHO), memanggilnya dari loop utama, lalu menghapusnya setelah pekerjaan selesai:

  ECHO magick %%1 -blur 30 -negate %%1.miff >%~dp0process.bat
  ECHO composite %%1.miff %%1 -compose overlay "%%~dpn1_light"%%~x1 >>%~dp0process.bat
  ECHO DEL %%1.miff >>%~dp0process.bat
  %~d1
  CD %~p1
  MD small
  FOR %%a in (*.jpg) DO CALL "%~dp0process" "%%~fa"
  DEL %~dp0process.bat

Saat memakai perintah ECHO, karakter khusus DOS harus di-escape sekali lagi, terutama tanda persen. Dan ya, IM sebenarnya bisa melakukan semua hal di atas dalam satu perintah pemrosesan saja, sehingga gambar antara ".miff" tak diperlukan, tetapi bukan itu inti contoh ini.

Memproses pohon (sub-)direktori secara batch

Ada beberapa teknik untuk memproses semua file dalam pohon (sub-)direktori. Pendekatan paling sederhana adalah memakai flag "/R" pada pernyataan FOR supaya ia menelusuri semua file di semua subdirektori di bawah direktori saat ini. Jadi untuk mengonversi semua file TIFF di pohon subdirektori menjadi JPEG cukup ketik:

  FOR /R %%a IN (*.tif) DO imconv "%%~a" "%%~dpna.jpg"

Saat memakai flag "/R", Anda selalu menelusuri seluruh pohon subdirektori, tanpa opsi untuk mengurutkan atau menyaring file. Pada contoh berikut, kita akan menghasilkan cetakan indeks foto untuk semua subdirektori dan menaruhnya di direktori akar. Ini menawarkan cara mudah untuk melakukan pencarian visual atas suatu foto, mirip pratinjau di Windows Explorer, tetapi tanpa keharusan (yang memakan waktu) memindai ulang seluruh pohon direktori pada setiap pencarian. Sebagai permulaan, kita dekati masalah ini dengan bantuan dua file batch, satu menjalankan loop dan satu lagi melakukan pekerjaan sesungguhnya. Cetakan indeksnya berupa file JPEG berkualitas rendah bernama IDX_0001.jpg, IDX_0002.jpg, IDX_0003.jpg dan seterusnya. Mula-mula kita siapkan loopnya:

  DEL IDX_????.JPG
  SET COUNT=0
  FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO CALL c.bat "%%a"
  DEL title.txt

Baris pertama membersihkan sisa hasil pencarian sebelumnya. Di baris kedua, kita mendefinisikan variabel lingkungan COUNT, yang akan dipakai untuk menghasilkan nama file IDX_nnnn.JPG. Di baris ketiga, kita menyusun daftar semua subdirektori lewat DIR /S /B /AD, mengambil direktori yang memuat kata "Porsche" (tanpa membedakan huruf besar-kecil berkat opsi /I) lalu mengurutkan daftar tersaring itu. Pengurutan memastikan urutan numerik file IDX sejalan dengan urutan alfabetis nama path direktorinya. Opsi "delims=" mencegah perilaku standar yang memotong baris setelah spasi pertama. Saat memanggil file batch C.BAT, nama path kita apit tanda kutip supaya spasi diperlakukan dengan benar. Di baris terakhir, kita menghapus file sementara yang dibuat file batch C.BAT. Sekarang kita masuk ke pekerjaan sesungguhnya:

  CHCP 1252
  DIR %1\*.jpg>nul || GOTO :EOF

  :: Generate IDX filename
  SET /A COUNT+=1
  SET TFILE=000%COUNT%
  SET TFILE=IDX_%TFILE:~-4%.jpg

  :: Generate title without bracketing quotes
  ECHO %~1>temp.txt
  "C:\Program Files\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8 temp.txt>title.txt

  montage -geometry 210x140+0+5 -tile 6x -title @title.txt %1\*.jpg -quality 30%% %TFILE%
  jhead -cl %1 %TFILE%

Di baris pertama kita mengalihkan codepage ke Latin Eropa Barat (ISO-8859-1). Di baris kedua, kita memeriksa apakah direktori itu benar-benar memuat foto dan melewati sisa batch bila tidak. (Menjalankan sisa batch sebenarnya tidak merugikan, sebab magick montage tak akan menghasilkan keluaran apa pun, tetapi penomoran file IDX jadi tak lagi berurutan.) Sejak Windows XP ada label sasaran GoTo khusus :EOF yang memungkinkan penghentian eksekusi tanpa mendefinisikan label yang memadai. Kita lalu menghasilkan nama file "TFILE" bagi file indeks dengan menaikkan "COUNT", menambahkan beberapa nol di depan dan mengambil 4 karakter terakhir lewat %TFILE:~-4%, lalu merangkainya menjadi nama file berbentuk "IDX_nnnn.jpg". Penggunaan pernyataan SET /A untuk melakukan perhitungan dijelaskan di Perhitungan memakai SET nanti. Pada baris berikutnya kita membebaskan nama path "PNAME" dari tanda kutip dan menyimpan hasilnya di file antara 'temp.txt', yang ditranskode ke Unicode (UTF-8) dengan bantuan "Icon.exe" (lihat "Pengodean karakter"). Untai Unicode yang tersimpan di 'title.txt' lalu dibaca oleh Montage milik IM. Ini memastikan untai itu diperlakukan secara harfiah, sehingga backslash pada nama path Windows tak perlu di-escape. Montage lalu menggabungkan foto-foto itu dalam baris berisi enam (-tile 6x) dan memberinya judul berupa nama path. Cetakan indeks yang dihasilkan berukuran lebar 1260 piksel dan disimpan dengan kualitas JPG 30% demi menekan kebutuhan penyimpanan. Di baris terakhir, kita memakai program JHEAD untuk menuliskan nama path ke dalam komentar JPEG. Ini membuka kemungkinan menyaring cetakan indeks di dalam Windows Explorer dengan mencari substring tertentu dari nama file pada teks di dalam file. Kedua file batch itu bisa kita gabungkan, dengan menaruh kode "batch pekerja" ke dalam loop FOR:

  SETLOCAL EnableDelayedExpansion
  SET ICONV="%PROGRAMFILES%\Gnuwin32\bin\iconv.exe" -f ISO-8859-1 -t UTF-8
  CHCP 1252
  DEL IDX_????.JPG
  SET COUNT=0
  FOR /F "delims=" %%a in ('DIR /S /B /AD ^|FIND /I "Porsche" ^|SORT') DO (
    DIR "%%a\*.jpg">nul
    IF !ERRORLEVEL!==0 (
      SET /A COUNT+=1
      SET TFILE=000!COUNT!
      SET TFILE=IDX_!TFILE:~-4!.jpg
      ECHO %%a >temp.txt
      %ICONV% temp.txt>title.txt
      montage  -geometry 210x140+0+5 -tile 6x -title @title.txt "%%a\*.jpg" -quality 30%% !TFILE!
      jhead -cl %%a !TFILE!
    )
  )
  DEL temp.txt
  DEL title.txt

Pada dasarnya, dua modifikasi harus diterapkan pada kode awal:

  • Kita harus mengaktifkan delayed expansion dan merujuk variabel lingkungan yang dipakai di dalam loop FOR dengan mengapitnya memakai tanda seru alih-alih tanda persen.
  • Kita harus menghindari pernyataan GOTO yang akan me-reset prosesor perintah.

Secara default, variabel lingkungan di dalam loop FOR tidak dievaluasi saat runtime. Sebagai gantinya, kodenya dipraproses memakai daftar yang diberikan di dalam tanda kurung. Karena itu rujukan ke %COUNT% di dalam loop FOR selalu mengembalikan nilai yang sama. Agar evaluasi variabel lingkungan saat runtime bisa aktif, delayed expansion harus dinyalakan. Ini bisa dilakukan saat memanggil prosesor perintah lewat cmd /V:on atau dinyalakan secara umum di registry, memakai file REG berikut:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"DelayedExpansion"="1"

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"DelayedExpansion"="1"

Namun versi yang antigagal adalah menyetel opsi ini di dalam batch itu sendiri memakai SETLOCAL EnableDelayedExpansion, yang sekaligus membatasi setiap perubahan variabel lingkungan pada versi prosesor perintah saat itu, yang mungkin memang diinginkan. Rujukan ke nilai runtime variabel lingkungan di dalam loop kini harus memakai tanda seru alih-alih tanda persen. Penggunaan pernyataan GOTO di dalam loop FOR berpotensi menjadi sumber error yang sangat halus dan karena itu sebaiknya dihindari. Namun pada batch kita, lompatan itu dengan mudah bisa ditukar dengan pernyataan IF yang mengapit blok kode berisi kode montage.

Memproses sejumlah file sembarang secara batch

Di file batch DOS, hanya sembilan parameter baris perintah yang bisa dialamati langsung lewat %1 sampai %9. Pada Windows versi lama, batas ini hanya bisa disiasati dengan perintah SHIFT, yang menggeser parameter baris perintah secara melingkar. Pada versi yang lebih baru, parameter baris perintah bisa ditangani dalam sebuah loop For:

  FOR %%i in (%*) DO ...

Ini memungkinkan kita mem-Montage sejumlah gambar sembarang yang diteruskan lewat Drag & Drop:

  @ECHO OFF
  SETLOCAL EnableDelayedExpansion
  %~d1
  CD "%~p1"
  DEL Files.txt   2>nul:
  DEL FSorted.txt 2>nul:
  FOR %%I in (%*) DO ECHO %%~nxI>>files.txt
  FOR /F "delims=" %%A in ('TYPE files.txt ^| Sort') Do (
  ECHO %%A>>fsorted.txt
  )
  SET MONTAGE=montage -tile 3x
  FOR /F "delims=" %%A in (FSorted.txt) Do (
  SET MONTAGE=!MONTAGE! %%A
  )
  SET MONTAGE=%MONTAGE% result%~x1
  %MONTAGE%
  DEL Files.txt
  DEL FSorted.txt

Kode di atas mengandaikan file yang diserahkan sebagai parameter baris perintah berada di direktori yang sama dan harus di-montage menurut urutan alfanumerik nama filenya. Ini misalnya masuk akal untuk indeks foto digital, yang dengan begitu terurut menurut waktu pemotretannya. Mula-mula kita jadikan direktori file itu sebagai direktori saat ini, yang membuat kode selanjutnya jauh lebih sederhana. Lalu kita buang nama filenya ke files.txt. Sekalipun file itu dipilih dalam urutan alfabetis, kita tak bisa mengandalkan urutan tersebut bertahan saat nama file diserahkan ke skrip. Karena itu kita mengurutkan file pada langkah kerja kedua, lalu membuangnya ke fsorted.txt. Berdasar file tersebut, kita lalu menyusun baris perintah Montage di loop For berikutnya. File keluaran Montage memakai ekstensi yang sama dengan file masukan pertama (%~x1). (Dengan andaian semua file berekstensi sama.) Perhatikan bahwa perintah Montage terakhir dipanggil hanya dengan mengevaluasi variabel lingkungannya, yakni %MONTAGE%. Seperti telah disebut di , menyerahkan file dalam jumlah besar dengan nama (lengkap) yang panjang bisa membuat Anda kesulitan di Windows XP, karena daftar parameter ShellExecute dibatasi 2048 karakter. Error ini tak bisa ditangani file batch, sebab ia terjadi sebelum kendali diserahkan ke file batch. Satu solusi berbasis skrip adalah memproses semua file gambar di direktori itu ketika hanya satu file yang diserahkan ke batch:

 %~d1 & IF EXIST %1\* (CD %1) ELSE CD %~p1
 IF "%2"=="" (
 SET PATTERN=*.jpg
 ) ELSE (
 SET PATTERN=%*
 )
 FOR %%v IN (%PATTERN%) DO (...)

Di baris pertama kita memeriksa apakah parameter baris perintah kedua ada. Jika ya, semua parameter baris perintah (%*) diproses. Jika hanya satu file yang diserahkan ke skrip, polanya disetel ke semua file JPEG. Pencocokan pola sederhana ini menuntut kita berpindah ke drive saat ini (lewat %~d1) dan ke direktori saat ini, yakni

  • CD %1 bila nama direktori yang diserahkan ke skrip
  • CD %p1 bila nama file yang diserahkan ke skrip.

Mendapatkan informasi dari ImageMagick

Memakai ulang keluaran perintah IM

Pada Windows versi terkini, pernyataan FOR menjadi jauh lebih ampuh, lihat DOS "For" Command Help. Dengan opsi "/F", masukan bagi variabel substitusi bisa dibaca dari sebuah file, sebuah untai, atau dari keluaran perintah DOS lain maupun program lain. Yang terakhir itu sangat berguna dengan IM. Untuk mendapat gambaran kasar tentang apa sebenarnya metode overlay IM itu, file batch berikut bisa dipakai:

  @ECHO OFF
  :: compose two gradients using all compose methods available
  ::
  magick -size 80x80 -flip gradient: compose_src.png
  magick compose_src.png -rotate 90 compose_dst.png
  FOR /F %%A in ('magick -list compose') DO ^
     magick composite compose_src.png compose_dst.png -compose %%A compose_%%A.png

[IM Output]
Src | [IM Output]
Dst | | [IM Output]
Multiply | [IM Output]
Screen | [IM Output]
Overlay

Skrip ini mengomposisikan dua gambar gradien memakai setiap metode komposisi alpha yang tersedia, sehingga Anda bisa melihat bagaimana operator memengaruhi warna gambar. Hanya sebagian gambar yang dihasilkannya yang ditampilkan di atas. Ini mirip dengan gambar yang dibuat untuk Tabel komposisi, sehingga Anda bisa melihat bagaimana operator memengaruhi warna gambar. Karena baris di atas diandaikan berada dalam sebuah file batch, tanda persennya harus digandakan. Skrip di atas mula-mula membuat dua gambar grayscale ortogonal (bersudut siku-siku) dengan gradien yang mencakup seluruh rentang grayscale. Perintah IM Convert -list compose akan memberi kita daftar opsi yang mungkin, masing-masing pada satu baris keluaran. Perhatikan bahwa kita harus memakai tanda kutip tunggal saat merujuk sebuah perintah di dalam tanda kurung. Dengan opsi "/F", perintah FOR lalu memproses tiap baris keluaran itu dan menyerahkannya ke perintah yang dieksekusi oleh DO. Akibatnya, dua gambar gradien tadi ditumpangkan dengan semua metode overlay yang dikenal IM. File keluarannya dinamai sesuai metode overlay-nya. Pada contoh berikutnya, kita menggambarkan ruang warna yang disediakan IM. Kita memakai teknik gradien yang sama seperti di atas untuk menghasilkan permukaan sebuah kubus yang direntangkan oleh tiga koordinat ruang warna:

magick -size 256x256 gradient: gy.miff
magick gy.miff -rotate 90 gx.miff
magick -size 256x256 xc:black black.miff

::R + G top left
magick gy.miff gx.miff -flop black.miff -set colorspace %1 -combine ^
        -resize 260x300! -background none -shear 0x-30 ^
        -virtual-pixel Transparent RG.miff

:: R + B top right
magick gy.miff  black.miff gx.miff -set colorspace %1 -combine ^
        -resize 260x300! -background none -shear 0x30 RB.miff

:: G + B bottom
magick black.miff gx.miff gy.miff -set colorspace %1 -combine ^
        -resize  260x300! -background none -shear 0x30 -rotate 120 ^
        -crop 520x300+0+75 GB.miff

magick -set colorspace %1 RG.miff RB.miff +append top.miff
magick -set colorspace %1 -size 520x150 xc:Transparent w.miff
magick top.miff w.miff -append topx.miff

composite -geometry +0+299 GB.miff  topx.miff colorspace_%1.png
DEL *.miff

[IM Output]
colorspace RGB | [IM Output]
colorspace sRGB
Contoh serupa dengan yang di atas memakai skrip shell UNIX diberikan di Kubus isometrik memakai shear.

File batch ini menerima ruang warna sebagai parameter baris perintah "%1". Ia lalu menghasilkan tiga sisi kubus, lalu men-shear dan memasangnya sehingga kita mendapat tampilan isometrik, dengan titik (0,0,0) berada di pusat sebuah heksagon. Gambar akhirnya dinamai sesuai ruang warnanya (yakni "%1") dan disimpan sebagai PNG. Sekarang kita ingin memanggil file batch ini (disimpan sebagai "cspace.bat") dari file batch lain yang menyediakan nama-nama ruang warna:

  FOR /F %%A in ('magick -list colorspace') DO CALL cspace %%A

Keluaran opsi -list juga bisa kita saring dengan mem-pipe-nya di DOS:

  magick -list colorspace | FIND "RGB" >>clist.txt
  FOR /F %%A in (clist.txt) DO CALL cspace %%A
  DEL clist.txt

Pada contoh ini, kita menyaring baris keluaran yang memuat "RGB" dan menuliskannya ke file clist.txt. File ini lalu dipakai sebagai masukan bagi perintah FOR /F. Ini juga bisa dilakukan sekali jalan tanpa file sementara:

  FOR /F %%A in ('magick -list colorspace ^| FIND "RGB"') DO CALL cspace %%A

Dalam hal ini, simbol pipe "|" harus di-escape, sebab ia tidak diapit tanda kutip ganda (hanya oleh tanda kutip tunggal yang dibutuhkan pernyataan FOR) dan (setidaknya pada baris perintah di atas) tidak dimaksudkan dalam makna biasanya.

Memproses keluaran satu baris

Teknik ini juga bisa dimanfaatkan pada keluaran satu baris. Kita misalnya bisa menerapkan koreksi gamma otomatis yang kira-kira menyetel kecerlangan rata-rata sebuah foto ke tengah rentang kuantum (yakni 127 untuk kedalaman warna 8 bit) dengan teknik yang dijelaskan di situs Fred Weinhaus:

  FOR /F %%a in ('identify -format "%%[fx:log(mean)/log(0.5)]" %1') DO ^
  magick %1 -gamma %%a "%~dpn1"_c.%~x1

File batch ini menerima nama file berkualifikasi penuh sebagai parameter baris perintah "%1", kemungkinan besar lewat Drag & Drop atau SendTo. Keluaran perintah Identify milik IM lalu memberi kita nilai gamma, yang akan menyetel kecerlangan rata-rata gambar ke tengah rentang dinamisnya. Nilai ini dihitung memakai ekspresi format FX. Keluaran satu baris dari perintah Identify disimpan ke variabel "%%a", lalu diteruskan ke perintah Convert sebagai argumen bagi operator Gamma. PerintahFOR tampaknya cukup peka soal lanjutan baris: jika Anda memakainya, pastikan baris berikutnya tidak diawali spasi.
Metode koreksi gamma otomatis ini kini sudah tertanam di IM lewat "-auto-gamma", dan ditambahkan pada IM v6.5.5-1. Tetapi ia memperlihatkan teknik memakai ulang keluaran perintah untuk dipakai pada argumen perintah berikutnya.
--- ---
Dengan teknik FOR yang sama, kita bisa membaca informasi EXIF yang tertanam di sebuah foto dan menuliskannya ke sudut kiri atas gambar:
  FOR /F "tokens=1,2" %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize 18 -fill white -gravity northwest ^
    -annotate +0+0 "%%i %%j" "%~dpn1"_dated%~x1

| Foto biasanya disimpan memakai format JPEG. Membaca dan menyimpan ulang gambar JPEG menyebabkan sedikit penurunan mutu gambar akibatkompresi lossy JPEG sehingga menyimpannya kembali ke JPEG tidak dianjurkan.
Pada file batch di atas, nama file foto disuplai sebagai satu-satunya parameter baris perintah, yang dirujuk sebagai "%1". Perintah Identify membaca tanggal dan waktu pengambilan foto dari informasi EXIF di dalam file JPEG. Perintah FOR lalu menyerahkan keluaran itu ke Convert yang menganotasi foto tersebut di sudut kiri atas. Informasi tanggal dan waktu EXIF diformat sebagai "yyyy:mm:dd hh:mm:ss", misalnya "2006:12:26 00:22:38". Jadi tanggal dan waktu dipisahkan oleh karakter spasi. Secara default, pernyataan FOR hanya akan menemukan token ("kata") pertama pada tiap baris, dengan karakter tab dan spasi sebagai pembatas standar. Jadi pada contoh di atas, pemrosesan standar hanya akan mengembalikan tanggalnya, bukan waktunya. Dengan opsi "tokens=1,2" kita menyatakan minat pada kedua token, yang dinamai berurutan, yakni "%x, %y". Namun format tanggal yang agak tak lazim itu bisa kita ubah dengan kode berikut:

  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize 18 -fill white -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

Kita kini mendefinisikan titik dua (':') sebagai pembatas tambahan, sehingga tanggal terpecah menjadi tiga token "%i", "%j", "%k". Pembatas berikutnya yang ditemukan adalah karakter spasi yang memisahkan tanggal dan waktu. Dengan tanda bintang ("*") kita meminta sisa baris disimpan di token keempat "%l". Kini tanggal bisa kita format sesuka hati. Kita memilih notasi Anglo-Amerika "mm/dd/yyyy" seperti pada contoh di atas.

Menetapkan beberapa nilai dari satu perintah

Satu teknik untuk menetapkan beberapa nilai dari satu perintah ImageMagick adalah membuat perintah itu memformat datanya, sehingga beberapa variabel bisa ditetapkan sekaligus.

  FOR /F %%L IN ('identify -format "Width=%%w\nHeight=%%h" %1') DO set %%L

Ini menghasilkan penetapan variabel DOS 'Width' dan 'Height' sekaligus dari satu pemanggilan perintah ImageMagick.

Melakukan perhitungan

Penafsir perintah DOS lemah dalam urusan perhitungan. Ia bisa dipakai untuk aritmetika bilangan bulat sederhana. Tetapi untuk matematika floating point yang lebih rumit, tersedia ekspresi format FX milik IM, atau program kalkulator DOS pihak ketiga.

Menggunakan ekspresi FX milik IM

Ekspresi format FX milik IM bisa dipakai untuk matematika titik-mengambang dan bisa menyisipkan hasil hitungan itu ke untai terformat yang lebih besar, seperti diperagakan di atas pada contoh pertama bagian Memproses keluaran satu baris. Dengan perintah SET, hasilnya bisa disimpan dalam variabel lingkungan dan dipakai kemudian di file batch. Sebagai contoh sederhana, kita mungkin ingin menyesuaikan ukuran font untai tanggal-waktu pada contoh di atas dengan dimensi fotonya:

  FOR /F %%i IN ('identify -format "%%[fx:min(w,h)*0.05]" %1') DO SET psize=%%i

  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize %psize% -fill white -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

Di baris pertama kita mengevaluasi dimensi foto yang lebih kecil lewat "%[fx:min(w,h)]", mengambil 5% dari nilai itu dan menyimpannya di variabel lingkungan PSIZE. Nilai ini dirujuk pada pernyataan berikutnya (%psize%) untuk menyetel ukuran font informasi tanggal-waktu. Dan di sini kita menghitung sudut acak berupa bilangan bulat antara -15° dan +15° untuk membuat thumbnail yang diputar.

  FOR /F %%x IN ('magick null: -format "%%[fx:int(rand()*31)-15]" info:') DO SET angle=%%x
  magick %1 -thumbnail x90 -alpha set ^
            -background none -rotate %angle%   "%~dpn1"_rotated.png

Ekspresi FX tidak hanya bisa menghasilkan angka, tetapi juga beberapa angka sekaligus yang tertanam dalam untai yang lebih besar. Pada Border dengan sudut membulat, misalnya, ia dipakai untuk langsung menghasilkan untai draw yang rumit berdasar informasi lebar dan tinggi gambar. Fitur tambahan ini, ditambah lepasnya ketergantungan lebih lanjut pada program eksternal lain, menjadikan metode ini pilihan yang lebih baik untuk melakukan perhitungan di skrip batch Anda.

Menggunakan perintah SET

Perintah SET bisa melakukan sedikit matematika bilangan bulat dan manipulasi untai dasar bila opsi "/A" dipakai. Pada contoh berikut, kita menghitung secara kasar lebar untai tanggal-waktu memakai perintah SET:

  :: Determine the font height
  FOR /F %%i IN ('identify -format "%%[fx:min(w,h)*0.05]" %1') DO SET psize=%%i

  :: The width of the date-time string is roughly 9 times its height
  SET /A pwidth=%psize% * 9

  :: Calculate the average brightness in this section
  :: and choose the text color correspondingly
  FOR /F %%i IN ('identify -format "%%[fx:mean]" -crop %pwidth%x%psize%+0+0 %1') DO SET mean=%%i
  IF %mean% LEQ 0.5 (SET fcolor=white) ELSE SET fcolor=black

  :: Annotate the photograph
  FOR /F "tokens=1,2,3,* delims=: " %%i IN ('identify -format "%%[EXIF:DateTime]" %1') DO ^
  magick %1 -pointsize %psize% -fill %fcolor% -gravity northwest ^
    -annotate +0+0 "%%j/%%k/%%i %%l" "%~dpn1"_dated%~x1

File batch contoh ini memilih warna untai tanggal-waktu sesuai kecerlangan rata-rata (%mean%) di area tempat untai itu akan ditaruh. Jika intensitas warna rata-ratanya kurang dari 50%, untainya akan putih, kalau tidak hitam. Contoh ini juga memakai pernyataan IF. Perhatikan bahwa bagian ELSE harus ditaruh pada baris yang sama dan perintah pertamanya harus diapit tanda kurung.

Menggunakan kalkulator eksternal lain

Sebagai alternatif, Anda bisa memakai program DOS yang menyediakan matematika titik-mengambang, seperti EVAL. Jika file ini ditaruh di direktori program IM atau di direktori sistem Windows, perhitungan titik-mengambang bisa dilakukan di jendela shell DOS mana pun. Dengan memakai program EVAL, perintah FOR, dan variabel lingkungan, contoh kubus warna di atas bisa kita buat lebih luwes dan berbagai perhitungannya lebih transparan:

  magick -size 256x256 gradient: gy.gif
  magick gy.gif -rotate 90 gx.gif
  magick -size 256x256 xc:black black.gif

  :: Set the dimension of the color cube / hexagon and calculate the various lengths
  SET l1=512
  FOR /F %%i IN ('EVAL "round(cos(degree*30)*%l1%)"') DO SET l2=%%i
  FOR /F %%i IN ('EVAL "2*%l2%"') DO SET l3=%%i
  FOR /F %%i IN ('EVAL "round((1+sin(degree*30))*%l1%/2)"') DO SET l4=%%i
  FOR /F %%i IN ('EVAL "round(%l1%/4)"') DO SET l5=%%i

  magick gy.gif gx.gif -flop black.gif -set colorspace %1 -combine ^
          -resize %l2%x%l1%! -background none -shear 0x-30 ^
          -virtual-pixel Transparent RG.miff

  magick gy.gif  black.gif gx.gif -set colorspace %1 -combine ^
          -resize %l2%x%l1%! -background none -shear 0x30 RB.miff

  magick black.gif gx.gif gy.gif -set colorspace %1 -combine ^
          -resize  %l2%x%l1%! -background none -shear 0x30 -rotate 120 ^
          -crop %l3%x%l1%+0+%l5% GB.miff

  magick -set colorspace %1 RG.miff RB.miff +append top.miff
  magick -set colorspace %1 -size %l3%x%l4% xc:Transparent w.miff
  magick top.miff w.miff -append topx.miff

  magick composite -geometry +0+%l1% GB.miff  topx.miff colorspace_%1.png
  DEL *.miff
  DEL *.gif

Menyunting, men-debug, dan menguji error saat runtime

Pada prinsipnya, file batch DOS bisa ditulis di editor mana pun, bahkan dengan Notepad bawaan Windows. Namun sebaiknya Anda memakai editor yang punya penyorotan sintaksis untuk file batch DOS. Menurut saya pribadi Notepad++ adalah pilihan yang tepat, tetapi membicarakan editor cenderung membuat orang berang. Jadi: ya, editor lain apa pun juga bisa. Sepengetahuan saya, tak ada IDE (integrated development environment) file batch yang gratis di pasaran. Orang mungkin mengira hal semacam ini semestinya sudah hadir bersama sistem operasinya, tetapi kenyataannya tak pernah begitu. Sejauh ini saya menulis semua file batch saya dengan Notepad++, tetapi bagi yang menulis file batch secara rutin, IDE batch Running Steps mungkin bisa membantu. Ia shareware dan harganya sekitar $80. Penjelasan menyeluruh tentang perintah DOS bisa ditemukan di http://www.computerhope.com/msdos.htm. Seperti bahasa batch DOS itu sendiri, men-debug file batch adalah urusan yang cukup ganjil. Sebagai permulaan saya akan menguji file batch mana pun di kotak DOS. Saat menguji Drag & Drop atau SendTo, dianjurkan mengakhiri file batch dengan pernyataan PAUSE supaya kotak DOS tetap terbuka setelah pekerjaan batch selesai. Soal pesan error saat runtime, pendekatan umumnya adalah memeriksa ERRORLEVEL DOS lalu melompat ke pesan error yang sesuai, yang dihasilkan perintah ECHO. Saya mendapati salah satu sumber error yang paling mungkin adalah program Convert tidak ditemukan dengan benar di mesin yang menjalankan skrip. Jadi jika Anda berniat berbagi skrip batch dengan orang lain, pertama-tama periksalah apakah Convert bisa diakses:

  @ECHO OFF
  magick -version 1>nul: 2>nul:
  IF NOT %errorlevel%==0 GOTO NoMagick:
  magick ...
  GOTO :EOF
  ...
  :NoMagick
  ECHO ImageMagick (convert.exe) not found.
  PAUSE

Di baris pertama, kita menanyakan versi ImageMagick, dengan menekan keluaran standar lewat 1>nul: (atau cukup >nul:) dan pesan error apa pun lewat 2>nul:, yakni kita mengalihkan _stdout_ dan _stderr_ ke nul:. Jika pemanggilan Convert milik IM gagal, program sistem Convert yang akan dipanggil, yang tak bisa menangani opsi -version dan akan menyetel variabel ERRORLEVEL. Anda bisa mencoba mencari tahu mengapa Convert tak ditemukan lalu berupaya memperbaiki masalahnya: misalnya dengan memeriksa apakah path program IM merupakan bagian dari variabel lingkungan PATH:

  @ECHO OFF
  PATH | FIND /I "ImageMagick"
  IF NOT %errorlevel%==0 GOTO NoPath:
  ...
  :NoPath
  ...

Jika Find (yang dipanggil dengan opsi /I yang tak membedakan huruf besar-kecil) tak menemukan untai itu, ia menyetel ERRORLEVEL. Dengan pendekatan yang lebih canggih, Anda bisa memeriksa entri Registry sebagai gantinya, tanpa lagi bergantung pada PATH:

  @ECHO OFF
  FOR /F "tokens=1,2,*" %%A in ^
  ('reg  query "HKCM\Software\ImageMagick\Current" ^| FIND "BinPath"') DO ^
  SET MPATH=%%C
  IF [%MPATH%]==[] GOTO NoMagick:
  "MPATH\convert.exe" ...
  ...
  :NoMagick
  ...

Dengan kode ini, kita mengueri kunci Registry IM Current dan mencari entri BinPath. Baris keluaran yang menentukan adalah:LibPath REG_SZ C:\Program Files\ImageMagick"Kata" pada baris teks ini dipisahkan oleh tab (di Windows XP) atau beberapa spasi (Windows Vista). Itulah pembatas standar yang dipakai For /F. "Kata" ketiga (%%C) adalah yang kita cari dan kita simpan di variabel lingkungan MPATH, yang bisa kita rujuk saat memanggil magick nanti di dalam skrip. Sebuah skrip mungkin menuntut versi minimum ImageMagick tertentu sudah terpasang. Misalnya, metode distorsi perspektif pertama kali diimplementasikan pada versi 6.3.5-9 (September 2007). Jadi jika skrip Anda berurusan dengan pelurusan perspektif, ujilah apakah versi IM yang terpasang lebih baru dari itu:

  @ECHO OFF
  SETLOCAL EnableDelayedExpansion
  SET MINVERSION=7.5.3-0
  FOR /F "tokens=1,2,3" %%a in ('magick -version ^|FIND "Version"') DO SET VERSION=%%c
  IF %VERSION% LSS %MINVERSION% GOTO GetNewVersion:
  Goto :EOF
  :GetNewVersion
  ECHO This Script requires et least ImageMagick version %MINVERSION%.
  ECHO Yours is %VERSION%.
  PAUSE
  Goto :EOF

SETLOCAL membatasi setiap perubahan variabel lingkungan pada skrip saat itu saja, sehingga kita tak perlu khawatir akan efek samping. Opsi EnableDelayedExpansion sebenarnya tidak diperlukan di sini, tetapi memakai opsi itu setiap kali memakai SETLOCAL adalah kebiasaan yang baik. Kita lalu menyimpan versi minimum yang dibutuhkan di variabel lingkungan MINVERSION. Di baris ketiga, kita memanggil Convert dengan opsi '-version', mengambil baris pertama keluarannya lewat ^|FIND "Version", mengambil kata ketiga dari baris itu dan menyimpannya di variabel lingkungan VERSION. Di baris keempat kita lalu membandingkan versi ini dengan versi minimum yang dibutuhkan.

Mengoptimalkan waktu eksekusi

Untuk mengukur waktu eksekusi, Anda bisa menampilkan isi variabel lingkungan %TIME% (Catatan penerjemah: naskah asli menulis %TEMP%; skrip di bawah memakai %TIME%). Skrip berikut menguji berbagai cara menghitung kecerlangan rata-rata sebuah file gambar (besar), katakanlah sebuah foto digital:

   IF "%1"=="" GOTO :EOF
   ECHO %TIME%
   Identify -verbose %1 | FIND "mean" & ECHO %TIME%
   copy %1 %TEMP%\*.* & ECHO %TIME%
   Identify -verbose %TEMP%\%1 | FIND "mean" & ECHO %TIME%
   Convert %TEMP%\%1  -format %%[fx:mean] info: & ECHO %TIME%
   Convert %TEMP%\%1 -resize 1x1! -format %%[fx:mean] info: & ECHO %TIME%
   DEL %TEMP%\%1

Gambar diserahkan ke skrip sebagai satu-satunya parameter baris perintah, yang diuji di baris pertama skrip. Selanjutnya, waktu eksekusi berbagai pendekatan diukur dengan menggemakan variabel lingkungan %TIME% sebelum dan sesudah pernyataannya. Ampersand & memungkinkan beberapa perintah DOS ditaruh dalam satu baris dan di sini dipakai sekadar untuk memperpendek ruang yang dibutuhkan kodenya. Jika gambar berada di drive jaringan, pemindahannya ke memori komputer klien bisa memakan bagian besar waktu eksekusi. Karena itu file tersebut disalin ke direktori sementara lokal, yang namanya tersimpan di variabel lingkungan %TEMP%. Ternyata perintah Convert yang sederhana memakan waktu eksekusi sama banyaknya dengan menyaring hasil Identify, tetapi mengubah ukuran gambar menjadi satu piksel lewat -resize 1x1! mempercepat operasinya secara berarti tanpa terlalu mengubah hasilnya. Perhatikan bahwa kita memakai ECHO %TIME% alih-alih TIME /T, karena yang terakhir hanya menampilkan jam dan menit, sedangkan yang pertama memberi perseratus detik. Berbeda dari shell perintah UNIX, tak ada cara langsung untuk mengukur waktu relatif, yakni menetapkan titik acuan, mengeksekusi pernyataan, lalu mengevaluasi waktu yang dibutuhkan. Perhitungan waktu relatif di dalam file batch dipersulit oleh kenyataan bahwa file batch hanya mengizinkan aritmetika bilangan bulat. Detik bisa diambil dengan perintah FOR lalu operator fx milik IM dipakai untuk melakukan pengurangan, dengan memperhitungkan luapan 60 detik

   FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET START=%%c
        ... some command(s)...
        FOR /F "tokens=1,2,* delims=:" %%a in ("%TIME%") DO SET STOP=%%c
   Convert null: -format "%%[fx:(%STOP%-%START%<0.0)?%STOP%-%START%+60.0:%STOP%-%START%]" info:

Namun ini hanya akan bekerja pada Windows yang pemisah desimalnya disetel ke titik desimal, sebab waktunya disediakan menurut locale sedangkan fx melakukan perhitungan menurut skema AS. Berbeda dari VBScript, tak ada cara mengubah locale di dalam file batch (selain mengubahnya untuk seluruh mesin lewat registry). Sebagai alternatif, seluruh waktu bisa dikonversi menjadi perseratus detik, yang bisa dikerjakan dalam aritmetika bilangan bulat, begitu pula perhitungan selisihnya kemudian. Kode dasarnya adalah

   for /f "tokens=1-4 delims=:., " %%a in ("%TIME%") do ^
        set /a  Start100S=1%%a * 360000 + 1%%b * 6000 + 1%%c * 100 + 1%%d - 36610100

Angka "1" yang disisipkan di depan tiap bagian kode waktu yang telah dipecah mencegah bilangan berawalan nol (salah) ditafsirkan sebagai oktal. "Error perhitungan" yang ditimbulkan cara ini dikompensasi kemudian dengan mengurangi 36610100 di akhir. Kode contoh yang lengkap (dan lebih elegan) bisa ditemukan di sini. Pendekatan lain adalah utilitas TimeIt yang ditawarkan Windows 2003 Ressource Kit, yang bisa diunduh di sini. Secara resmi ia hanya mendukung Windows XP.

Panduan pemrograman batch

Ini, secara ringkas, aturan yang perlu diikuti saat memprogram file batch:

  • Mulailah dengan SETLOCAL EnableDelayedExpansion
  • Definisikan sebuah variabel untuk merujuk perkakas Convert milik IM: SET IMCONV="%PROGRAMFILES%\ImageMagick"
  • Saat bekerja dengan beberapa file, kodenya sering jadi lebih sederhana bila direktori yang memuat file itu dijadikan direktori saat ini, yakni
    • berpindah ke drive lewat %~d1
    • berpindah ke direktori lewat CD %~p1
  • Pakailah iconv.exe dari GnuTools untuk mengonversi teks ke UTF-8 dan menyuapkan teks dari sebuah file.
  • Ingatlah bahwa Convert dan Montage menulis keluaran tekstual ke stderr, bukan stdout.
  • Banyak error timbul dari nama file yang mengandung spasi, jadi periksalah tiap batch apakah ia menangani nama file semacam itu dengan benar.
  • Jangan lupa menggandakan setiap tanda persen, misalnya saat menyetel kualitas JPEG.
  • Jangan lupa meng-escape karakter khusus di dalam untai, misalnya "^|".
  • Perhitungan bilangan bulat yang dilakukan SET /A memperlakukan bilangan berawalan nol sebagai oktal, jadi taruhlah "1" di depan tiap bilangan semacam itu.

Rangkuman

Contoh-contoh di atas membuktikan bahwa file batch DOS yang sederhana sangat serbaguna bila dipadukan dengan kemungkinan yang ditawarkan ImageMagick. Nyatanya, hampir semua hal bisa dikerjakan dengan cara (yang kasar) di dalam file batch. Begitu Anda terbiasa berpikir dengan cara aneh yang mengiringi perkembangan bahasa file batch DOS, skripnya bahkan bisa jadi cukup pendek. Meski begitu, beberapa baris kode ini kemungkinan sudah memakan berjam-jam eksperimen yang melelahkan, kecuali Anda benar-benar akrab dengan bahasa file batch. Jika sasaran Anda lebih dari sekadar tugas pemrosesan gambar dasar, memakai bahasa skrip yang lebih canggih mungkin lebih dianjurkan, sebab pengembangan kodenya akan jadi lebih sederhana dan lebih terstruktur.


Visual Basic Script (VBS)

Kemampuan skrip Microsoft Windows Script Host (WSH) lebih canggih daripada bahasa file batch yang sederhana. WSH tidak bergantung pada bahasa tertentu dalam arti ia bisa memakai mesin Active Scripting yang berbeda-beda. Secara default ia menafsirkan dan menjalankan file JScript (Java Script) dan file VBScript (VisualBasic Script) berformat teks biasa. Windows Script Host didistribusikan dan dipasang secara default sejak Windows 98 (meski ia mungkin saja dimatikan di mesin sasaran karena alasan keamanan). WSH mengimplementasikan model objek yang memaparkan sekumpulan antarmuka COM sehingga objek sistem, terutama sistem file, bisa dialamati. Kita tidak akan membahas Windows Script Host secara rinci di sini, karena hal itu sudah dikerjakan di tempat lain (dan mungkin lebih baik), melainkan memberi beberapa contoh praktis tentang cara menangani masalah yang khas. Contohnya diberikan dalam VisualBasic Script, tetapi kode JScript-nya akan sangat mirip, jadi contoh-contoh itu semestinya mudah ditulis ulang dalam JScript bila itu bahasa favorit Anda. Seperti file batch, VBScript bisa ditulis di editor mana pun dan sekali lagi saya menyarankan Notepad++ sebagai pilihan editornya. Seperti pada file batch, Microsoft tidak menawarkan IDE yang dirancang khusus untuk mendukung pengembangan VBScript. Dulu ada Microsoft Script Editor yang disertakan bersama Microsoft Office 2000 sampai 2003, tetapi saya belum pernah mencobanya. Microsoft juga menyediakan Microsoft Script Debugger (yang sangat sederhana), tetapi lagi-lagi pengalaman pribadi saya dengannya tidak banyak. Ada beberapa IDE VBS komersial yang ditawarkan sebagai shareware dengan harga wajar, seperti VbsEdit. Seperti telah disebut di bagian Memasang ImageMagick di Windows, berikut ini kita umumnya tidak akan memakai antarmuka COM+ milik ImageMagick. Perkakas IM seperti Convert, Montage, dan Identify justru akan dijalankan langsung dengan memanggil perintah run milik shell, lengkap dengan semua opsi dan nama file yang dibutuhkan, kurang lebih sama seperti pada file batch. Namun saat menyusun untai perintahnya, kita akan memanfaatkan fitur yang ditawarkan bahasa pemrograman sungguhan.

Contoh dasar: koreksi lensa

Karena penggunaan WSH menimbulkan sejumlah overhead, contoh awal kita tidak terlalu sederhana, supaya keunggulan VBScript dibanding file batch biasa bisa terlihat. Berikut ini kita akan mengoreksi distorsi lensa kamera digital Nikon 995 memakai distorsi barrel milik IM. Parameter koreksinya bergantung pada panjang fokus, yang lebih dulu dicari lewat magick identify. Untuk koreksi lensa Nikon 995, kita hanya butuh parameter b (yakni a, c = 0), yang bisa dihitung dari panjang fokus f dengan: b = 0.000005142 f ³ - 0.000380839 f ² + 0.009606325 f - 0.075316854 Kebergantungan ini ditemukan lewat basis data lensfun yang mendaftar parameter distorsi barrel untuk lensa tersebut. Jadi inilah VBScript kita:

  SetLocale(1033)          ' US, i.e. decimal point
  const strConv = "IMCONV" ' name of the IM Convert program
  const strAdd = "_pt"    ' string attached to the filename
  '
  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  ' names of the in- and output files
  strFileIn = WScript.Arguments(0)
  Pos = InStrRev(strFileIn,".")
  strFileOut = Left(strFileIn,Pos - 1) & strAdd & Mid(strFileIn, Pos)
  '
  ' evaluation of the focal length and calculation of parameter b
  command = "identify -format ""%[EXIF:FocalLength]"" """ & strFileIn & """"
  Set objExec = wsh.Exec(command)
  strf = objExec.StdOut.Readline
  f = eval(strf)
  b =  0.000005142 * f * f * f -0.000380839 * f * f + 0.009606325 * f  -0.075316854
 '
  Command = strConv & " """ & strFileIn _
    &  """ -virtual-pixel black -filter point -distort Barrel   ""0.0 " _
    & b & " 0.0 "" """ & strFileOut & """"
  wsh.run command,7,true

Di baris pertama kita menyetel locale ke bahasa Inggris AS (1033), yang (di antara hal lain) menyetel pemisah desimal ke titik desimal. Kalau tidak, nilai desimal akan disajikan menurut locale, yakni mungkin dengan koma desimal alih-alih titik desimal, yang akan menimbulkan masalah saat nilai semacam itu diserahkan ke IM. Dua baris setelah definisi konstanta untai adalah overhead standar, karena kita selalu memerlukan objek Shell untuk memulai program IM lewat metode Exec atau Run-nya. Satu-satunya argumen skrip adalah nama file, yang biasanya kita berikan lewat Drag & Drop atau SendTo. Saat menamai file keluaran, kita menambahkan "pt" pada nama file aslinya, persis seperti yang dilakukan PTlens, misalnya _Photo.JPG → Photo_pt.JPG. Nama file disimpan di strFileIn, dan dari sana kita turunkan nama file keluaran strFileOut. Kita lalu menjalankan program Identify milik IM. Hasilnya (yakni bilangan rasional EXIF yang menyatakan panjang fokus) disimpan di strf. Bilangan rasional EXIF diberikan sebagai pembilang / penyebut, misalnya 82 / 10 = 8.2 mm. Karena itu rasional tersebut harus dievaluasi sebelum dipakai dalam rumus yang menghitung parameter b. Pada dua baris terakhir, kita menyusun baris perintah Convert dan mengeksekusi pernyataannya lewat metode Run milik objek Shell. Parameter 7 meminimalkan jendelanya dan TRUE meminta skrip menunggu hasilnya. Skrip di atas menggambarkan strategi umum saat memakai VBScript dengan perkakas baris perintah IM (dan bukan objek COM+). Perkakas itu dipanggil entah

  • lewat perintah Run milik objek Shell, bila tidak ada keluaran tekstual yang diharapkan
  • lewat perintah Exec milik objek Shell bila keluaran tekstual harus dievaluasi, seperti yang biasanya terjadi pada Identify.

VBScript pertama ini tidak melakukan apa pun yang tak bisa dilakukan file batch seperti

   SETLOCAL EnableDelayedExpansion
   FOR /F %%i in ('identify -format "%%[EXIF:FocalLength]" %1') DO SET FL=%%i
   FOR /F %%i IN ('Convert null: -format "%%[fx:0.000005142*(%FL%)^3 - 0.000380839 * (%FL%)^2 + 0.009606325 * %FL% - 0.075316854]" info:') DO SET B=%%i
   Convert %1 -distort barrel "0.0 !B! 0.0" "%~dpn1_pt%~x1"

tetapi kode VBS-nya lebih lugas, lebih mudah dimodifikasi, dan mudah diperluas dalam hal pemeriksaan error dan sejenisnya. Perhatikan bahwa pemenggalan baris pada pernyataan FOR kedua tidak mungkin dilakukan, sehingga kita harus membiarkannya sepanjang itu.

Bekerja dengan beberapa file

Satu keunggulan sejati VBScript dibanding file batch DOS adalah argumen baris perintah dalam jumlah sembarang bisa ditelusuri dengan mudah. Anda misalnya bisa memilih sejumlah file di Windows Explorer dan menggabungkan gambar terpilih itu menjadi cetakan indeks lewat Montage milik IM. Kode dasarnya adalah:

  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  strInputFiles  = ""
  For EACH Arg IN WScript.Arguments
      strInputFiles = strInputFiles & " """ & Arg & """"
  next
 '
  IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg"
  Command = "montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " -quality 80% """ & IndexFile & """"
  wsh.run command, 7, true

Skrip itu mula-mula merangkai nama file yang diserahkan ke skrip lewat Drag & Drop. Ia lalu menurunkan nama file keluaran JPEG di direktori yang sama lewat manipulasi untai sederhana. Terakhir, Montage dipanggil dengan parameter yang sesuai. Untuk skrip yang lebih besar, menyimpan nama file dalam sebuah array memang praktis:

  Dim FName()
  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  NArgs = WScript.Arguments.Count
  Redim FName(NArgs-1)
  FOR i = 0 TO NArgs - 1
    FName(i) = """" & WScript.Arguments(i) & """"
  NEXT

Mula-mula kita mendefinisikan array dinamis lewat Dim FName() lalu mengubah dimensinya lewat Redim FName(NArgs-1). Baris perintah Montage bisa menjadi sangat panjang, karena pada daftar file masukan tiap file disebut dengan nama file berkualifikasi penuh. Panjang maksimumnya bukan 8192 karakter yang biasa, melainkan ditentukan oleh panjang maksimum yang diizinkan bagi pemanggilan fungsi ShellExecute, yang hanya 2048 karakter di Windows XP. Ini bisa menimbulkan masalah bila nama direktorinya sangat panjang. Error yang timbul tak bisa ditangani skrip, sebab error itu terjadi sebelum skrip dieksekusi. Satu solusinya adalah menaruh file di direktori lokal dengan nama yang lebih pendek. Solusi (sebagian) berbasis skrip sama seperti pada file batch: Jika hanya satu nama file yang diberikan, semua gambar di direktori induknya diproses. Untuk memproses semua GIF di dalam sebuah direktori, kita bisa melakukan sesuatu semacam ini:

  Dim fs, folder
  Set fs = CreateObject("Scripting.FileSystemObject")
  If WScript.Arguments.Count <> 1 Then WScript.Quit(1)
  set Folder = fs.getFolder(fs.GetParentFoldername(WScript.Arguments(0)))
  FN=""
  FOR EACH file in folder.files
     If instr(file,"gif") <> 0 THEN FN = FN & File & vbLF
  NEXT
  MsgBox FN

Di sini kita memakai objek FileSystem untuk menentukan nama direktori induk. Namun kecocokan ekstensi filenya diperiksa dengan cara biasa, sebab objek Files hanya menawarkan properti Type. Cukup sering nama file harus diurutkan secara alfabetis, sebab Drag & Drop atau SendTo meneruskannya ke skrip dalam urutan acak. Ini bisa dicapai dengan bubble sort:

  for i = 0 to NArgs - 1
    for j = i + 1 to NArgs - 1
      if FName(i) > FName(j) then
        Temp = FName(i)
        FName(i) = FName(j)
        FName(j) = Temp
      end if
    next
  next

[clip] Penerapan konsep yang diuraikan di atas secara lebih canggih disajikan di sebelah kanan: sekumpulan frame video dipasang menjadi dua "strip film" sejajar dengan bantuan sebuah VBScript dan ImageMagick. Perforasinya memberi petunjuk visual bahwa urutan frame berjalan dari atas ke bawah, yakni kolom demi kolom, berbeda dari pola baca barat yang biasa, kiri-ke-kanan lalu atas-ke-bawah. Seluruh skrip yang mengerjakannya bisa diunduh dari arsip strip.zip. Catatan pinggir: Kode waktu merah di kanan atas tiap frame dihasilkan oleh skrip AVIsynth. Frame-nya diekstrak dengan mengekspornya dari VirtualDub. Dengan kode waktu yang tertanam itu, frame tak harus berjarak waktu sama, yakni bisa dipilih sesuai kebutuhan di Windows Explorer lalu dikirim ke skrip yang ditaruh di direktori SendTo.

Bekerja dengan file teks

Saat bekerja dengan skrip di komputer klien, informasi masukan umumnya disuplai lewat Drag & Drop atau SendTo, yakni pada dasarnya berupa nama file yang akan diproses menurut cara yang telah ditentukan skrip. Informasi tambahan apa pun harus disuplai lewat interaksi pengguna saat runtime atau dalam bentuk file teks. Pada dasarnya, tersedia opsi berikut:

  • Skrip menerima file gambar sebagai masukan, disertai file teks (yang mungkin opsional) yang menyuplai informasi tambahan.
  • Skrip menerima satu file teks sebagai masukan, yang mendaftar gambar yang akan diproses sekaligus informasi tambahan yang dibutuhkan.

Pada kasus pertama, file teks opsional itu sebaiknya ditaruh di direktori yang sama dengan gambarnya, dengan nama yang baku. Skrip lalu bisa menurunkan nama direktori induk dari gambar masukan dan membuka file teks di direktori yang sama bila ada. Contoh pendekatan ini adalah "strip film" yang disebut di atas: di awal skrip kita mungkin akan mendefinisikan urutan frame yang baku, bergantung pada jumlah gambar yang diserahkan ke skrip. Tetapi mungkin ada skenario ketika kita ingin menyimpang dari urutan frame yang baku itu. Karena itu kita bisa menaruh file teks bernama ordering.txt di direktori frame, yang bila ada akan mengendalikan urutan frame-nya:

  strTxtFile="ordering.txt"
  PDir = fs.getParentFolderName(FName(0)) & "\"
  Wsh.CurrentDirectory = PDir

  If fs.FileExists(strTxtFile) then
    Set objFile = fs.OpenTextFile(strTxtFile, 1)
    bCtrlFile = True
    NCols = objFile.ReadLine
    objFile.close
  else
    bCtrlFile = False
  end if

[clip] Penerapan yang berguna dari konsep kedua bisa ditemukan pada pemetaan perspektif sebuah gambar ke bidang sasaran seperti diperagakan di situs Fred Weinhaus. Konsep ini bisa kita pakai untuk "membungkus" gambar yang terdistorsi perspektifnya ke atas versi yang perspektifnya (sebagian besar) benar, seperti diperagakan di sebelah kanan: Di bagian atas, gambar kiri memperlihatkan foto yang diambil di lokasi kecelakaan ringan. Foto kanan diambil pada kunjungan berikutnya ke lokasi itu, dari posisi yang agak tinggi. Di bagian bawah, foto kecelakaan itu (yakni permukaan jalan yang datar) dipetakan ke foto sasaran lewat transformasi perspektif. (Tujuannya adalah memvisualkan sudut orientasi bekas rem samar yang ditinggalkan ban depan kanan mobil hitam itu.) Untuk mengerjakan tugas ini, pengguna harus memilih empat titik di gambar sumber dan titik sasarannya di gambar yang perspektifnya benar. Kita bisa melakukannya secara manual, menentukan koordinat di gambar sumber dan di gambar sasaran dengan memilih titik-titik itu di penampil gambar (seperti IrfanView), mencatat koordinatnya lalu menyuplaikannya ke baris perintah Convert. Pekerjaan melelahkan ini bisa disederhanakan oleh program freeware WinMorph, yang menawarkan antarmuka praktis untuk melakukan persis hal itu: memilih beberapa titik sumber dan titik sasaran yang bersesuaian dari dua gambar. Polyline kuning pada kedua foto menghubungkan empat titik terpilih di masing-masing gambar. Namun algoritma morphing-nya sendiri tidak cocok untuk melakukan koreksi perspektif. (Cara kerja dasar algoritma ini dijelaskan di bagian Distorts pada bagian Usage situs IM. Peragaan kegunaannya untuk morphing bisa ditemukan pada skrip ShapeMorph milik Fred Weinhaus.) WinMorph menyimpan informasinya dalam file teks terstruktur yang memuat (di antara informasi lain) nama file sumber dan sasaran, serta koordinat titik sumber dan titik sasaran. Jadi semua informasi yang dibutuhkan untuk distorsi perspektif IM bisa kita turunkan dari file WinMorph itu. Salinan semua file dan gambar yang terlibat bisa Anda unduh di file wmpr.zip.

Piping

Sejauh ini kita memanggil perkakas baris perintah IM (seperti Convert, Identify, Montage) langsung lewat fungsi Run atau Exec milik objek Shell. Namun jika kita ingin memakai kemampuan piping IM, yakni menyuapi satu perintah dengan keluaran perintah sebelumnya, perkakas baris perintah itu harus dipanggil lewat sebuah lingkungan perintah. Misalnya, jika kita ingin memangkas tepi putih pada cetakan indeks yang dihasilkan skrip di atas, kodenya harus menjadi:

  Dim wsh
  Set wsh = CreateObject("Wscript.Shell")
  '
  strInputFiles  = ""
  For EACH Arg IN WScript.Arguments
      strInputFiles = strInputFiles & " """ & Arg & """"
  next
 '
  IndexFile= Left(WScript.Arguments(1),InStrRev(WScript.Arguments(1),"\")) & "index.jpg"
  Command = "cmd /c montage -geometry 210x140+0+5 -tile 6x " & strInputfiles & " miff:- | magick - -trim """ & IndexFile & """"
  wsh.run command, 7, true

Di sini kita memanggil prosesor perintah cmd dengan opsi /c supaya kotak perintahnya tertutup otomatis setelah selesai. Untuk keperluan debugging, ia juga bisa dipanggil dengan opsi /k, yang membiarkan kotak perintah tetap terbuka sehingga pesan error yang mungkin muncul bisa kita baca.

Menguji dan men-debug VBScript

Pada dasarnya, kita memakai VBScript untuk menyusun daftar argumen bagi perkakas baris perintah IM, yang lalu dijalankan sendiri atau di dalam kotak DOS. Ini berarti pertama-tama Anda harus memastikan bahwa

  • baris perintahnya sendiri melakukan apa yang kita harapkan
  • baris perintahnya disusun dengan benar oleh skripnya.

Jadi sebagai permulaan, ujilah baris perintahnya sendiri di dalam kotak DOS. Saat pertama kali menguji skripnya, jangan jalankan perintah IM, melainkan tampilkan untai teksnya di kotak pesan lewat MsgBox(strCommand), sebab jika baris perintahnya sendiri salah, tak banyak yang bisa dilakukan perkakas debug mana pun. Kotak pesan sederhana itu juga membantu saat men-debug skrip dan saya tak pernah benar-benar merasa perlu debugger yang canggih. Soal pengujian saat runtime, Anda harus memastikan

  • perkakas baris perintah IM bisa diakses dengan benar
  • pengguna sudah memilih apa yang Anda harapkan dia pilih, yakni beberapa file (mungkin dengan tipe tertentu), sebuah direktori, sebuah file teks, dan sebagainya.

Pesan error mudah ditampilkan dengan memakai MsgBox(...).


Informasi lebih lanjut

Sayangnya sejauh diketahui tak ada tutorial lain (selain ini) yang khusus membahas penggunaan perintah ImageMagick di file batch DOS. Halaman web DOS "For" Command Help punya penjelasan yang lebih baik soal penggunaan perintah "FOR". Anda mungkin juga ingin melihat halaman Bonzo yang berjudul Batch Script.