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

Contoh penggunaan ImageMagick -- penggunaan dasar

Di sini kita membahas secara rinci pemrosesan baris perintah yang dijalankan IM, beberapa kemampuan pemrosesan gambar yang baru, gagasan, filosofi, dan metodologinya, serta apa yang sebenarnya terjadi di dalamnya. Dengan pengetahuan latar ini, halaman-halaman contoh selanjutnya akan jauh lebih mudah dipahami. Sekalipun Anda hanya memakai Application Program Interface (API), bagian ini sangat layak diketahui dan dipahami.


Pemrosesan baris perintah ImageMagick

Mengapa gaya baris perintahnya berubah! atau... masalah pada IM versi sebelumnya

Pada versi mayor ImageMagick sebelumnya (versi 5.5.7 ke bawah), antarmuka baris perintah ke pustaka IM rawan bermasalah dalam hal urutan pelaksanaan operasi. Urutannya sangat serampangan dan membingungkan siapa pun yang berusaha memahami apa yang sebenarnya terjadi. Selain itu, yang berhasil pada satu kesempatan belum tentu berhasil dengan urutan yang sama di kesempatan lain, karena penulis IM terus-menerus bergulat dengan antarmuka itu agar bekerja sebagaimana yang diharapkan orang. Penyebabnya adalah ImageMagick mengikuti gaya baris perintah UNIX yang cukup baku...

**command  [options]  input_image   output_image**

Seiring waktu, gaya ini mulai menimbulkan masalah, karena gambar adalah objek yang kompleks dengan sedemikian banyak operasi yang dapat dikenakan padanya, sering kali dengan melibatkan gambar lain. Akibatnya bentuk di atas perlahan berkembang menjadi..

**command  [options] image1 [options] image2 [options]  output_image**

Cara ini bekerja, dan itulah gaya dasar yang dipakai pada versi 5.5.7. Berbagai operasi gambar seperti "-negate", "-resize", dan "-crop", dan seterusnya, boleh muncul sebelum maupun sesudah gambar yang hendak dikenainya. Misalnya, pada versi 5.5.7 kedua perintah berikut sama-sama sah dan melakukan hal yang sama.

  magick -negate  image.gif   output.gif

  magick  image.gif  -negate  output.gif

Masalahnya muncul kalau Anda menangani dua operasi pemrosesan gambar sekaligus! Contohnya...

  magick -size 40x20 xc:red  xc:blue \
          -append   -rotate 90    append_rotate.gif

[IM Output] Hasilnya (pada IM v5.5.7) adalah kedua gambar masukan diputar lebih dahulu, baru kemudian disambung, sehingga menghasilkan gambar seperti ini... Artinya, operator "-rotate" dikenakan SEBELUM "-append", dan itu kemungkinan besar bukan yang dimaksudkan pengguna.
Pada ImageMagick versi 6, operator selalu dikenakan menurut urutan baris perintah yang diberikan pengguna.
[IM Output] Dengan begitu contoh sebelumnya pada IMv7 menghasilkan: kedua gambar disambung lebih dahulu , lalu hasilnya diputar; sehingga keluarnya seperti ini...
Kalau pengguna memang bermaksud memutar sebelum menyambung, ia dapat meminta IM v6 secara eksplisit untuk mengerjakannya dengan urutan itu.

  magick -size 40x20 xc:red  xc:blue \
          -rotate 90  -append    append_rotate_bad.gif

Kendali sehalus ini di luar jangkauan IM versi sebelumnya, dan untuk mencapainya kemungkinan besar dibutuhkan pipeline atau penyimpanan gambar antara. Solusinya, sayangnya, menuntut langkah drastis dan sedikit ketidakcocokan. Di sisi lain, hampir setiap perintah 'sederhana' yang bekerja di IM versi 5 bekerja sebagaimana Anda harapkan di IM versi 6. Pada dasarnya penggunaan baris perintah pada versi sebelum versi 6 tidak terdefinisi dengan baik dan, menurut saya, rusak, sehingga menghasilkan banyak hasil aneh dan tak terduga.

Sintaksis perintah IMv7

Perhatikan bahwa tidak ada 'operasi' yang boleh diberikan sebelum setidaknya satu gambar dibaca atau dibuat. Bahkan 'pembacaan/pembuatan gambar' pun sebaiknya dianggap sebagai operasi juga. Lagi pula itu memang operasi pemrosesan gambar, yaitu mengubah gambar di dalam file menjadi gambar di dalam memori. Jadi cara yang benar di IMv7 adalah membaca gambar, memprosesnya, lalu memakai argumen 'penulisan implisit' terakhir untuk menuliskan hasilnya. Yaitu..

**command  "image" { -operation }... "output_image"**

Tentu saja ada beberapa pengaturan (setting) yang mungkin diperlukan untuk mengendalikan pembacaan gambar, dan itu harus diberikan sebelum gambarnya benar-benar dibaca (lihat di bawah untuk arti sebuah pengaturan). Dengan demikian sintaksis IMv7 pada dasarnya mengikuti bentuk berikut...

**command { [settings] [operation] }...  "implict_write"**

Bagian di dalam '{...}' diulang sebanyak 'pembacaan' atau 'operasi' yang diinginkan atau dibutuhkan. Dan '[operation]' bisa berupa pembacaan atau pembuatan gambar, bisa pula operasi pemrosesan gambar yang benar-benar 'mengerjakan sesuatu'. Semuanya dituliskan persis dalam urutan yang dikehendaki untuk memproses gambar.

Jenis opsi - operator dan pengaturan...

Ringkasan dari uraian berikut kini juga tersedia di situs web ImageMagick pada halaman The Anatomy of the Command Line. Semua opsi baris perintah kini terbagi ke dalam dua kelompok dasar: 'pengaturan' dan 'operator gambar'. Pengaturan menetapkan nilai, operator benar-benar melakukan suatu tindakan. Opsi pengaturan
| adalah opsi baris perintah yang hanya menyimpan informasi untuk dipakai belakangan oleh 'operator gambar' lain. Artinya, opsi ini tidak melakukan apa pun kecuali menetapkan suatu nilai yang akan dipakai kemudian. Banyak opsi memiliki bentuk '-' sekaligus '+'. Bentuk yang kedua umumnya dipakai untuk mematikan pengaturan itu, atau mengembalikannya ke keadaan bawaan. Dengan begitu efek sebuah pengaturan dapat dihapus dengan cepat dan sederhana. Misalnya "+gravity" mengembalikan pengaturan gravity ke keadaan awal 'gravity none'. Pengaturan masih dapat dibagi lagi ke dalam sejumlah subkategori... Pengaturan operator yang mengendalikan cara kerja operator berikutnya. Pengaturan ini menetapkan warna dan font yang boleh dipakai operator, mengatur penempatan gambar dan teks, pengambilan warna dari gambar sumber, mengendalikan metode pemrosesan pada sebagian operator yang lebih rumit, dan seterusnya, dan seterusnya.

-dither -gravity -fill -background -bordercolor -stroke -font -pointsize -strokewidth -box -virtual-pixel -interpolate

Sebagian besar opsi pengaturan termasuk kategori ini. Pengaturan masukan khusus terbatas pada pengendalian pembuatan gambar yang dibuat atau dibaca. Umumnya pengaturan ini dipakai untuk menetapkan atau menimpa metadata tertentu yang akan dilekatkan pada gambar yang dibuat setelah pengaturan itu didefinisikan, baik gambar itu dibuat maupun dibaca dari file eksternal.

-label -delay -dispose -page -comment -size

Ingat, pengaturan ini HANYA diterapkan ketika sebuah gambar dibuat atau dibaca, dan selebihnya diabaikan sepenuhnya. Operator khusus "-set" disediakan untuk mengubah meta-data gambar setelah gambar itu dibaca ke memori atau diproses dengan cara tertentu. Lihat Meta-data di bawah untuk perinciannya. Pengaturan keluaran yang hanya dipakai saat gambar ditulis atau disimpan kembali ke disk. Pengaturan ini boleh diberikan di mana saja pada baris perintah, tetapi baru diterapkan ketika gambar ditulis, entah lewat operasi bawaan berupa argumen nama file gambar terakhir, entah lewat operasi "-write" atau "-identify".

-quality -loop -compression -format -path -transparent-color

Jika tidak ditetapkan, atau dimatikan (memakai bentuk plus '+'), nilai bawaan yang sesuai akan dipakai. Umumnya nilai bawaan itu adalah nilai yang tersimpan dari gambar terakhir yang dibaca. Beberapa 'pengaturan operator' seperti warna "-background" yang sedang berlaku juga dilekatkan pada gambar, bila format filenya menuntut demikian. Pengaturan kendali & debugging yang mengendalikan cara IM secara umum menjalankan tugasnya. Termasuk di dalamnya...

-verbose -debug -warnings -quiet -monitor -regard-warnings

Lihat Kendali operasi IM di bawah untuk keterangan lebih lanjut tentang pengaturan khusus ini.

Operator gambar
| adalah argumen baris perintah yang akan mengubah gambar dengan cara tertentu. Operator dijalankan seketika begitu ditemui, dan boleh memakai 'opsi pengaturan' lain yang sudah diberikan sebelumnya pada baris perintah. Operator ini dapat dikelompokkan ke dalam beberapa subkategori... Operator pembuatan gambar yang membaca gambar dari file atau pipeline, atau menghasilkan gambar baru. Termasuk di dalamnya...

image.png xc: canvas: logo: rose: gradient: radial-gradient: plasma: tile: pattern: label: caption: text:

Sebagai 'operator', semuanya juga dijalankan seketika begitu ditemui pada baris perintah. Operator ini hanya menambahkan gambar baru ke gambar yang sudah ada di memori, dan tidak menyentuh gambar yang dibaca sebelumnya. Tentu saja, karena berupa operator, setiap 'pengaturan' yang sudah didefinisikan akan dikenakan padanya. Terutama pengaturan masukan, yang dipakai untuk mengendalikan masukan dari file atau aliran file. Misalnya "-size", yang memberi petunjuk ukuran gambar yang hendak dibuat, atau pengaturan yang mendefinisikan atau menimpa meta-data gambar seperti "-delay" dan "-page". Operator pemrosesan gambar sederhana mengubah semua gambar yang sudah dibaca ke memori. Tiap gambar diubah secara terpisah dari gambar lainnya. Termasuk di dalamnya operasi seperti...

`-crop -repage -border -frame -trim -chop -draw -annotate -resize -scale -sample -thumbnail -magnify -adaptive-resize -liquid-resize -distort -morpohology -sparse-color -rotate -swirl -implode -wave -flip -flop -transpose -transverse -blur -gaussian-blur -convolve -shadow --radial-blur -motion-blur -sharpen -unsharp -adaptive-sharpen -adaptive-blur -noise -despeckle -median -negate -level -level-color -gamma -auto-level -auto-gamma -sigmoidial-contrast -normalize -linear-stretch -contrast-stretch -colorize -tint -modulate -contrast -equalize -sepia-tone -solarize -recolor -opaque -transparent -colors -map -ordered-dither -random-dither -raise -paint -sketch -charcoal -edge -vignette -emboss -shade -poloroid -encipher -decipher -stegano -evaluate -function -alpha -colorspace -separate

Dan mungkin masih banyak operator lain yang saya lewatkan! (atau yang sudah ditambahkan)`

Karena semua operator gambar dijalankan seketika begitu ditemui pada baris perintah, operator harus diberikan sesudah gambar yang hendak dikenainya dibaca ke memori. Bila gambarnya lebih dari satu, semua gambar dikenai operasi itu, satu per satu secara berurutan. Karena itu berhati-hatilah dengan gambar apa saja yang ada di daftar gambar saat ini. Perhatikan bahwa sebagian operator ini bisa menghasilkan banyak gambar. Misalnya "-crop" dapat menghasilkan beberapa 'tile' gambar, atau "-separate" yang memecah gambar menjadi gambar per kanal. Jadi jumlah gambar di memori bisa bertambah. Tetapi semuanya hanya menerima satu gambar sekaligus sebagai masukan. Perhatikan bahwa banyak API hanya menerapkan operasi setaranya pada gambar pertama di daftar gambar yang diberikan. Artinya, API itu belum tentu mengulang untuk tiap gambar. Sebaliknya, perintah "magick" dan perintah CLI (command line interface) lainnya menerapkan operator pada tiap gambar di daftar gambar saat ini secara bergantian. Operator daftar multi-gambar bersifat khusus karena mengubah seluruh daftar gambar saat ini sebagai satu kesatuan. Operator ini bisa mengganti seluruh daftar dengan satu gambar gabungan, atau mengubah tiap gambar bergantung pada gambar lain yang ada sebelum atau sesudahnya. Operator ini dipakai untuk komposisi alpha, penanganan animasi, penanganan kanal warna, dan sebagainya...

-append -flatten -mosaic -layers -composite -combine -fx -coalesce -clut -evaluate-sequence mean -evaluate-sequence

Ingat, seluruh daftar diperlakukan sebagai satu kesatuan, dan sebagian gambar bisa terhapus atau tergantikan. Sebagian besar operator di atas menggabungkan semua gambar yang diberikan menjadi satu gambar akhir. Metode Layers Composite saat ini satu-satunya operator yang memecah daftar gambar saat ini menjadi dua daftar gambar yang benar-benar terpisah, sebelum menggabungkannya kembali menjadi daftar gambar yang sama sekali baru. Pemecahan dilakukan dengan mencari gambar khusus 'null:' di suatu tempat pada daftar gambar saat ini. Tak satu pun operator ini dapat dipakai dalam perintah "mogrify", karena perintah itu memproses daftar gambar masukan (yang diberikan di akhir) sebagai gambar-gambar tersendiri. Operator tumpukan gambar memengaruhi urutan daftar gambar yang sedang ada di memori. Lebih tepatnya, operator ini menyediakan pemrosesan gambar 'di samping' secara khusus. Dalam banyak hal mirip dengan operator daftar gambar sebelumnya, hanya saja operator ini tidak benar-benar mengubah gambarnya, melainkan hanya cara gambar itu ditata di memori.

( ) -delete -insert -swap -reverse -duplicate -clone

Perhatikan bahwa tanda kurung '(' dan ')' mungkin perlu diberi backslash atau dikutip, agar tidak diberi makna khusus oleh shell baris perintah (CLI). Tak satu pun operator ini dapat dipakai dalam perintah "mogrify", karena perintah itu memproses daftar gambar masukan (yang diberikan di akhir) sebagai gambar-gambar tersendiri. Operator khusus lain-lain adalah operator yang bekerja dengan cara tidak lazim atau tidak baku (dibandingkan yang di atas).

-geometry -version -list -bench -concurrent -preview

Operator "-geometry" istimewa karena hanya dialah operator yang memengaruhi satu gambar saja (yang terakhir) di daftar gambar, bukan memengaruhi semua gambar dengan cara tertentu. Operator ini hanya disediakan demi kompatibilitas ke belakang dan kebutuhan komposisi alpha yang khusus. Lihat Geometry, mengubah ukuran gambar terakhir saja untuk perinciannya. Dua yang lain, "-version" dan "-list", adalah operator penghasil informasi, dan membuat IM berhenti begitu saja setelah mengembalikan informasi yang diminta. Lihat Kendali khusus IM di bawah untuk keterangan lebih lanjut tentang opsi ini. Beberapa opsi bahkan dapat membuat seluruh perintah dijalankan berkali-kali. Pada dasarnya opsi-opsi ini ditangani secara khusus dengan cara yang aneh dan tidak lazim. Umumnya opsi ini tidak dipakai kecuali dalam situasi khusus atau untuk mengambil informasi global tertentu.
Semoga pemisahan opsi menjadi pengaturan dan operator ini sudah jelas, sebab hal itu penting sekali bagi cara kerja IM sekarang. Ingat, pada ImageMagick versi 6...

Pengaturan disimpan dengan cara tertentu untuk dipakai kemudian,
sedangkan operator dikenakan seketika pada gambar.

Inilah yang membuat versi 6 berbeda dari semua versi IM sebelumnya. Semua opsi didefinisikan sebagai 'pengaturan' atau 'operator', dan urutannya menentukan dengan tepat kapan dan pada gambar mana opsi itu dikenakan. Rujukan opsi IM Examples dapat dipakai untuk mengenali mana yang 'pengaturan' dan mana yang 'operator'.

Contoh nyata sebuah perintah IM

Mari kita lihat sebuah contoh, dan bagaimana IM versi 6 memprosesnya. |

  magick eye.gif news.gif -append    storm.gif tree.gif \
           -background skyblue +append    result.gif

[IM Output]
Mari kita urai satu per satu dan lihat apa yang dikerjakan IM v6... Argumen | | Tindakan yang dilakukan | Gambar


magick | Menyiapkan dan membuat 'daftar gambar' kosong | urutan kosong
eye.gif | Membaca gambar dan menambahkannya ke akhir daftar gambar saat ini | 1 gambar
news.gif | Menambahkan gambar kedua ke daftar (kini berisi dua gambar) | 2 gambar
-append | Mengambil semua gambar di daftar saat ini dan menyambungnya secara vertikal.
Semua gambar digantikan oleh satu gambar tunggal. | 1 (tergabung)
storm.gif | Menambahkan satu gambar lagi ke daftar gambar | 2
tree.gif | Dan satu lagi | 3
-background skyblue | Menetapkan 'warna latar belakang' untuk dipakai kemudian.
Tidak ada gambar yang diubah. | 3
+append | Menggabungkan ketiga gambar di daftar secara horizontal
Warna latar belakang saat ini dipakai untuk mengisi ruang kosong | 1 (tergabung)
result.gif | Karena ini argumen terakhir, operasi -write implisit dijalankan dengan argumen ini. Satu-satunya gambar di daftar saat ini ditulis memakai nama file yang diberikan, yang sekaligus menentukan format file gambar yang dipakai. | ditulis
Seperti Anda lihat, pemrosesan baris perintah pada ImageMagick versi 6 sangat lugas dan logis, sehingga hasilnya dapat diperkirakan. Dan memang itulah intinya...

Gaya baris perintah warisan

Karena banyak sekali skrip IM lama di luar sana memakai perintah dengan satu operator gambar berbentuk...

**command  -operator  input_image   output_image**

Artinya, operator gambar dituliskan sebelum gambar yang hendak dikenainya benar-benar dibaca. Untuk menangani situasi warisan ini, IM menyimpan semua operator gambar yang ditemuinya, lalu mengenakannya pada gambar pertama begitu gambar itu akhirnya muncul di baris perintah. Jadi bentuk di atas bekerja seolah-olah operasinya dituliskan dengan cara IMv7...

**command  input_image   -operator  output_image**

Misalnya, perintah warisan IMv5 berikut (penanganan opsi gaya UNIX).... |

  magick -flip  storm.gif   cmd_flip_legacy.gif

[IM Output]
Akan menghasilkan hasil yang sama dengan perintah IM versi 6 ini... |

  magick storm.gif -flip  cmd_flip_postfix.gif

[IM Output]
Gaya baris perintah warisan ini bekerja, tetapi membawa masalah yang sama seperti yang menghantui IM versi 5 (lihat Mengapa gaya baris perintahnya berubah di atas). Semua pengaturan dikenakan sebelum pembacaan pertama, dan semua operator sekadar disimpan untuk dijalankan ketika gambar pertama dibaca (dan hanya pada gambar pertama). Tidak ada pula jaminan bahwa urutan beberapa operator akan sama dengan urutan yang diberikan, meskipun besar kemungkinan urutannya diikuti. Selain itu, karena operator ditumpuk sampai gambar pertama benar-benar dibaca, mengulang sebuah perintah beberapa kali sebelum membaca gambar bisa membuat sebagian perintah yang lebih awal 'menghilang'. Ini bukan bug, melainkan salah pakai kemampuan warisan IM. Gaya baris perintah ini hanya untuk dukungan warisan, dan karena itu sudah tidak dianjurkan, jadi sebaiknya dihindari bila memungkinkan. Skrip apa pun yang masih memakai gaya lama ini sebaiknya diperbarui agar membaca gambar lebih dahulu sebelum operator yang hendak dikenakan padanya. | Dukungan warisan akan berlanjut sampai IM versi 7, yang menyertakan perintah untuk memproses baris perintah dalam satu lintasan. Dengan begitu opsi pemrosesan gambar dapat dibaca dari file skrip dan bahkan dari pipeline. Namun teknik pemrosesan satu lintasan tidak memungkinkan penyimpanan operator SEBELUM membaca gambar yang hendak dikenainya. Malah perintah "magick" akan memunculkan error bertipe 'no image' bila Anda mencoba memakai operator tanpa ada gambar di memori.

Baris perintah vs API

Ada beberapa perbedaan besar antara IM lewat baris perintah dan penggunaan API Magick seperti PerlMagick, RMagick, PHP IMagick, dan MagickWand.

Hanya satu daftar gambar yang aktif
Baris perintah selalu hanya punya satu daftar gambar yang dapat dikerjakan pada satu saat. Sebuah daftar gambar dapat 'didorong' atau disimpan untuk sementara (lihat Tanda kurung dan MPR: register memori bernama). Anda bahkan dapat 'meng-clone' (membuat salinan yang efisien) gambar dari daftar yang terakhir 'didorong'. Tetapi dua daftar semacam itu tidak benar-benar bisa dikerjakan sekaligus. Sebaliknya, API bahasa lain membolehkan adanya sebanyak apa pun daftar gambar atau 'wand' yang terpisah. Malah biasanya tiap gambar disimpan sebagai wand tersendiri (daftar gambar beserta pengaturannya) demi pemrosesan yang lebih baik, dan gambar itu baru digabungkan ke sebuah daftar bila diperlukan atau sebagai bagian dari langkah akhir. Semuanya juga dapat dikerjakan dalam urutan bebas, lalu disimpan ke basis data atau struktur data lain untuk diurutkan atau dibandingkan belakangan. Di baris perintah, satu daftar gambar tunggal berarti operasi tidak dapat dilakukan dalam urutan sembarang; umumnya kita berusaha mengerjakannya dalam runtutan yang lebih logis, menuntaskan tiap langkah pemrosesan gambar sambil berjalan. Pada dasarnya jauh lebih sulit untuk 'kembali ke belakang' atau mengubah sesuatu belakangan dengan memakai hasil satu rangkaian operasi untuk memilih atau mengubah rangkaian operasi berikutnya. Yang lebih sulit lagi adalah menggabungkan atau menyelang-nyelingkan dua daftar gambar yang benar-benar terpisah menjadi satu kesatuan yang masuk akal. Meski begitu, sudah ditemukan beberapa teknik yang memungkinkan hal itu dari baris perintah. Misalnya lihat Komposisi alpha berlapis pada daftar gambar.
Akses langsung ke data piksel
Sekali lagi, Anda memang dapat melakukan sedikit pengolahan matematis dan penggabungan data piksel dari baris perintah, tetapi mencari atribut, atau membaca dan mengubah satu piksel atau satu area tertentu, tidak mudah dilakukan lewat antarmuka baris perintah. Data piksel gambar dapat digabungkan dan diolah secara matematis memakai operator gambar FX yang khusus, tetapi umumnya itu terbatas pada transformasi gambar utuh dan sangat-sangat lambat. Agar lebih mudah, banyak operasi umum yang dikembangkan pengguna dengan operator FX kini sudah ditanam langsung ke dalam IM, sehingga lahirlah hal-hal seperti tabel lookup warna, fungsi matematis evaluate, dan fungsi multi-argumen. Begitu pula operator distorsi gambar umum serta beberapa metode komposisi gambar khusus. API dapat memanipulasi gambar dengan cara yang jauh lebih langsung, sehingga sebuah operasi unik dapat dirakit sendiri jauh lebih mudah, pada kecepatan penuh yang disediakan bahasa API itu.
Pemrosesan bersyarat
Antarmuka baris perintah IM tidak mudah dipakai untuk mengubah gambar berdasarkan suatu atribut yang diturunkan dari gambar itu. Misalnya, sangat sulit memproses gambar secara berbeda bergantung pada apakah gambar itu berlatar terang atau berlatar gelap. Memang ada beberapa tindakan bersyarat yang terbatas dan spesifik yang bisa dilakukan dengan operator gambar FX, atau meminta IM menyesuaikan (memutar) orientasi sebuah gambar berdasarkan kondisi tertentu, atau hanya memperkecil dan tidak pernah memperbesar saat mengubah ukuran gambar. Tetapi semua itu hanya menangani kondisi pemrosesan khusus yang sudah umum dan dikenal. Satu-satunya cara yang benar-benar praktis untuk pemrosesan bersyarat adalah memakai perintah terpisah dan file sementara. Untuk contohnya lihat skrip Jigsaw yang komentarnya lengkap. Sebaliknya API dapat melakukan pemrosesan bersyarat semacam itu sambil menahan semua gambar yang terlibat di memori, siap melanjutkan pemrosesan sesuai kondisi tertentu, kapan pun Anda perlukan.
Pemrosesan berulang
Anda juga tidak bisa begitu saja melakukan pengulangan pada gambar secara terkendali, atau dengan mudah mengubah prosesnya berdasarkan gambar mana dalam urutan itu yang sedang ditangani. Artinya, Anda tidak bisa begitu saja memperlakukan tiap gambar secara berbeda berdasarkan nomor 'scene' gambar atau hasil gambar sebelumnya. Misalnya menggambar teks dengan ukuran berbeda-beda, mengaburkan gambar secara bertahap, atau menghasilkan daftar animasi dalam satu perintah tunggal. Memang gambar tertentu di dalam sebuah daftar gambar dapat diubah. Misalnya lihat perubahan animasi frame demi frame. Tetapi Anda harus tahu berapa banyak gambar yang ada di daftar itu, lalu 'membentangkan' pengulangannya untuk memproses tiap gambar satu per satu. Satu-satunya cara yang benar-benar praktis untuk mengulang atas gambar dari baris perintah adalah menuliskan tiap gambar sebagai file gambar terpisah (lihat menulis banyak gambar) lalu memprosesnya satu per satu dalam pengulangan skrip di luar IM. Misalnya lihat skrip shell yang dirancang untuk membelah gambar secara vertikal. Sebagai alternatif, gambar dapat dihasilkan lewat pengulangan skrip shell, lalu hasilnya disalurkan ke satu perintah terakhir untuk menggabungkannya menjadi gambar atau urutan gambar akhir. Contohnya lihat contoh gambar berlapis, atau berbagai penghasil skrip shell pada animasi gambar terwarp. Sementara itu API sama sekali tidak kesulitan mengulang atas banyak gambar, baik dalam satu daftar gambar, beberapa daftar gambar, maupun seluruh larik atau struktur data berisi daftar gambar. API juga dapat menahan semua gambar di memori, siap untuk langkah penggabungan akhir, tanpa pipeline dan tanpa file sementara.

Jika aplikasi Anda perlu melakukan hal-hal seperti itu (walau sedikit sekali aplikasi yang benar-benar perlu sejauh itu), API mungkin pilihan yang lebih baik. Program "magick conjure" (lihat di bawah) semula dirancang agar ImageMagick lebih enak dipakai lewat skrip, dengan memungkinkan pemakaian banyak daftar gambar. Perbaikan pada "magick" di IM v7 membuat API eksperimental ini nyaris tak terpakai lagi, walaupun masih tersedia dan masih dikembangkan.

Penanganan argumen

Selain nama file dan opsi pada baris perintah, hanya ada beberapa gaya dasar argumen opsi yang dipakai.

  • Nama konstanta (untuk pengaturan dan jenis metode tertentu)
  • Daftar nama konstanta (misalnya dua warna, atau kanal)
  • Argumen geometry (daftar angka berformat khusus beserta flag)
  • Daftar bilangan pecahan (kadang dengan escape persen)
  • String teks bebas (dengan escape persen)

Nama konstanta

Nama konstanta adalah konstanta string tertentu yang dipakai untuk menelusuri pustaka internal berisi pengaturan yang diizinkan bagi sebuah opsi. Misalnya, pengaturan "-gravity" dapat menerima salah satu dari sembilan pengaturan yang berbeda. Setelah ditetapkan, pengaturan itu dipakai oleh semua operator pemrosesan gambar yang mengikutinya pada baris perintah. Contohnya pengaturan seperti 'North', 'East', atau 'NorthEast'. Daftar seluruh pengaturan yang sah dapat diperoleh dengan opsi operasional list (lihat di bawah). Misalnya dengan perintah...

  magick -list gravity

Hanya pengaturan tertentu itulah yang diperbolehkan, dan bila Anda mencoba memakai pengaturan lain akan muncul error. Contohnya...

  magick xc: -gravity Invalid   null:

[IM Text]

Pengaturannya dapat dituliskan dengan berbagai cara, dan semuanya sama-sama sah. IM sangat longgar dalam hal ini. Misalnya, sebuah pengaturan boleh ditulis dengan huruf besar, huruf kecil, atau campuran keduanya. Tiap kata (yang ditandai dengan huruf besar pada keluaran "-list") boleh disisipi spasi, tanda hubung, atau garis bawah tambahan, yang lalu diabaikan begitu saja (tetapi hanya di antara kata). Karena itu semua argumen berikut sah untuk menetapkan "-gravity" ke "North East"...

'`NorthEast`', '`northeast`', '`NORTHEAST`', '`NorTheAst`', '`north east`', '`north-EAST`', '`NORTH_EAST`', '` North East `', '`___North___East___`'.

Tetapi argumen 'Nor The Ast' tidak sah, meskipun semua hurufnya benar, karena spasinya berada di dalam kata yang dideklarasikan pada pengaturan itu. Nama konstanta ini tidak hanya untuk pengaturan, tetapi juga untuk menyatakan metode operasi yang dipakai pada sebagian operator pemrosesan gambar yang lebih rumit, seperti "-layers", "-distort", dan "-morphology". Sebagian nama konstanta dibaca dari file konfigurasi eksternal. Misalnya nama warna untuk "-fill", "-stroke", "-background" dan "-mattecolor". Atau peta 'threshold' khusus yang dipakai "-ordered-dither". Sekali lagi, "-list" dapat dipakai untuk melihat nama apa saja yang dikenali versi IM yang terpasang pada mesin Anda.

Daftar nama konstanta

Argumen ini jarang dipakai dan paling sering muncul pada pengaturan yang memerlukan satu atau dua warna, seperti penyetelan level berdasarkan warna. Opsi "-level-colors" dapat menerima salah satu gaya argumen berikut.

color color1,color2 color1-color2

Argumen ini juga dipakai untuk pemilihan gambar, yaitu pada operasi yang memanfaatkan beberapa indeks gambar sekaligus, misalnya Duplicate dan Clone. Indeks dimulai dari nol untuk gambar pertama, sedangkan indeks negatif dapat dipakai untuk menunjuk gambar dihitung dari akhir daftar gambar. Misalnya '-2-1' berarti ambil gambar kedua dari belakang (indeks '-2') sampai gambar kedua (indeks '1'). Dan ya, ini memang berarti gambarnya diambil dalam urutan terbalik dari yang disebutkan! Opsi lain yang banyak memakai bentuk ini adalah pemilihan kanal, tempat daftar kanal dapat disebutkan secara bernama. Misalnya: 'Red,Green,Blue,Black,Alpha'. Namun pengaturan kanal juga dapat memakai bentuk singkat berupa rangkaian huruf tunggal (misalnya: 'RGBA')

Argumen geometry

Inilah bentuk argumen opsi yang paling umum, dan biasanya dipakai untuk menyebutkan ukuran, persegi panjang, dan offset bagi berbagai operasi. Tetapi bentuk ini juga dipakai oleh opsi apa pun yang memerlukan daftar 1 sampai 5 angka, entah bilangan bulat entah bilangan pecahan. Misalnya, opsi seperti "-crop" dan "-resize" memakai sintaksis argumen geometry secara penuh, sedangkan yang lain seperti "-border", "-level", dan "-gamma" mungkin hanya memakai sebagian kecil dari sintaksis geometry yang lengkap. Bentuk argumen ini begitu umum sehingga ditulislah pengurai khusus (dan rumit) untuk mengubah string semacam itu menjadi angka dan flag, agar dapat dipakai operator mana pun yang memerlukan argumen geometry. Pada dasarnya argumen geometry membolehkan pengguna menyebutkan satu string argumen yang memuat sampai 5 nilai pecahan (walaupun sebagian besar operator hanya memakai bilangan bulat). Semua bentuk string berikut dikenali pengurai argumen geometry...

WxH+X+Y WxH +X+Y A A/B/C A,B,C,D,E

Pengguna boleh menuliskan deretan angka pendek itu dalam bentuk MANA PUN di atas, tetapi biasanya bentuk yang dipakai bergantung pada operasi yang memerlukan argumen tersebut. Beberapa bentuk pertama biasanya dipakai untuk menyebutkan persegi panjang dengan ukuran dan letak tertentu, atau sekadar offset untuk keperluan tertentu. Offset selalu diuraikan menjadi angka yang berbeda, yaitu angka di kedua sisi 'x' pada string itu. Artinya, "+X+Y" selalu diuraikan sebagai angka ke-3 dan ke-4, sekaligus menandai bahwa angka ke-1 dan ke-2 tidak terdefinisi (atau nol). Beberapa bentuk terakhir memungkinkan sampai maksimum 5 nilai masukan, dan biasanya dipakai untuk menyebutkan satu nilai bagi tiap kanal gambar RGBKA yang baku. Selain angka-angka itu, pengurai juga melaporkan bila ada karakter 'flag' khusus (salah satu dari '%', '^', '!', '<', '>' ). Namun pengurai hanya melaporkan bahwa karakter itu ada. Pengurai tidak melaporkan di mana karakter itu ditemukan dalam argumen. IM misalnya tidak mengingat bahwa '% melekat pada angka tertentu. Pengurai juga tidak melaporkan bila karakter itu muncul berkali-kali. Ini berarti argumen geometry '%50' persis sama artinya dengan '50%', walaupun bentuk yang kedua lebih disukai karena lebih mudah dibaca. Begitu pula '50%x30' kemungkinan besar sebenarnya berarti '50%x30%', BUKAN 50% dari lebar gambar dan tinggi 30 piksel seperti yang mungkin Anda kira. | _Karena argumen geometry dapat memuat flag '%' yang khusus, saat ini Anda tidak dapat memakai escape persen untuk menetapkan nilainya berdasarkan atribut gambar.

Ada usulan untuk masa depan tentang kapan tepatnya sebuah escape persen akan diekspansi, yang dapat memperbaiki masalah pada argumen geometry ini. Semoga saja itu menjadi bagian dari IMv7.

_

Daftar bilangan pecahan

Jika dibutuhkan lebih dari 5 bilangan pecahan, bahkan mungkin sejumlah nilai yang tidak diketahui, dipakailah argumen daftar bilangan pecahan, walaupun untuk saat ini argumen semacam itu umumnya diurai oleh masing-masing opsi, karena bentuknya bisa sedikit berbeda dari satu opsi ke opsi lain. Umumnya argumen ini berupa string (biasanya dikutip) berisi bilangan pecahan yang dipisahkan koma atau spasi. Operator distort mungkin operator yang paling dikenal memakai daftar bilangan pecahan. Yang lain misalnya kernel morfologi dan konvolusi buatan pengguna, walaupun kernel juga punya sintaksis tambahan khusus untuk mendefinisikan larik angka. Salah satu ragam bilangan pecahan dipakai oleh "-sparse-color", yang membolehkan sebagian nilai pecahan diganti dengan warna. Di dalamnya nilai-nilai itu tetap diubah menjadi bilangan pecahan ketika larik hasilnya diteruskan ke fungsi pustaka inti.

String bebas

Opsi lain cukup menerima sebuah string sebagai argumen. Entah untuk menghasilkan label, menuliskan teks anotasi, atau disimpan sebagai meta-data gambar. String semacam ini biasanya memuat escape persen yang digantikan (disubstitusi) pada suatu titik sebelum string itu dipakai. Substitusinya bisa langsung, bisa pula dilakukan belakangan, tepat sebelum argumen itu benar-benar dipakai. (Lihat escape persen yang ditunda di bawah.

Argumen dengan escape persen

Karena sifatnya, dua jenis argumen terakhir sering diproses lebih dahulu agar escape persen properti gambar di dalam string itu terekspansi. Artinya, rangkaian karakter tertentu akan diekspansi (stringnya diganti atau disubstitusi) menjadi string atau nilai lain yang dicari atau dihitung dari gambar yang sedang diproses. Ini biasanya dikerjakan tepat sebelum argumen itu benar-benar dikenakan operator pada gambar tertentu, sehingga pengaturan khusus gambar itu dapat dipakai. Bila escape persen diizinkan pada sebuah argumen, argumen itu dapat diberi awalan '@' sehingga seluruh argumen justru dibaca dari file eksternal yang disebutkan (atau dari masukan standar). Misalnya '@filename' akan digantikan oleh isi file 'filename'. Bila ini terjadi, tidak ada escape persen atau escape khusus lain yang diterapkan. Artinya, string yang dibaca dari file itu dianggap harfiah dan dipakai tanpa perubahan. PERINGATAN: file itu bisa berupa apa saja, termasuk file sistem dan file kata sandi yang mungkin terbaca oleh program. Karena itu pengguna web sebaiknya memeriksa lebih dulu string masukan untuk kasus khusus ini, atau lebih baik lagi menyuapkan string itu ke IM lewat klausa '@filename' sebagai langkah pengamanan.
Bila stringnya tidak dibaca dari file atau aliran masukan, setiap string '\n' digantikan karakter 'newline', dan setiap label berawalan '%' digantikan nilai yang sesuai. Lihat escape persen properti gambar untuk daftar lengkap penggantinya. Pemakaian escape persen pada argumen berarti, bagi daftar operator yang kian bertambah yang membolehkan escape semacam itu, seperti "-set","-sparse-color", "-distort", atau "-morphology", argumen dapat dibangun berdasarkan berbagai atribut dan meta-data gambar. ImageMagick versi 7 membolehkan pemakaian escape persen pada nyaris SETIAP argumen (fitur utama IMv7!). Tidak hanya itu, Anda bahkan dapat menghitung argumen yang berbeda-beda bergantung pada isi atau indeks gambar! Bahkan sebagian pengaturan yang rumit dapat dihitung lebih dulu memakai pengaturan per gambar atau pengaturan global yang sudah didefinisikan. Sebelum IM v6.6.9-0, escape persen dan lebih khusus lagi escape persen FX yang melibatkan indeks gambar, seperti '%p', '%n', '%[fx:t]' dan '%[fx:n]', rusak. Biasanya semuanya hanya mengembalikan nilai yang tidak berguna, entah '0' entah '1', bukan indeks dan jumlah gambar yang sebenarnya ada di daftar gambar saat ini.
--- ---

Escape persen yang ditunda

Perhatikan bahwa pada sebagian opsi pengaturan, escape persen tidak langsung diekspansi begitu ditemui, melainkan disimpan APA ADANYA. Baru kemudian, ketika teks itu benar-benar dipakai, setiap escape persen yang ada di dalam string itu diekspansi, yaitu ketika gambar yang akan dikenainya sudah diketahui. Artinya, argumen semacam ini harus menunda substitusi escape persen sampai argumen itu benar-benar dipakai. Opsi ini mencakup pengaturan masukan seperti "-label" dan "-comment", juga pengaturan "-format" serta nilai "-define" yang global. Ini berarti kita dapat menuliskan "-label" berisi escape persen khas gambar jauh sebelum gambar yang hendak dikenainya benar-benar dibaca. Baru ketika label itu benar-benar dilekatkan pada gambar (tepat setelah gambar dibaca), escape persen diekspansi, sehingga atribut gambar yang dikenainya dapat dimanfaatkan. | _Keterbatasan utama yang menghalangi pemakaian escape persen secara lebih luas adalah escape ini saat ini hanya diterapkan pada sekumpulan argumen opsi yang terbatas. Misalnya, saat ini kita tidak dapat memakainya pada argumen geometry, yang juga memakai karakter 'persen', tetapi untuk keperluan yang berbeda.

Masalah ini salah satu masalah besar yang akan diperbaiki IMv7._


Perintah-perintah ImageMagick

Meskipun sebagian besar halaman contoh ImageMagick ini memakai perintah "magick" untuk memproses gambar, ada sejumlah perintah ImageMagick lain, yang akan saya perkenalkan sekilas di sini. Sebagian perintah itu memang tidak dapat diperagakan dengan layak di halaman web. Meski begitu saya akan berusaha memberi Anda petunjuk dan kiat seputar perintah tersebut di sini, sekalipun keluarannya tidak dapat saya tampilkan langsung.

Convert -- mengonversi dan mengubah gambar

Perintah "magick" adalah andalan utama ImageMagick, dan karena itu hampir setiap kumpulan contoh di halaman-halaman ini memakainya. Jadi pemakaian perintah ini tidak akan banyak saya bahas di sini; saya justru akan menengok sedikit sejarahnya. Tujuan awal perintah ini ketika IM pertama kali dibuat adalah mengonversi gambar dari satu format gambar ke format lain. Sampai sekarang perintah ini memang masih dipakai untuk keperluan itu, dan karena itulah namanya "magick". Oleh sebab itu perintah ini kadang bahkan tidak membaca gambar ke memori, melainkan memakai program delegate sekunder di luar IM untuk melakukan konversinya secara langsung. Namun sisi yang sepenuhnya eksternal ini lambat laun jarang dipakai karena kurang dibutuhkan, kecuali sebagai sarana membaca dan menulis format file gambar yang rumit. Selama kurun waktu yang panjang, ditambahkanlah beberapa fitur pemrosesan gambar agar gambar dapat diubah sedikit sewaktu dipindahkan antarformat, atau bahkan ke format yang sama. Umumnya opsi-opsi itu sederhana, tetapi sejak IM versi 5 pemakaian fitur pemrosesan ini sudah meluas, dan menjadi sisi yang jauh lebih penting dari perintah "magick" ketimbang sekadar konversi gambar. Seiring bertambahnya opsi, orang mulai memakai banyak opsi sekaligus, dan urutan opsi itu mulai menghasilkan hasil yang aneh dan tak terkendali. Di mata pengguna, IM dikenal tidak stabil dan tidak terkendali bila banyak opsi pemrosesan gambar dipakai bersamaan, sehingga mulai ditinggalkan. IM versi 6 menandai peralihan dari gaya 'opsi' yang sederhana ke gaya 'kerjakan begitu ditemui' untuk pemrosesan gambar, dan hasilnya kemampuan pemrosesan gambar menjadi stabil dan terduga, sementara kemampuan baris perintah IM menjadi jauh berlipat ganda kegunaannya. Karena itu, "magick" kini tidak lagi terutama soal 'mengonversi' gambar dari satu format ke format lain, melainkan sebagai API baris perintah untuk mengakses fungsi pemrosesan gambar, untuk membuat dan mengubah gambar dengan cara yang sangat rumit, tanpa perlu gelar di bidang pemrosesan gambar atau kemampuan memprogram dalam suatu bahasa komputer (seperti Perl, PHP, atau C). Tentu saja sedikit pengetahuan skrip shell akan membantu, walaupun tidak mutlak diperlukan.

identify -- mencetak rincian gambar yang dilihat IM

Perintah "identify" dirancang untuk mengembalikan informasi tentang sebuah gambar dengan cara yang sederhana dan berguna. Secara bawaan perintah ini menampilkan ringkasan ringkas yang memuat nama gambar, format file, ukuran gambar, ukuran dan offset kanvas virtual, kedalaman warna, jenis format internal, dan bila diketahui, ukuran asli gambar di disk dalam satuan yang mudah dibaca manusia. Contohnya...

  magick identify  tree.gif

[IM Text]

Perhatikan bahwa '8c' pada hasil di atas bukan jumlah warna di dalam gambar ini (yang sebenarnya 6), melainkan ukuran palet 'pseudo-color' (lihat contoh berikutnya untuk jumlah warna yang sebenarnya). Perhatikan juga bahwa 'kanvas virtual' gambar ini berukuran sama dengan gambar aslinya dengan offset nol, artinya kanvas itu sedang tidak dipakai. Menambahkan -verbose, sebuah kendali operasi, akan menghasilkan sebanyak mungkin informasi tentang gambar yang diketahui IM atau yang mudah dihitungnya. Termasuk di dalamnya statistik warna, cacah warna, informasi profil, jenis penyimpanan internal gambar, dan seterusnya. Tetapi awas, keluarannya benar-benar... verbose! Informasi tertentu dapat diambil dan ditampilkan dengan cara tertentu memakai pengaturan "-format" beserta escape persen ('%') khas IM untuk menampilkan properti gambar. Namun biasanya EOL (newline pada UNIX atau MacOSX) perlu disertakan sebagai bagian argumen itu (berubah pada IM v6.8.5-8). Misalnya, cacah jumlah warna di dalam sebuah gambar saja dapat diambil.

  magick identify -format '%k\n' tree.gif

[IM Text]

| Sebelum IM v6.8.5-8, "-format" otomatis menambahkan karakter akhir baris pada keluaran, agar hasil beberapa gambar terpisah satu sama lain. Hal itu tidak lagi dilakukan, jadi Anda mungkin perlu menambahkan sendiri karakter EOL yang sesuai pada string "-format".

Identify, ping atau tidak ping

Secara bawaan, "magick identify" hanya membaca informasi dasar minimal tentang sebuah gambar, memakai teknik yang dikenal sebagai "-ping". Artinya identify hanya membaca bagian file gambar sebanyak yang diperlukan untuk menentukan informasi sederhana seperti ukuran, tanpa berusaha membaca seluruh gambar ke memori. Lihat Ping, kendali operasi di bawah. Inilah keunggulan besar "magick identify" atas "magick". Namun sebagian besar metadata gambar tidak akan tersedia. Misalnya label gambar dari file gambar PNG. Sebagai contoh, di sini saya membuat gambar dengan 'label', lalu mencoba memakai pengaturan format sederhana untuk mencetak label itu.

|

  magick rose: -set label "rose with a label" rose.png
  magick identify -format '"%l"\n' rose.png

[IM Output]
[IM Text]

Namun ini hanya terjadi pada kasus yang sangat khusus. Setiap "-format" yang memuat escape lebih rumit otomatis mematikan pembacaan 'ping' yang minimal itu.

  magick identify -format '"%[label]"\n' rose.png

[IM Text]

Atau Anda dapat mematikan pembacaan 'ping' minimal itu secara khusus, dan memaksa identify membaca gambar 'secara utuh' agar memperoleh informasi yang diinginkan.

  magick identify +ping -format '"%l"\n' rose.png

[IM Text]

Umumnya hal ini tidak perlu terlalu dirisaukan. Kecuali bila Anda menangani gambar yang sangat besar seperti foto.

Identify sebagai kalkulator bilangan pecahan

Anda dapat melakukan sedikit perhitungan bilangan pecahan memakai ekspresi escape FX...

  magick identify -ping -format 'double_width=%[fx:w*2] PI=%[fx:atan(1)*4]\n' tree.gif

[IM Text]

Perhatikan bahwa perhitungannya bahkan tidak harus berkaitan dengan gambarnya sendiri, sehingga IM dapat dipakai sebagai kalkulator bilangan pecahan sederhana di dalam skrip Anda. Karena kita hanya memerlukan informasi dasar, kita memakai kendali Ping agar identify tidak membaca seluruh gambar. Dalam kasus ini hasilnya tidak berubah, tetapi perintahnya bisa jauh lebih cepat.

Catatan tambahan tentang identify

Rincian khas tiap format
Biasanya IM membaca gambar ke memori (pada dasarnya ke format datanya sendiri) memakai berbagai API pustaka gambar dan program delegate, sebelum menampilkan hasil yang dilihatnya lewat identify. Artinya "magick identify" menganalisis isi gambar/data yang sudah dibaca dan disimpannya. Perintah ini tidak menganalisis bagaimana format file tertentu menyimpan atau menangani data gambar itu. Ini penting, karena ada sisi-sisi yang sangat khas pada format file tertentu yang tidak dilaporkan "magick identify". Misalnya, walaupun perintah ini mendaftar isi tabel warna gambar GIF untuk tiap gambar yang ada (gambarnya bisa lebih dari satu), perintah ini tidak memberi tahu apakah semua gambar dalam file itu berbagi tabel warna yang sama atau tidak. Bila Anda memerlukan informasi khas tentang format file gambar tertentu, mungkin lebih baik memakai alat yang memang dirancang untuk format itu. Misalnya "giftrans" untuk format file GIF, dan "jpegtrans" untuk format file JPEG.
Keluaran histogram warna
Perhatikan bahwa bila gambar memiliki lebih dari 1024 warna, histogram maupun tabel warna tidak disertakan pada keluaran verbose. Untuk memaksa informasi ini dihasilkan, pakailah format file khusus 'histogram:' yang menyertakan semuanya sebagai komentar gambar yang besar.
Status keluar

Program identify mengembalikan status keluar bukan nol bila menemui gambar yang rusak dan Anda menambahkan kendali regard-warnings.

error=magick identify -regard-warnings image 2>&1 >/dev/null; if [ $? -eq 0 ]; then echo "The image is good" else echo "The image is corrupt or unknown format" echo "$error" fi


Alternatif keluaran identify

Sejak IM v6.2.4 keluaran identify juga dapat dihasilkan dari perintah "convert" memakai format file keluaran khusus "info:".

  magick ../images/k* \
          -format 'image \"%f\" is of size %G\n'  info:

[IM Text]

Anda dapat memakai operator write untuk menulis ke "info:" di tengah rangkaian operasi, misalnya sebagai alat debugging. Keluaran itu juga dapat ditulis ke file tertentu (atau aliran file). Cara yang lebih sederhana adalah memakai opsi "-identify" untuk menulis ke 'keluaran standar' yang biasa.

  magick ../images/k* \
          -format 'Image #%p named \"%f\" is a %m\n' -identify \
          null:

[IM Text]

Ini juga dapat dipadukan dengan opsi lain, "-print", untuk menampilkan informasi lain.

  magick null: -print ' (50 + 25)/5  ==>  %[fx: (50+25)/5 ]\n' null:

[IM Text]

Beda utama antara "-identify" dan "-print" adalah yang pertama dijalankan sekali untuk tiap gambar yang ada di memori, sedangkan yang kedua hanya dijalankan sekali. Artinya kita dapat menghasilkan hampir semua file teks yang kita mau tentang gambar-gambar di memori, seluruhnya dari dalam satu perintah ImageMagick. Sebagai contoh, di sini saya menghasilkan file HTML dari kumpulan gambar yang sama seperti pada contoh sebelumnya...

  magick ../images/k* \
     -print "<HTML><BODY><CENTER>\n" \
     -print "<H1>  Display of %n Thumbnails  </H1>\n" \
     -print "\n" \
     -format "<IMG SRC=\"%i\" ALT=\"%f\" WIDTH=%w HEIGHT=%h>\n" -identify \
     -print "\n" \
     -print "<BR>That's all folks\!\n" \
     -print "\n" \
     -print "</CENTER></BODY></HTML>\n" \
     null:

[IM Text]

Anda dapat melihat hasil keluaran di atas sebagai halaman web HTML yang menampilkan gambar-gambarnya. Satu catatan terakhir tentang opsi-opsi ini. Semuanya secara bawaan mencetak ke 'keluaran standar' perintah "magick". Keluarannya tidak dapat diarahkan secara khusus ke 'pipeline' lain atau ke file tertentu, kecuali 'keluaran standar' sudah Anda alihkan sebelumnya. Menulis keluaran memakai "info:" memungkinkan keluarannya diarahkan ke file tertentu, persis seperti pada file gambar. Keluarannya juga dapat diarahkan ke deskriptor file yang sudah disiapkan sebelumnya, memakai format file keluaran khusus "fd:". Tentu saja cara itu menulis sekali untuk tiap gambar, jadi mungkin perlu sedikit mengatur gambar agar keluarannya hanya sekali.

Mogrify -- pemrosesan batch di tempat

Perintah "magick mogrify" dalam banyak hal mirip "magick", hanya saja perintah ini dirancang untuk mengubah gambar di tempat. Artinya, tujuan utamanya adalah membaca gambar (atau animasi) satu file setiap kali, mengubahnya, lalu menyimpannya kembali ke nama file yang persis sama dengan asal gambar itu dibaca. Karena itulah...

Mogrify berbahaya, karena dengan mudah dapat merusak gambar aslinya!

Jadi, sebelum melakukan apa pun yang bersifat final, ujilah "magick mogrify" pada salinan terpisah dari gambar Anda. Jangan memakainya pada gambar asli yang tidak punya cadangan. Meskipun "magick mogrify" biasanya menyimpan gambar yang diubah ke nama file yang sama, ada dua opsi khusus yang memungkinkannya menyimpan gambar ke file lain. Pengaturan "-format" yang khas "magick mogrify" menentukan format dan akhiran nama file yang berbeda saat menyimpan. Dengan begitu, perintah seperti...

  magick mogrify    -format jpg   *.png

akan memungkinkan Anda mengonversi atau mengubah gambar secara batch tanpa merusak gambar aslinya. Dalam hal ini semua file PNG dikonversi menjadi file JPEG dengan nama file yang sama tetapi akhiran yang berbeda. Namun awas, bila sudah ada file dengan nama yang sama, file itu akan ditimpa. Jadi izinkan saya mengulang...

Pikirkan dan periksa dulu sebelum Anda mogrify

atau Anda akan mendapati baru saja menimpa sesuatu yang ingin Anda simpan. Sejak IM v6.2.0 tersedia pula opsi baru "-path" untuk menentukan direktori lain sebagai tempat keluaran gambar yang sudah diproses. Cara ini lebih aman, tetapi gambar mana pun dengan nama sama yang sudah ada di direktori itu tetap akan tertimpa. Gambar lama yang tertinggal di direktori itu juga tidak akan dihapus. Dengan begitu IM dapat diminta menyimpan hasilnya (misalnya thumbnail gambar) ke subdirektori yang sudah ada, kira-kira seperti ini...

  magick mogrify   -path thumbnail-directory   -thumbnail 100x100  *

| Sebelum IM v6.3.4-3, pengaturan "-format" dan "-path" saling meniadakan. Sejak versi itu format sekaligus lokasi direktori keluaran dapat diubah.
Karena kemampuannya memproses banyak gambar, perintah "magick mogrify" tidak dapat memakai satu pun operator daftar multi-gambar maupun operator tumpukan gambar. Artinya operator pemrosesan gambar seperti "-fx", "+swap", "-composite", "-append", "-flatten", dan "-layers" tidak dapat dipakai dalam perintah "magick mogrify". Karena sebagian opsi pengaturan perlu ditetapkan sebelum gambar pertama dibaca (misalnya "-size", "-label" dan "-density"), opsi-opsi itu diproses dan ditetapkan sebelum gambar pertama dibaca. Setelah itu tiap gambar dibaca dan operatornya dikenakan menurut urutan baris perintah, sebelum gambar itu disimpan dan gambar berikutnya dibaca. Ini penting diingat, sebab bila salah satu pengaturan itu diubah lebih belakangan dalam runtutannya, IM bisa melupakan pengaturan sebelumnya. Contohnya..

  magick mogrify -format gif  -size 200x200  -pointsize 18 \
          -font Candice -gravity north  -annotate 0 "%f" \
          -font Ravie   -gravity Center -annotate 0 "%f" \
          -font Gecko   -gravity south  -annotate 0 "%f" \
          -size 100x64   xc:gold  xc:orange   xc:tomato

[IM Output] [IM Output] [IM Output]

Seperti Anda lihat, ukuran gambar yang dihasilkan di atas ditentukan oleh pengaturan masukan "-size" yang kedua, sedangkan pengaturan pertama yang lebih besar diabaikan sama sekali. Sebaliknya, pengaturan operator "-font" ditetapkan dengan benar untuk tiap operasi "-annotate". Kerumitan tambahan ini membuat langkah berikut agaknya bijak...

Lakukan mogrify secara sederhana.

Jangan mencoba melakukan operasi yang sangat panjang dan rumit ala "magick" dalam satu operasi batch memakai "magick mogrify"; kemungkinan besar akan muncul persoalan 'pengaturan'. Bila Anda memang ingin melakukan pemrosesan yang rumit, tulislah skrip shell/dos/perl yang memakai "magick" untuk memproses tiap gambar satu per satu, atau beralihlah ke antarmuka API ImageMagick. Untuk contoh mengubah banyak gambar lewat skrip, lihat Contoh ImageMagick tingkat lanjut. Ingat saja, "magick mogrify" adalah perintah yang berbahaya, dan sebaiknya selalu diuji dengan saksama pada gambar cadangan sebelum dipakai di lingkungan produksi. Sebenarnya saya juga menyarankan agar skrip menyertakan 'uji' singkat untuk hal-hal seperti "magick mogrify", guna memastikan perintahnya tidak merusak apa pun (karena perubahan versi atau perbedaan pemasangan di tiap komputer) sebelum memproses koleksi gambar yang sangat besar. Artinya, jalankan 'kasus uji' kecil dan hentikan bila hasilnya tidak benar, sebelum melanjutkan. Ini sebenarnya gagasan yang bagus untuk proyek pemrosesan gambar berskala besar mana pun, agar pengguna terlindung dari akibat yang tak terduga. Saya sendiri melakukannya di IM Examples, dan itu sudah menghemat banyak kerepotan bagi saya.

Komposisi alpha memakai "magick mogrify"

Karena "magick mogrify" tidak dapat memakai operator daftar multi-gambar, perintah ini tidak mudah dipakai untuk menimpakan hal seperti logo, atau untuk me-mask gambar lewat komposisi alpha. Ada satu perkecualian, yaitu memakai "-draw" untuk melakukan komposisi alpha gambar. Dengan cara ini gambar kedua dapat disebutkan sebagai bagian argumen operator, di luar daftar gambar saat ini. Sebagai contoh, di sini saya lebih dulu menyalin gambar asli yang hendak saya proses memakai skrip khusus "cp_perl". Lalu saya membuat gambar 'mask' lingkaran sementara, yang saya pakai untuk memotong bentuk lingkaran dari semua gambar itu, memakai "magick mogrify" dengan metode komposisi alpha 'Dst_In'.

  cp_perl  's/^/mogrify_/'  eye.gif news.gif storm.gif tree.gif
  magick -size 32x32 xc:none -draw 'circle 15.5,15.5 15.5,0'  circle.gif
  magick mogrify  -alpha Set -draw 'image Dst_In 0,0 0,0 "circle.gif"'  mogrify_*.gif

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Perhatikan bahwa metode komposisi alpha mana pun dapat dipakai dengan cara ini, tetapi hanya dengan satu gambar 'sumber' atau 'overlay' yang tetap, yang dikenakan pada semua gambar. Selain itu, karena "magick mogrify" akan membaca gambar 'sumber' itu berulang kali, saya sarankan Anda memakai format file khas IM "MPC:" untuk mengurangi ongkos pendekodean gambar yang dibaca berulang-ulang. Format file gambar ini tidak perlu diurai IM karena akan dipetakan langsung dari disk ke memori (pada mesin yang sama dengan tempat file itu dibuat). Cara ini menghemat banyak waktu pemrosesan, terutama saat menangani gambar dalam jumlah besar.

Memakai convert alih-alih mogrify

Dengan teknik khusus untuk mengubah nama file keluaran memakai escape persen (lihat escape persen pada nama file), "mogrify" dapat diganti dengan perintah "convert" yang lebih luwes. Tidak hanya itu, cara ini memberi Anda kendali lebih besar atas nama tujuan akhir gambar, serta memudahkan penanganan pemrosesan multi-gambar seperti komposisi dan animasi. Sebagai contoh, di sini saya membuat thumbnail dari gambar-gambar di direktori saat ini, dengan menyisipkan string "_tn" ke dalam nama file masukan untuk membentuk nama file gambar keluaran yang sesuai.

  magick *.jpg   -thumbnail 120x90 \
          -set filename:fname '%t_tn' +adjoin '%[filename:fname].gif'

Awas, jangan menyertakan akhiran file yang berbeda di dalam pengaturan nama file itu sendiri. IM tidak akan melihatnya ketika menentukan format file gambar yang dipakai. Perhatikan bahwa bila IM tidak dapat menentukannya dari nama file, IM akan kembali ke format file asli yang dibaca, jadi akhiran yang jelas, atau awalan coder, bisa jadi penting saat memakai teknik ini. Untuk memperoleh nama file asli yang persis dari gambar sumbernya, pakailah "%i", "%d/%f" atau "%d/%t.%e". Tentu saja semuanya membawa akhiran nama file di dalam pengaturan nama file, yang tidak dipakai IM, tetapi itu tidak masalah karena format file gambarnya sama. Masalah yang sesungguhnya dari memakai "convert" alih-alih "mogrify" adalah SEMUA gambar dibaca ke memori lebih dulu! Mogrify bersusah payah membaca/mengubah/menulis hanya satu file (walaupun file itu bisa memuat banyak gambar) pada satu waktu. Sedangkan "convert" tidak. Karena itu batas memori bisa terlampaui dengan sangat mudah bila Anda tidak berhati-hati. Meski begitu ada beberapa cara menyiasatinya. Lihat contoh pada pengubah pembacaan dan thumbnail. Selain itu, karena semua gambar berada di memori sebagai satu daftar gambar, berhati-hatilah dalam memproses gambar-gambar itu. Misalnya, komposisi alpha tidak dapat langsung dipakai sebagaimana biasanya, melainkan mungkin perlu memakai komposisi daftar multi-gambar yang khusus untuk pekerjaan itu. Tentu saja, sama seperti "magick mogrify", cara memakai "magick" seperti ini bisa berbahaya, karena dengan mudah dapat menimpa dan merusak file gambar aslinya.

Alternatif pemrosesan batch

Bila pemrosesan gambar secara batch memakai "magick mogrify" tidak praktis, terutama bila Anda menyalin gambar alih-alih mengubahnya di tempat, mungkin lebih baik memakai solusi pengulangan lain di luar IM. Di antaranya...

  # Use a simple shell loop, to process each of the images.
  mkdir thumbnails
  for f in *.jpg
  do   magick $f -thumbnail 200x90 thumbnails/$f.gif
  done

  # Use find to substitute filenames into a 'convert' command.
  # This also provides the ability to recurse though directories by removing
  # the -prune option, as well as doing other file checks (like image type,
  # or the disk space used by an image).
  find * -prune -name '*.jpg' \
         -exec  magick '{}' -thumbnail 200x90 thumbnails/'{}'.gif \;

  # Use xargs -- with a shell wrapper to put the argument into a variable
  # This can be combined with either "find" or "ls" to list filenames.
  ls *.jpg | xargs -n1 sh -c 'magick $0 -thumbnail 200x90 thumbnails/$0.gif'

  # An alternative method on linux (rather than plain unix)
  # This does not need a shell to handle the argument.
  ls *.jpg | xargs -r -I FILE   magick FILE -thumbnail 200x90 FILE_thumb.gif

Dan seterusnya. Saya menyarankan pemakaian "find" sekaligus "xargs" untuk pemrosesan file secara rekursif maupun tidak rekursif. Bacalah halaman man keduanya. Untuk pengantar singkat lihat kiriman diskusi IM ini, juga panduan Xargs - Wikipedia yang memuat keterangan tentang bahaya yang menyertainya. Bila perintah Anda mulai lebih rumit dari ini, mungkin sudah waktunya beralih ke skrip shell atau program API, untuk membaca banyak gambar, mengumpulkan informasi, menghitung argumen yang sesuai, lalu memproses gambarnya. Saya juga menyarankan Anda menengok perintah "parallel" (biasanya dapat langsung menggantikan "xargs"). Perintah ini tidak hanya memungkinkan beberapa perintah dijalankan sekaligus, tetapi dengan sedikit usaha dapat menjalankan tiap perintah di komputer yang berbeda, sehingga tugas dalam jumlah sangat besar dapat diproses secara tersebar lewat jaringan. Untuk pengguna Windows, saya arahkan Anda ke bagian Penggunaan di Windows, khususnya Windows, memproses beberapa file secara batch. Ingat, "mogrify" dan semua perintah IM lain juga akan mengekspansi setiap nama file yang memuat meta-karakter shell seperti '*' dan '?'. Ini dilakukan agar meta-karakter tersebut dapat dipakai pada shell baris perintah DOS yang lama. Namun hal ini dapat menimbulkan bug, eksekusi magick mogrify yang berulang, atau bahkan 'peretasan' dari sumber jahat yang memasok nama file yang dipakai. Kehati-hatian dan pemahaman menyeluruh atas persoalan keamanan sangat dianjurkan.

Composite -- menimpakan gambar dengan cara khusus

Perintah "magick composite" dirancang khusus untuk mengomposisikan alpha (menimpakan) dua gambar secara sederhana dengan berbagai cara. Termasuk membatasi area tempat kedua gambar digabungkan, lewat pemakaian gambar mask ketiga. Tidak seperti "magick", perintah "magick composite" adalah perintah yang sangat tradisional: perintah ini membaca semua opsi dan pengaturannya lebih dulu, baru menjalankan satu operasi pemrosesan gambar yang memang menjadi tugasnya. Perintah "magick composite" juga menyediakan akses sederhana ke sebagian mode komposisi alpha yang lebih rumit. Misalnya komposisi gambar "-dissolve", "-blend", dan "-watermark". Bila salah satu argumen ini diberikan, argumen itu akan menimpa pengaturan "-compose" lain yang sudah (atau akan) diberikan pada perintah itu. Perhatikan juga bahwa pengaturan "-tile" bekerja berbeda dari pengaturan yang sama pada "magick", "magick montage", maupun "magick display". Pada "magick composite", pengaturan ini membuat gambar yang ditimpakan di-tile ke seluruh permukaan gambar latar. Hal semacam itu belum tersedia pada perintah IM lain. Fitur-fitur khusus ini membuat "magick composite" berguna, tetapi komposisi alpha kini juga tersedia lewat perintah "magick". (Perinciannya lihat komposisi alpha di IM). Untuk ringkasan berbagai cara menimpakan dua gambar atau lebih, lihat contoh pada komposisi beberapa pasang gambar. Untuk keterangan lebih lanjut tentang cara dua gambar digabungkan, lihat halaman contoh komposisi alpha. Kemampuan membatasi timpaan atau 'masking' juga diuraikan di halaman contoh tersebut pada memakai mask compose untuk membatasi area yang dikomposisikan.

Montage -- menghasilkan larik thumbnail

Perintah pengindeks gambar khas IM, "magick montage", juga mengikuti gaya struktur baris perintah 'kerjakan begitu ditemui' yang sama dengan "magick". Bedanya hanya, ketika akhir perintah tercapai (selain argumen nama file gambar keluaran terakhir), "magick montage" mulai mengolah daftar gambar itu menjadi halaman indeks berisi thumbnail, sesuai pengaturan yang berlaku saat itu. Ini membuat "magick montage" jauh lebih luwes dibanding pada IM versi 5, karena kini gambar dapat diproses persis seperti di "magick", lalu menetapkan semua pengaturan "magick montage" yang diinginkan, dan membiarkannya menuntaskan pekerjaan. Untuk perincian lebih lanjut tentang "magick montage" lihat Montage, larik thumbnail.

display -- slideshow gambar

Program "magick display" dirancang untuk menampilkan sebuah gambar, atau daftar gambar, dalam bentuk slideshow yang berulang. Program ini tidak dirancang untuk animasi gambar yang tersusun dan berwaktu cermat; untuk itu pakailah perintah "animate". Tiap gambar ditampilkan dalam jendela yang ukurannya disesuaikan dengan gambar itu, kecuali bila opsi lain (seperti "-geometry" jendela, lihat di bawah) menimpa perilaku ini. Gambarnya umumnya juga ditampilkan di atas latar belakang papan catur agar efek transparansi yang mungkin dimiliki gambar itu terlihat (lihat di bawah). Ingat, program ini BUKAN dirancang untuk menampilkan animasi, melainkan sebagai slideshow gambar yang sesungguhnya. Karena itu perlu sedikit kehati-hatian saat memakai display di dalam program skrip. Waktu tampil gambar, loop, dan opsi lain Secara bawaan, jeda sekitar 2 detik ditambahkan di atas jeda apa pun yang ditentukan pengguna lewat pengaturan "-delay". Namun program ini dapat dibuat menunggu masukan pengguna (spasi) dengan opsi "-delay 0". Nilai bawaan itu dapat ditimpa oleh gambarnya sendiri, bergantung pada format filenya. Karena itu format animasi seperti GIF dan MIFF dapat menghasilkan jeda tunggu, atau 2 detik ditambah pengaturan jeda dari meta-data gambar. Jadi disarankan untuk selalu menetapkan "-delay" yang sesuai (ingat, "-delay 5x1" akan menjeda 5+2 atau sekitar 7 detik) bagi skrip dan kebutuhan Anda. Begitu pula pengaturan "-loop". Secara bawaan "magick display" mengulang selamanya ("-loop 0"), tetapi format gambar seperti MIFF atau GIF dapat menimpanya sehingga program keluar setelah gambar terakhir dalam pengulangan. Aturlah opsi "-loop" sesuai keadaan Anda. Perhatikan bahwa "magick display" tidak menangani pengaturan animasi GIF apa pun, sehingga frame tidak dibuang, dan ukuran serta offset kanvas virtual diabaikan. Dengan kata lain, yang Anda lihat adalah potongan gambar mentah dalam animasi GIF, bukan gambar yang tertimpa dengan benar. Program ini memang menyediakan opsi "-coalesce" untuk membereskan animasi semacam itu demi keperluan tampilan.

Penanganan transparansi

Gambar yang memiliki kanal alpha penuh (misalnya format PNG dan MIFF) akan ditimpakan ke atas pola latar belakang 'papan catur', agar Anda dapat melihat efek semitransparansi seperti efek bayangan. Anda dapat mengubahnya dengan memilih latar belakang lain lewat "-texture", misalnya...

  magick display -texture granite: test.png

  magick display -texture xc:black test.png

Gambar dengan transparansi berbasis palet (atau boolean), seperti format GIF dan PNG8, ditampilkan dengan 'warna transparan' yang sedang dipakai untuk mewakili transparansi di dalam tabel warnanya. Artinya, warna yang dipakai umumnya sembarang (biasanya hitam), bukan pola papan catur yang menjadi bawaan. Ini bisa dianggap bug, walaupun secara teknis bukan. Namun bila Anda ingin display menangani gambar semacam itu sama seperti gambar lain yang memuat informasi transparansi, meta-data palet dapat dibuang sebelum gambar itu disuapkan ke "magick display", memakai perintah berikut untuk mengubah gaya internal bagi format keluaran gambar tersebut.

  magick image.gif -type truecolormatte miff:- | display -

Sebagai alternatif, hampir setiap operasi yang mengubah gambar yang ditampilkan juga akan membuang meta-data palet yang ada. Jadi beberapa opsi "magick display" dapat dipakai untuk membuang paletnya. Misalnya memakai "-coalesce".

  magick display -coalesce image.gif

Cara ini punya keuntungan tambahan: optimasi animasi GIF yang mungkin ada ikut dibereskan. Namun untuk banyak gambar yang tidak saling berkaitan, cara ini bisa menimbulkan efek samping yang tidak diinginkan. Ya, metode-metode ini kikuk, tetapi berhasil.

Menampilkan gambar memakai convert

Metode penampilan alternatif (selain memakai "magick animate", lihat berikutnya) adalah memakai format gambar keluaran "x:" yang lebih sederhana (lihat format keluaran display).

  magick image.png x:

Metode ini tidak menyediakan jendela latar, opsi menu, atau kendali lain. Metode ini sekadar menampilkan gambar satu per satu. Bila Anda memang hanya ingin 'menampilkan' gambar hasilnya, delegate penjalan keluaran khusus 'show:' atau 'win:' melakukan hal yang sama dengan menjalankan perintah "display" pada gambar keluaran, lalu keluar tanpa menunggu jendela itu ditutup.

  magick image.png show:

Ukuran keluaran display

Display tidak menskalakan gambar agar pas dengan tampilan X window. Ukuran jendelanyalah yang disesuaikan dengan tiap gambar, kecuali ditetapkan lewat pengaturan "-geometry". Pengaturan itu juga dapat dipakai untuk mematok posisi jendela pada tampilan X window. Gambar yang lebih besar dari layar juga tidak diubah ukurannya, melainkan meluber keluar layar; namun display menyediakan 'jendela gulir' agar pengguna dapat menggeser-geser gambarnya. Ini bisa menyiksa saat melihat foto digital beresolusi tinggi masa kini. Untuk membatasi display ke area 800x600 piksel misalnya (hanya memperkecil, tidak pernah memperbesar), pakailah...

  magick display -resize 800x600\> photo.jpg

Untuk gambar JPG, pembacaan gambar dapat dipercepat dengan pengaturan petunjuk ukuran masukan khusus jpeg. Lihat opsi kendali pembacaan JPEG.

  magick display -define jpeg:size=1600x1200 -thumbnail 800x600\> photo.jpg

Bila gambarnya berasal dari kamera digital masa kini, "-auto-orient" juga dapat dipakai untuk mengoreksi putaran kamera pada gambar yang ditampilkan, berdasarkan meta-data EXIF di dalam format file gambar itu. Bila Anda tidak menginginkan menu, menu dapat dimatikan dengan pengaturan "-immutable" pada "magick display", supaya program tahu bahwa penyuntingan tidak diizinkan.

Memakai display dari skrip

Dengan mengingat opsi-opsi tadi, berikut saran saya untuk memakai "magick display" guna menampilkan hasil dari skrip shell yang rumit...

  magick display -delay 0 -loop 1 -coalesce -resize 800x600\>   some_random_image

Display dengan X Windows

Opsi "-window root" dapat dipakai untuk menampilkan gambar pada jendela latar (root) X window. Dalam hal ini program "magick display" otomatis keluar. Secara bawaan gambarnya di-tile ke seluruh latar. Misalnya cobalah ini..

  magick display -window root pattern:checkerboard

Untuk banyak contoh tile gambar lain beserta cara membuatnya, lihat kanvas yang di-tile dan contoh gambar latar. Bila Anda ingin memakai satu gambar tunggal sebagai latar X Windows, Anda mungkin perlu tahu ukuran tampilan X window Anda. Program "xdpyinfo", walaupun bukan bagian ImageMagick, dapat memberi informasi itu.

  xdpyinfo | grep dimensions:

Dan di sini kita memakai keluaran "xdpyinfo" untuk mengubah ukuran gambar agar memenuhi seluruh latar X window.

  screen_size=`xdpyinfo | sed '/dimensions:/!d;s/^[^0-9]*//;s/ pixels.*//'`
  magick display  -resize $screen_size! -window root photo.jpg

Kendali jarak jauh display

Display menyediakan opsi khusus "-remote". Opsi ini mencari perintah "magick display" yang sudah berjalan, lalu meneruskan argumen yang diberikan kepadanya. Contohnya...

  magick display wizard: &
  sleep 5
  magick display -remote logo: &

Perintah itu akan menampilkan gambar bawaan "wizard" pada perintah yang dijalankan di latar. Skripnya lalu menunggu 5 detik sebelum menggantinya dengan gambar bawaan "logo". Perhatikan bahwa bila tidak ada perintah "magick display" yang sedang berjalan, perintah saat ini akan membuka jendela dan tidak keluar. Karena itu sebaiknya perintah "display -remote" juga Anda jalankan di latar sebagai tindakan berjaga-jaga. Untuk saat ini Anda tidak dapat meminta "magick display" jarak jauh untuk keluar. Jadi cara terbaik menutup display jarak jauh adalah mematikan prosesnya, atau 'menghapus' jendela display itu memakai perintah X window tertentu. Misalnya (memakai perintah non-IM "xdotool")...

  xdotool search -class "display" windowkill

animate -- menampilkan animasi gambar

Dalam banyak hal "magick animate" dan "display" sangat mirip. Namun "display" hanya menampilkan gambar di dalam file gambar itu 'apa adanya' tanpa perubahan, sambil menyisipkan jeda minimal 2 detik antarframe untuk masukan pengguna. Sebaliknya "magick animate" menerapkan pengaturan animasi GIF apa pun yang tersimpan bersama gambar itu, dan menampilkan tiap gambar menurut pengaturan 'jeda waktu'-nya, lalu berputar kembali ke awal untuk mengulang animasinya. Dengan kata lain "magick animate" benar-benar 'menganimasikan' format animasi, sedangkan "display" tidak. Karena itu pula kanvas virtual gambar pertama akan menentukan ukuran gambar keluaran, dan gambar lain ditimpakan ke dalam area gambar itu. Tentu saja, karena gambarnya dianimasikan, Anda punya kendali halus atas pewaktuan tampilan gambar, lewat opsi seperti "-delay". Perintah ini juga punya argumen tambahan "-pause" untuk menambahkan jeda ekstra di akhir putaran animasi, di luar apa pun yang ditetapkan pengaturan "-delay" pada frame terakhir. Misalnya, "magick animate" dapat dipakai untuk menghasilkan perbandingan kedip dari dua gambar yang sangat mirip, kira-kira seperti ini..

  magick image1.png image2.png -scale 400% miff:- |\
     magick animate -delay 50 -loop 0 -

Saya sudah menulis skrip yang memanfaatkan metode ini, namanya "flicker_cmp", dan skrip itu sangat berguna bagi saya untuk menangkap perubahan intensitas piksel yang sangat halus, yang kalau tidak begitu pasti terlewat.

compare -- mencari perbedaan

Semua informasi terkini tentang hal ini ada di bagian halaman perbandingan gambar pada IM Examples.

stream -- pemrosesan pipeline untuk gambar raksasa

"magick stream" adalah program khusus yang dirancang untuk mengambil sebagian dari file gambar yang sangat besar. Inilah satu-satunya program semacam itu di dalam ImageMagick; semua program lain membaca gambar sepenuhnya ke memori sebelum memprosesnya (perkecualiannya adalah gambar JPEG lewat "-size", karena opsi ini diteruskan ke pustaka delegate JPEG). Sebagian gambar dapat dipilih dengan pengaturan "-extract". Kedalaman byte mentahnya dapat ditentukan dengan pengaturan "-depth". Dan terakhir, kanal warna mana yang diambil dapat dipilih dengan opsi "-channel". Namun "magick stream" hanya menghasilkan byte warna mentah dari gambar itu (format RAW) sesuai kedalaman gambarnya, sehingga keluaran potongan yang diambil itu mungkin perlu Anda salurkan ke convert. Contohnya... |

  magick stream -map rgb -storage-type char -extract 100x100+200+100 logo: - |\
    magick -depth 8 -size 100x100 rgb:-   magick stream_wand.gif

[IM Output]
Untuk keterangan dan contoh lebih lanjut lihat penanganan gambar yang benar-benar masif.

import -- membaca gambar dari tampilan layar

Perintah "magick import" adalah program khusus yang dapat dipakai untuk menangkap dan mengambil gambar dari tampilan X windows. Misalnya, mari kita minta program ini menangkap dan mencetak jendela yang Anda pilih dari tampilan Anda...

  magick import -page A4 -gravity center ps:- | lpr

Sebenarnya perintah ini jarang dipakai, karena format file khusus "X:" menyediakan fungsi yang persis sama dari dalam perintah magick. Satu-satunya beda adalah "magick import" punya lebih banyak pengaturan khas X window daripada format "X:", seperti menentukan display, layar, dan/atau ID jendela tempat gambar itu ditangkap. Opsi lain mencakup kendali 'bunyi bip' tampilan dan penangkapan berulang. Bila tidak ada jendela tertentu yang disebutkan, tetikus dapat dipakai untuk memilih bagian tampilan mana yang hendak ditangkap pengguna sebagai gambar.

  • Bila dipakai satu klik tetikus, seluruh jendela yang diklik ditangkap dan dikembalikan sebagai gambar. Perhatikan bahwa bila ada jendela lain di layar yang menutupi sebagian jendela terpilih, yang tertangkap adalah gambar jendela lain yang menutupi jendela terpilih itu.
  • Klik pada jendela root, atau memilih "-window root", akan mengembalikan seluruh layar.
  • Bila dipakai klik-dan-seret, yang dikembalikan adalah potongan terpangkas dari seluruh layar, yang tentu saja berarti letaknya (offset kanvas virtual) pada seluruh tampilan (ukuran kanvas virtual atau page) juga ikut dikembalikan.

Opsi lain memungkinkan Anda menghindari interaksi manusia dengan tetikus, yaitu dengan menangkap seluruh layar ("-window root"), atau jendela tertentu berdasarkan judul jendela atau ID jendela X, yang dapat dicari memakai utilitas X window "xwininfo". Anda juga dapat memperkecil area jendela terpilih memakai "-extract". Lihat pula format masukan khusus "X:" sebagai alternatif "magick import".

    Untuk mengimpor dari papan klip Windows, pakailah
      magick clipboard:myimage image.png
    dan bukan "import"

conjure -- bahasa scripting eksperimental IM

Semula dirancang agar ImageMagick dapat dipakai lewat skrip dengan banyak daftar gambar, tetapi perbaikan pada "magick" di IM v6 membuat API eksperimental ini nyaris tak terpakai lagi. Bahasanya berbasis XML. Meski begitu, kalau Anda memang menginginkan XML, SVG mungkin lebih cocok bagi kebutuhan Anda. Menurut pendapat saya, memakai skrip "magick conjure" mungkin lebih baik dan lebih mudah saat berurusan dengan daftar multi-gambar. Skrip ini memang dipakai, walaupun tidak terlalu luas, karena kurangnya contoh dan dukungan dari pengguna.


Daftar gambar...

Salah satu hal terpenting yang perlu diingat pada ImageMagick, dan yang membingungkan pengguna baru maupun pengguna berpengalaman, adalah bahwa...

ImageMagick bekerja dengan daftar gambar yang berurutan, bukan dengan gambar tunggal

Artinya, IM tidak berurusan dengan satu gambar saja, melainkan berpotensi dengan daftar gambar yang berurutan, entah berupa gambar-gambar terpisah, sehimpunan gambar yang saling bertumpuk, atau frame sebuah animasi. Umumnya pula semua operator gambar dikenakan pada semua gambar di daftar saat ini. Jadi bila Anda memakai operator "-draw", operator itu tidak hanya menggambar pada gambar terakhir di daftar, seperti dikira banyak pengguna baru, melainkan menggambar pada semua gambar lain di daftar gambar saat ini, satu per satu secara bergantian. Operator pelapisan gambar seperti "-coalesce" dan "-layers" akan mengganti tiap gambar di daftar dengan gambar baru yang sudah diubah menurut gambar lain di daftar itu. Operator itu bahkan bisa menambah atau menghapus gambar! Operator daftar gambar seperti "-append", "-mosaic", dan "-fx" akan mengganti SEMUA gambar di daftar gambar saat ini dengan gambar gabungan hasilnya. Artinya, semua gambar itu dimusnahkan, kecuali sebelumnya sudah disimpan memakai tanda kurung dan dipakai gambar hasil clone. Lihat operator daftar gambar di bawah untuk contoh praktisnya. Terakhir, ketika gambar baru dibaca atau dibuat, IM hanya menambahkan gambar baru itu ke akhir daftar gambar saat ini (yang selalu ada). Sebagian format (seperti GIF) sebenarnya dapat menambahkan beberapa gambar sekaligus ke daftar gambar saat ini, kecuali bila pengubah pembacaan berindeks yang khusus ditambahkan pada nama file masukan untuk membatasi apa yang dibaca. Saat menyimpan gambar, IM menyimpan seluruh daftar gambar yang ada di memori pada saat penulisan. Bila format gambarnya mengizinkan, IM menulis SEMUA gambar ke dalam satu file. Bila formatnya TIDAK mengizinkan banyak gambar (misalnya JPEG), gambar-gambar itu ditulis ke file terpisah (lihat menulis banyak gambar).

Tanda kurung -- memproses gambar 'di samping'

Dengan diformalkannya opsi baris perintah, urutan pemrosesan kini dapat diperkirakan dengan tepat, dan menjadi mungkin pula menambahkan tanda kurung pada pemrosesan gambar. Fitur ini sudah lama diidamkan pengguna IM, dan memungkinkan hal-hal yang sebelumnya mustahil dalam satu perintah. Kurung buka '(' pada dasarnya memulai daftar gambar baru, yang akan dikerjakan oleh semua operator di dalamnya. Kurung tutup pasangannya ')' lalu menambahkan daftar gambar hasilnya (yang bisa berisi lebih dari satu gambar, atau tidak sama sekali) ke akhir daftar gambar sebelumnya. Dengan kata lain, memakai tanda kurung berarti...

"Saya perlu mengerjakan sedikit hal di daftar gambar terpisah
sebelum menambahkan hasilnya ke akhir daftar sebelumnya."

Dengan begitu Anda dapat mengerjakan sebagian gambar saja, seperti pada kertas coretan, lalu menambahkan hasilnya kembali ke daftar gambar utama tanpa memengaruhi gambar yang sudah dibaca atau sedang Anda kerjakan. Mari kita lihat beberapa contoh sederhana... |

  magick  eye.gif  storm.gif  -negate  +append  cmd_negate.gif

[IM Output]
Seperti Anda lihat, operator "-negate" menegatifkan warna kedua gambar, karena pada saat itu keduanya berada di daftar gambar yang sedang ada di memori. Tetapi dengan menambahkan tanda kurung, kita dapat membatasi penegatifan itu hanya pada gambar kedua... |

  magick  eye.gif \(  storm.gif  -negate \) +append  cmd_bracket.gif

[IM Output]
Karena gambar "storm.gif" dibaca ke dalam daftar gambar yang terpisah dari gambar pertama (dihasilkan oleh operator daftar gambar "("), gambar itu dapat dinegatifkan tanpa memengaruhi gambar pertama. Lalu hasilnya dapat kita tambahkan ke daftar gambar utama (yaitu lewat operator ")"), sebelum kedua gambar itu disambung seperti sebelumnya. | _Tanda kurung harus diberikan sebagai argumen tersendiri. Artinya, tanda kurung harus Anda pisahkan dari argumen lain dengan spasi. Tanda kurung tidak boleh ditempelkan rapat pada argumen tetangganya. Dengan kata lain, argumen baris perintah IM "\(+clone " salah, sedangkan " \( +clone " benar.

Pada contoh terakhir tadi saya juga perlu menaruh backslash '\' di depan tanda kurung. Sebabnya, ketika IM dipakai pada mesin UNIX (linux), tanda kurung punya makna khusus bagi shell baris perintah. Karena itu saya perlu meng-escape, atau mengutip, simbol kurung itu setiap kali memakainya.

Skrip DOS Windows tidak menuntut tanda kurung di-escape dengan backslash. Lihat skrip DOS Windows untuk hal ini dan perbedaan lain terhadap skrip linux.

_
Tanda kurung juga memungkinkan sesuatu yang sebelumnya mustahil dilakukan dalam satu perintah "magick". Menghasilkan larik gambar! |

  magick eye.gif news.gif  +append \
         \( storm.gif tree.gif +append \)   -append  cmd_array.gif

[IM Output]
Larik semacam ini tentu saja sudah bisa dibuat memakai "magick montage" (lihat mode penggabungan Montage), tetapi memakai perintah terpisah membuat skrip pemrosesan gambar jadi lebih rumit. Tentu saja, kalau Anda ingin perintahnya sendiri tampak lebih menyerupai larik, Anda bebas menambahkan beberapa tanda kurung tambahan. |

  magick \( eye.gif    news.gif  +append \) \
          \( storm.gif  tree.gif  +append \) \
          -append  cmd_array2.gif

[IM Output]
Kelompok tanda kurung yang pertama sebenarnya tidak diperlukan, dan memang menambah sedikit pekerjaan pada pemrosesan internal IM, tetapi tanda kurung itu memperjelas apa yang dikerjakan perintah tersebut dengan memisahkan langkah-langkah pemrosesannya. Bagi skrip pemrosesan gambar, mungkin juga lebih mudah menjalankan tiap langkah pemrosesan di dalam tanda kurung tersendiri, sebagai cara memisahkan langkah pemrosesan yang dikenakan.

Tanda kurung dan pengaturan

'Pengaturan' opsi tidak terpengaruh tanda kurung, dan tetap berlaku melintasi operator gambar di dalam tanda kurung, sampai pengaturan itu diubah atau dimatikan. Contohnya... |

  magick -pointsize 24 \
          -font Candice label:Outside \
          \(              label:Inside \
             -font Gecko  label:Inside \) \
          label:Outside       -append   cmd_settings.gif

[IM Output]
Perhatikan bagaimana pengaturan "-font Candice" yang pertama TIDAK dikembalikan ke nilai bawaannya ketika tanda kurung dimasuki, sementara "-font Gecko" yang kedua tidak digantikan pengaturan font semula ketika tanda kurung ditinggalkan. Dengan kata lain...

Tanda kurung hanya menciptakan urutan gambar yang terpisah.
Tanda kurung tidak membatasi pengaturan, hanya gambar yang dikerjakan.

Sejak IM v6.4.1-4, opsi kendali operasi yang baru, "-respect-parentheses", dapat menimpa perilaku ini. Bila diberikan di awal sebuah perintah IM, opsi ini membuat tanda kurung ikut menyimpan dan memulihkan pengaturan sebelumnya yang sudah diberikan. Artinya, pengaturan apa pun yang diberikan di dalam tanda kurung hanya berlaku sampai tanda kurung itu berakhir. Contohnya... |

  magick -respect-parentheses   -pointsize 24 \
          -font Candice label:Outside \
          \(              label:Inside \
             -font Gecko  label:Inside \) \
          label:Outside       -append   cmd_settings2.gif

[IM Output]
Seperti Anda lihat, ketika tanda kurung berakhir, pengaturan font dipulihkan ke font 'Candice' sebelumnya, bukan font 'Gecko' yang ditetapkan di dalam tanda kurung. Ini paling berguna ketika Anda harus mengubah banyak pengaturan hanya untuk sesaat...

  magick -respect-parentheses \
          -font Arial   label:"This is a line of plain text." \
          \( -font Candice -pointsize 16 -fill red -undercolor lightblue \
              label:"A line using a lot of different settings." \) \
          label:"Text is back to normal -- like Magick\!" \
          -append  cmd_settings_lots.gif

[IM Output]

Operator daftar gambar

Dengan makin kuatnya penekanan IM pada urutan gambar, terutama di dalam tanda kurung, tidak mengherankan bila disediakan sehimpunan operator gambar baru untuk memanipulasi daftar gambar.

Argumen bagi operator ini berupa angka yang mengindeks daftar gambar, dimulai dari nol ('0') untuk gambar pertama, satu ('1') untuk gambar kedua, dan seterusnya. Namun bila Anda memberikan indeks negatif, gambarnya diacu dari akhir daftar gambar (gambar yang terakhir ditambahkan). Artinya, indeks '-1' adalah gambar terakhir di daftar gambar saat ini (umumnya gambar yang terakhir dibaca atau dibuat), '-2' untuk gambar kedua dari belakang, dan seterusnya.

-delete {index_range_list}

Operator daftar "-delete" adalah yang paling sederhana di antara operator daftar gambar: ia sekadar menghapus gambar dari daftar gambar saat ini. |

  magick font_[0-3].gif -delete 1 +append  seq_delete.gif

[IM Output]
Bentuk 'plus' dari operator ini, "+delete", tidak menerima argumen dan hanya menghapus gambar terakhir dalam daftar gambar saat ini. Operator "-delete" juga menerima daftar angka yang dipisahkan koma, atau rentang angka yang akan dihapus. |

  magick font_[0-7].gif -delete 1-4,6 +append  seq_delete2.gif

[IM Output]
Atau hapus semuanya (lalu tambahkan gambar baru)... |

  magick font_[0-7].gif -delete 0--1  tree.gif seq_delete3.gif

[IM Output]
Argumen '0--1' berarti hapus gambar dari gambar pertama (indeks 0) sampai gambar terakhir (indeks -1). Dengan kata lain SEMUA gambar dalam daftar gambar saat ini. Gambar tree lalu ditambahkan agar IM punya hasil yang nyata, sehingga error bertipe 'no image' terhindarkan. Gambar keluaran "NULL:" juga bisa dipakai, untuk tidak menghasilkan keluaran apa pun. Jika indeks gambar tidak ada, atau rentang angkanya terbalik, "-delete" akan mengabaikan penghapusan gambar itu tanpa memberi tahu. Sebagai contoh, argumen '-25' akan mencoba menghapus gambar ke-25 dari belakang dalam daftar gambar, tetapi diam saja tanpa melakukan apa pun bila gambar yang ada kurang dari 25. Karena itu animasi bergulir berisi 24 gambar dapat dibuat dengan urutan seperti...

  magick animation.gif  new_frame.gif  -delete -25  animation_new.gif

Namun tidak ada gambar yang dihapus bila jumlah gambarnya 24 atau kurang. Akibatnya animasi akan bertambah satu frame setiap kali perintah dijalankan, sampai maksimum 24 frame tercapai. Setelah itu frame tertua (pertama) akan dihapus setiap kali frame baru ditambahkan. Sejak IM v6.3.4, "-delete" tidak akan menghapus gambar bila hasilnya membuat rentang angka menjadi terbalik. Artinya contoh terakhir tadi bisa ditulis ulang seperti ini...

  magick long_animation.gif  new_frame.gif  -delete 0--25  animation_new.gif

Kali ini "-delete" akan menghapus semua gambar dari yang pertama sampai gambar ke-25 dari belakang, sehingga tersisa paling banyak 24 gambar dalam daftar. Bila yang ada hanya 24 gambar atau kurang, rentang gambar yang diminta untuk dihapus praktis menjadi terbalik, dan operator "-delete" tidak akan menghapus apa pun.

-insert {index}

Operasi "-insert" kurang lebih kebalikan dari "-delete". Ia mengambil gambar terakhir dalam daftar gambar saat ini lalu menyisipkannya sehingga berada pada indeks yang diberikan. |

  magick font_[0-3].gif tree.gif -insert 1 +append seq_insert.gif

[IM Output]
Indeks penyisipan dapat dibayangkan sebagai jumlah gambar yang akan muncul sebelum titik tempat gambar itu disisipkan. Tentu saja gambar yang tadinya berada pada indeks tersebut (dan semua gambar sesudahnya) akan terdorong ke posisi indeks berikutnya untuk memberi tempat bagi gambar baru. Bila posisi indeks negatif dipakai, posisi penyisipan dihitung setelah gambar yang akan disisipkan dikeluarkan dari ujung daftar. Artinya, perhitungannya seolah-olah gambar yang disisipkan itu bukan bagian dari daftar gambar semula. Karena itu "-insert -2" akan 'menggulung' tiga gambar terakhir, menempatkan dua gambar di antara gambar yang baru disisipkan dan ujung daftar gambar. |

  magick font_[0-3].gif tree.gif -insert -2 +append seq_insert2.gif

[IM Output]
Bentuk plus "+insert" memindahkan gambar terakhir ke depan daftar gambar (indeks 0), yang praktis menggulung seluruh daftar gambar sebanyak satu frame. |

  magick font_[0-3].gif tree.gif +insert +append seq_insert3.gif

[IM Output]
Kebalikan dari yang di atas (memindahkan sebuah gambar ke ujung daftar gambar) dapat dilakukan dengan lebih dulu memakai "-duplicate 1,0" untuk menyalin gambar pertama, lalu "-delete 0" untuk menghapus gambar pertama.

-swap {index}[,{index}]

Singkatnya, "-swap" menukar posisi dua gambar dalam daftar gambar saat ini. Sebagai contoh "-swap 0,2" akan menukar gambar pertama dan gambar ketiga dalam daftar gambar saat ini. |

  magick font_[0-3].gif  -swap 0,2  +append  seq_swap.gif

[IM Output]
Bentuk plus dari opsi ini, "+swap", menukar dua gambar terakhir dalam daftar gambar saat ini. Dengan kata lain, ia setara dengan "-swap -2,-1". |

  magick font_[0-3].gif  +swap  +append  seq_swap2.gif

[IM Output]
Penggunaan operator ini yang paling lazim barangkali adalah menukar dua gambar sebelum dipakai oleh operator pelapisan gambar seperti "-composite", "-flatten", "-append", atau "-fx". |

  magick tree.gif  frame.gif   +swap \
          -gravity center  -composite   framed_tree.gif

[IM Output]
Sejak IM v6.4, "-swap" dengan satu angka saja akan menukar gambar terakhir dengan gambar bernomor yang diberikan. Jadi "-swap 1" setara dengan "-swap 1,-1". |

  magick font_[0-3].gif  -swap 1  +append  seq_swap3.gif

[IM Output]

-reverse

Operator "-reverse" (ditambahkan pada IM v6.3.4) cukup sederhana: ia membalik urutan seluruh daftar gambar. |

  magick font_[0-3].gif -reverse  +append seq_reverse.gif

[IM Output]
Pada dasarnya ia operator swap yang paling pamungkas.

-clone {index_range_list}

Operator daftar gambar yang satu ini agak berbeda. Diberi nomor daftar gambar, "-clone" akan membuat salinan gambar yang telah disimpan oleh operator 'kurung buka' atau 'tanda kurung'. Yaitu...

Clone hanya boleh dipakai di dalam tanda kurung

Alasannya, cara ini memungkinkan salinan sebuah gambar diambil dari daftar gambar yang terakhir disimpan (di-push), sehingga dapat diproses lebih lanjut. Sebagai contoh. |

  magick font_[0-2].gif \( -clone 1 -rotate 90 \) +append  seq_clone.gif

[IM Output]
Bentuk 'plus' tanpa argumen "+clone" hanya membuat salinan gambar terakhir dari daftar gambar yang disimpan (di-push) agar dapat diproses lebih lanjut |

  magick font_[0-2].gif \( +clone -flip \) +append  seq_clone2.gif

[IM Output]
Sejak rilis versi 6.2.2, operator "-clone" menerima daftar gambar yang dipisahkan koma, atau rentang indeks berbentuk '_{index}-{index}_'. |

  magick font_[0-2].gif \( -clone 1-2 \) +append  seq_clone_range.gif

[IM Output]
Tentu saja indeks negatif tetap berperilaku persis seperti yang diharapkan. Sebagai contoh, untuk menduplikasi seluruh daftar gambar, tentukan angka '0' (gambar pertama) dan '-1' (gambar terakhir), yaitu dengan memakai rentang '0--1'. Bentuknya memang tampak aneh, tetapi masuk akal dan bekerja dengan baik. |

  magick font_[0-2].gif \( -clone 0--1 \) +append  seq_clone_all.gif

[IM Output]
Bila daftar indeks yang dipisahkan koma dipakai, gambar diambil dalam urutan yang Anda tentukan. |

  magick font_[0-2].gif \( -clone 2,0,1 \) +append  seq_clone_list.gif

[IM Output]
Bila gambar-gambar dalam suatu rentang terbalik (setelah indeks negatif dikonversi menjadi indeks gambar yang sebenarnya), gambar yang diambil pun ikut terbalik sebagai bagian dari prosesnya. |

  magick font_[0-2].gif \( -clone 2-0 \) +append  seq_clone_reversed.gif

[IM Output]

Operator clone gambar dapat dipakai tanpa tanda kurung, dan ia hanya akan menyalin gambar dari daftar gambar saat ini lalu langsung menambahkannya. Namun itu bukan penggunaan yang dimaksudkan dan sebaiknya dihindari, sebab hasilnya akan berbeda bila rangkaian operasi itu kelak dibungkus tanda kurung. Selain itu, pada contoh-contoh di atas saya membuat clone lalu menambahkannya ke daftar gambar saat ini untuk memperagakan operatornya. Sebenarnya saya semestinya memakai operator duplicate gambar untuk menduplikasi gambar dalam daftar gambar saat ini. Begitu pula Anda, karena dengan begitu maksud yang ingin dicapai menjadi lebih jelas. MPR: Image Memory Register juga bisa dipakai untuk meng-clone gambar dan sudah tersedia sejak IM v5. Cara itu sebenarnya masih berguna untuk meng-clone dan menyimpan seluruh daftar gambar (yang panjangnya tak diketahui) untuk dipakai kemudian, bukan sekadar satu gambar tunggal seperti yang dilakukan operator daftar gambar di atas.

-duplicate {count}[,{index_range}]

Gunakan "-duplicate" untuk membuat salinan (clone) tambahan dari sebuah gambar dalam daftar gambar saat ini (ditambahkan pada IM v6.6.8-7). Gambar baru itu ditambahkan ke ujung daftar. Berbeda dengan operator clone yang terdahulu (dan lebih tua), operator ini tidak menuntut penggunaan tanda kurung. Sebagai contoh, untuk membuat N salinan tambahan dari sebuah gambar (jadi seluruhnya N+1), lakukan ini... |

  magick font_5.gif   -duplicate 4   +append seq_duplicate.gif

[IM Output]
Perhatikan bahwa operator ini dapat menghasilkan ratusan gambar dengan sangat cepat, namun sampai gambar-gambar itu diproses, semuanya hanyalah 'clone' satu sama lain yang berbagi data gambar yang sama. Karena itu gambar hasil duplikasi sangat hemat memori. Bila ada lebih dari satu gambar, gambar terakhirlah yang diduplikasi N kali... |

  magick font_[0-1].gif   -duplicate 3   +append seq_dup_n.gif

[IM Output]
Bila gambar terakhir cukup diduplikasi sekali saja, pakai bentuk 'plus' dari argumen tersebut. |

  magick font_[0-3].gif  +duplicate   +append seq_dup_last.gif

[IM Output]
Bila sebuah gambar tertentu ingin dipilih untuk diduplikasi berkali-kali, tentukan indeks gambarnya sebagai argumen kedua. |

  magick font_[0-2].gif  -duplicate 2,0  +append seq_dup_index.gif

[IM Output]
Bagian indeks pada argumen dapat berisi daftar atau rentang indeks gambar yang akan diduplikasi N kali. Sebagai contoh, duplikasi seluruh daftar dua kali untuk menghasilkan tiga kali lipat jumlah gambar semula...

  magick font_[0-4].gif  -duplicate 2,0--1  +append seq_dup_list.gif

[IM Output]

Daftar animasi bertipe siklus patroli juga mudah dibuat dengan memakai daftar gambar yang dibalik. |

  magick font_[0-9].gif -duplicate 1,-2-1 \
          -set delay 50 -set dispose previous -loop 0  seq_reverse_anim.gif

[IM Output]
Perhatikan bahwa saya tidak menyalin seluruh daftar gambar, melainkan melewatkan penyalinan gambar yang paling pertama (0) dan yang terakhir (-1), sehingga indeks gambarnya menjadi -2 sampai 1. Bila versi IM Anda lebih tua dari v6.6.8-7, gambar duplikat masih bisa dibuat dengan operator clone gambar, tetapi hanya satu set gambar sekali jalan. Atau, dengan teknik yang pada dasarnya menyalahgunakan operator color morphing, beberapa gambar duplikat dapat dihasilkan sekaligus. Kuncinya: buat dulu satu clone untuk menghasilkan dua gambar yang identik, lalu pakai "-morph" untuk menghasilkan N-2 gambar terakhir di antara keduanya. |

  magick font_7.gif \( +clone \) -morph 3  +append seq_dup_morph.gif

[IM Output]
Namun perhatikan bahwa dengan menyalahgunakan operator color morphing, gambar-gambarnya benar-benar diproses, sehingga morph memerlukan waktu untuk memproses gambar itu (tanpa menghasilkan perubahan apa pun). Selain itu gambar yang dibuat berisi salinan nyata dari data aslinya, bukan clone sederhana yang hemat memori.

Menggabungkan operasi urutan gambar

Dengan operator-operator ini, salinan sebuah gambar tertentu dapat diambil, diubah, lalu dikembalikan ke tempat asalnya. Sebagai contoh, di sini saya membuat "-clone" dari gambar ke-2 (indeks gambar '1'), memutar warnanya dari biru ke merah, lalu mengganti gambar aslinya dengan yang sudah diubah: pertama gambar lama di-"-delete", lalu gambar baru di-"-insert". |

  magick font_[0-3].gif  \( -clone 1  -modulate 100,100,166 \) \
          -delete 1  -insert 1    +append seq_update_1.gif

[IM Output]
Cara lain yang tampaknya kini lebih lazim adalah memakai "-swap" untuk menggantikan gambar aslinya, lalu "+delete" gambar lama yang sekarang berada di ujung. Cara ini hanya menuntut posisi gambar disebutkan dua kali, bukan tiga kali: sekali untuk meng-clone, dan sekali untuk menggantikan gambar yang sudah diubah. |

  magick font_[0-3].gif  \( -clone 2  -modulate 100,100,166 \) \
          -swap 2  +delete     +append seq_update_2.gif

[IM Output]
Teknik-teknik ini dilanjutkan di bawah, pada bagian berikutnya tentang Pemrosesan gambar kompleks dan debugging.


Pemrosesan gambar kompleks dan debugging

Berkat hadirnya operator urutan gambar (lihat di atas), gambar tidak perlu lagi diproses selangkah demi selangkah dengan menyimpan lalu membacanya ulang tiap kali. Sebagai gantinya, gambar antara cukup ditahan di memori dan diproses terus. Cara ini menghemat banyak waktu, baik pada pengonversian gambar ke suatu format file maupun pada IO yang sesungguhnya untuk menyimpan gambar ke disk yang lambat. Perintah pemrosesan gambar semacam ini bisa menjadi sangat panjang dan rumit. Karena itu perintahnya sebaiknya ditulis dalam skrip, dan usahakan tiap operasi utama diletakkan pada barisnya sendiri agar lebih mudah diprogram dan disunting. Lihat Kiat menulis skrip shell/PHP ImageMagick yang lebih baik. Sebagai contoh, di sini saya menempuh seluruh rangkaian pemrosesan yang rumit untuk menghasilkan tombol merah di atas latar belakang hitam. |

  magick -size 30x30 xc:black -fill white  -draw 'circle 15,15 5,15' \
          \( +clone -shade 110x90 -normalize -negate -alpha Off \) \
          \( +clone -clone -2 -compose Plus -composite \) \
          \( -clone 0 -shade 110x50 -normalize -alpha Off \) \
          \( +clone -gamma 1,0,0 \) \
          \( -clone 2,-1  -compose Multiply -composite \) \
          -append  seq_process_fx.gif

[IM Output]
Tiap baris pada perintah magick menghasilkan satu gambar baru, kecuali baris terakhir tempat saya sekadar menyambung semua gambar kerja agar hasil dari seluruh tahap pemrosesan ikut ditampilkan, bukan cuma gambar akhirnya. Teknik ini memudahkan penelusuran apa yang dihasilkan tiap langkah (yang dibungkus tanda kurung) dari perintah yang sangat rumit itu, dan membuat debugging tiap langkah dalam sebuah proses menjadi lebih mudah. Perhatikan bahwa hanya ukuran dan bentuk gambar awal yang dipakai untuk membentuk rupa awal tombolnya, jadi Anda bebas memakai bentuk atau gambar apa pun yang disukai! Sisa perintahnya akan memproses gambar itu persis seperti sebelumnya. Tentu saja biasanya semua gambar kerja sementara akan dihapus. Artinya, saya akan mengganti baris terakhir di atas dengan sesuatu seperti ini...

          -delete 0--2  seq_process_result.gif

Cara lain memeriksa hasilnya adalah menyalurkan hasil itu ke perintah display, sehingga hasilnya terlihat di layar alih-alih disimpan ke file gambar. Jadi, pakai sesuatu seperti ini untuk baris terakhirnya...

          +append  miff:- | display -

Sebagai alternatif dari "display", 'show:' dapat dipakai untuk menampilkan gambar hasilnya di layar, lalu membiarkan perintah aslinya lanjut atau keluar. Lihat Show, menampilkan keluaran gambar untuk keterangan lebih lanjut.

          +append  show:

Sebenarnya "+append" pun tidak diperlukan; tanpa itu IM akan menampilkan tiap gambar secara berurutan, dengan menekan 'spacebar'. Anda bahkan bisa berbuat lebih jauh dengan memakai perintah "montage" untuk melihat hasilnya dengan cara yang lebih rapi...

          miff:- | montage - -bordercolor blue -border 1 -geometry +2+2 show:

Cara pemrosesan gambar semacam ini juga memudahkan peninjauan gambar antara, tepat setelah gambarnya dibuat. Pada dasarnya baris seperti ini dapat disisipkan di antara pernyataan "\( ... \)".

          \( +clone -write show: +delete \)\

IM otomatis melanjutkan pemrosesan begitu gambar antara itu dikeluarkan untuk keperluan tampilan. Lihat Show, menampilkan keluaran gambar. Sebagai alternatif, dengan menyisipkan baris ini, semua gambar yang sudah dihasilkan sampai titik itu dalam pemrosesan dapat ditampilkan...

          \( -clone 0--1 -append -write show: +delete \)\

Setelah tahap-tahap pemrosesan gambar selesai di-debug dan mapan, kodenya dapat dioptimalkan agar tidak memakai begitu banyak tahap bertanda kurung, juga lebih sedikit gambar hasil clone, sehingga gambar antara yang harus dihapus di akhir pun berkurang. Ingat pula bahwa "Komposisi gambar", dan atau "Flatten" menggabungkan beberapa gambar menjadi satu gambar hasil saja, yang dapat menekan jumlah keseluruhan gambar antara di memori. |

  magick -font Ravie -pointsize 48 -background black -fill white \
          label:'IM' -bordercolor black -border 5  seq_label.gif

  magick seq_label.gif -alpha Off \
          \( +clone  -shade 110x90 -normalize -negate \
             +clone  -compose Plus -composite \) \
          \( -clone 0 -shade 110x50 -normalize -gamma 1,0,0 -alpha Set \) \
          -delete 0 +swap  -compose Multiply -composite  seq_button.gif

[IM Output] [IM Output]
Kemampuan ImageMagick memproses gambar apa pun dengan cara yang baku, terprogram, dan otomatis, memakai banyak langkah sekaligus dalam satu perintah, itulah yang membuat IM begitu ampuh. Sebuah operasi yang sangat rumit dapat dituangkan ke dalam skrip, lalu diterapkan ke banyak gambar. Operator daftar gambar dan tanda kurung membuat IM berlipat-lipat lebih ampuh, sehingga program manipulasi gambar yang lebih rumit dapat ditulis dengan lebih sedikit perintah. Untuk contoh lain penyusunan skrip proses gambar yang rumit, lihat contoh Bullet 3-D dari bentuk. Lihat juga Kiat menulis skrip shell/PHP ImageMagick yang lebih baik, tentang cara memperbaiki skrip pemrosesan gambar Anda, baik agar lebih mudah disunting dan dipahami, maupun agar orang lain dapat mengikuti apa yang telah Anda kerjakan.


Metadata gambar: atribut, properti, dan artifact

Sejauh ini kita telah melihat gambar serta isi atau data sebenarnya yang membentuk gambar itu. Namun gambar lebih dari sekadar 'data gambar'. Ada banyak atribut atau metadata yang juga menjadi bagian dari sebuah gambar, dan memengaruhi pemrosesannya serta cara program lain seharusnya menangani gambar itu. Sebagai contoh, sebuah gambar bisa memiliki 'offset' atau menjadi bagian dari 'kanvas virtual' (page) yang lebih besar. Artinya, satu gambar mungkin hanya bagian kecil dari gambar yang lebih besar, yang tersusun dari serangkaian gambar lain, membentuk 'layer' atau 'animasi'. IM juga melekatkan banyak 'pengaturan (setting)' khusus yang dipakai banyak operator pemrosesan gambar untuk mengubah cara kerjanya. Misalnya 'warna latar belakang' yang akan dipakai. Sebagian di antaranya adalah pengaturan global yang sama untuk seluruh daftar gambar, sementara sebagian lain bisa berbeda untuk tiap gambar dalam daftar. Jadi, hal semacam apa saja yang juga menjadi bagian dari sebuah gambar? Banyak sekali...

  • Metadata gambar yang biasanya (walau tidak selalu) disimpan bersama gambar di dalam format file gambar. Misalnya: profil, label, caption, dan komentar, serta informasi kanvas virtual (page). Semuanya adalah pengaturan per gambar, dan bisa berbeda untuk tiap gambar dalam daftar gambar saat ini.
  • Pengaturan global yang dipakai banyak operator pemrosesan gambar, tetapi umumnya tidak disimpan bersama gambar: warna seperti background, bordercolor, fill, dan mattecolor, juga font, pointsize, gravity, metode compose, penanganan kanal warna, serta kedalaman bit baca/tulis nilai warna.
  • Pengaturan dan define tingkat pakar, yang dipakai untuk mengendalikan operasi tingkat lebih rendah dari operator pemrosesan gambar tertentu. Misalnya: viewport distorsi, argumen khusus metode compose,
  • Bagaimana gambar itu sesungguhnya disimpan di memori dalam ImageMagick: misalnya sebagai RGB atau CMYK. Apakah kanal alpha ada, dan aktif atau tidak, juga palet yang mungkin dimiliki gambar saat dibaca. Namun sebagian pengaturan penyimpanan ini ditetapkan mati pada waktu kompilasi (seperti Quality nilai warna di memori).
  • Beberapa pengaturan operasional umum IM, seperti pengaturan debugging atau verbose, yang biasanya mengendalikan keluaran informasi atau penanganan error.

Jadi, banyak sekali informasi yang bisa disimpan dan/atau memengaruhi cara gambar diproses. Meski semuanya dapat dikelompokkan, seberapa baik ImageMagick menangani tiap hal itu dan apakah sifatnya global atau khusus per gambar, sangat bergantung pada hal yang bersangkutan. Ya, saya memang berbicara samar di sini, sebab sebelum masuk ke hal yang spesifik memang sulit untuk tidak kabur. Ini juga bisa sangat membingungkan. Semua nilai tersebut disimpan bersama gambar yang ada di memori dengan tiga cara berbeda...

Atribut
Nilai-nilai ini disimpan sebagai item struktur data khusus untuk tiap gambar, umumnya agar berbagai operator pemrosesan gambar dapat mengaksesnya secara cepat dan langsung. Misalnya: ukuran gambar, geometry kanvas virtual, warna background, fill, stroke, matte, pointsize, densitas, font, compose, interpolate, metode virtual-pixel, blok profil, jeda (delay) waktu dan pengaturan disposal; dan banyak lagi. Perhatikan bahwa sebagian bersifat 'khusus' untuk tiap gambar, sedangkan sebagian lain diperlakukan sebagai pengaturan 'global' yang disetel ke nilai sama untuk semua gambar oleh antarmuka CLI, meski tetap disimpan sebagai bagian dari tiap gambar. Atribut biasanya diubah lewat berbagai opsi sebagai bagian dari pemrosesan gambar biasa, atau secara lebih umum dengan Set.
Properti
Ini adalah kumpulan string kunci-nilai berbentuk bebas yang dilekatkan pada tiap gambar secara individual. Tiap gambar dapat memiliki kumpulan string yang sama sekali berbeda. Pada dasarnya ini item metadata yang tidak perlu diakses atau didekode secara rutin, atau yang dipakai dengan cara khusus tertentu. Contoh umumnya: string label, caption, dan komentar; tanggal pembuatan dan perubahan; string yang ditentukan pengguna; hasil dari sebagian operator. Pengguna dapat memakai Set untuk menyetel atau mengubahnya, selama 'kunci'-nya tidak berpadanan dengan 'atribut' yang sudah dikenal.
Artifact
Ini adalah kumpulan global string berbentuk bebas yang berlaku sama untuk semua gambar. Fungsinya menampung pengaturan global bebas yang menentukan atau mengubah pembacaan dan pemrosesan seluruh gambar. Salah satu contohnya adalah pengaturan "verbose" yang membuat sebagian operasi mengeluarkan informasi umum tentang tindakannya, termasuk keluaran magick identify yang lebih rinci. Pengguna dapat mengubah nilai global ini dengan Define (lihat di bawah), atau dengan kasus khusus dari Set, (lihat Memakai Set "option:" untuk mendefinisikan sebuah artifact).

Memahami tiga metode penyimpanan ini adalah kunci untuk mengetahui cara kerja penanganan pengaturan dan metadata di dalam ImageMagick. Pemahaman itu juga membuka teknik pemrosesan gambar yang sangat lanjut dan biasanya sulit dicapai.

Menyetel/mengubah atribut dan properti gambar

Metadata sederhana adalah atribut gambar yang sering kali paling penting bagi pemrosesan gambar. Begitu pentingnya sehingga ia didekode dan disediakan di dalam struktur data gambar agar cepat dipakai operator pemrosesan gambar. Data semacam itu umumnya diubah dengan dua cara: perubahan langsung atas metadata gambar saat gambar dibaca atau dibuat, atau perubahan metadata pada gambar yang sudah ada di memori. Sebagai contoh, "-label 'string'" akan menyetel komentar pada tiap gambar yang dibaca atau dibuat sesudah pengaturan itu disetel. Sebaliknya "-set label 'string'" akan mengubah metadata 'label' semua gambar dalam daftar gambar saat ini, yang sudah ada di memori. Adanya dua metode ini berasal dari kompatibilitas mundur historis dan dari kemudahan. Pada dasarnya "-label" secara tradisional disetel SEBELUM gambar yang dikenainya dibaca. Ia hanya memengaruhi gambar yang dibaca (atau dibuat) sesudah ia disetel atau diubah. Sebagai contoh....

  magick -label one  image_one.png \
          -label two  image_two.png     output_image_list

Sebaliknya, operator "-set" mengubah SEMUA gambar yang ada dalam daftar gambar saat ini, termasuk yang dibaca sebelumnya. Karena itu umumnya tanda kurung perlu dipakai untuk membatasi gambar mana yang dikenai opsi tersebut, kecuali bila memang ingin diterapkan ke SEMUA gambar yang sudah dibaca sejauh itu.

  magick \( image_one.png -set label one \) \
          \( image_two.png -set label two \)  output_image_list

Pengaturan ini dapat dibatalkan dengan "+label"; dalam hal itu metadata label dibiarkan apa adanya saat gambar dibaca atau dibuat. Bila gambar yang dibaca juga tidak punya label, IM akan jatuh ke suatu nilai bawaan yang masuk akal. Untuk label, itu sekadar string kosong. Contoh kedua metode yang lebih rinci dan spesifik dapat dilihat di Memberi label pada gambar montage, yang memakainya secara intensif untuk keperluan pelabelan. 'Dualitas' penyetelan metadata gambar ini juga ada pada opsi lain, di antaranya... "-comment", "-caption", "-page", "-dispose", dan "-delay". Namun pengaturan ukuran kanvas virtual dan offset gambar (page) punya metode ketiga, yaitu operator khusus "-repage" (lihat Kanvas virtual di bawah).
Sebagai contoh, di sini saya memakai semua metode penyetelan yang tersedia untuk menyetel 'offset kanvas virtual' atau 'page' tiap gambar, sembari membuat sebuah animasi dari gambar-gambar itu... |

  magick -delay 100 -dispose Background \
            -page 100x100+5+10  eye.gif  \
            -page +35+30        news.gif  \
            \( storm.gif  -set page +62+50 \) \
            \( tree.gif   -repage   +10+55 \) \
          -loop 0  animation_page.gif

[IM Output]
Seperti terlihat, metode tradisional (tanpa set) lebih sederhana saat membuat daftar banyak gambar dari file gambar terpisah. Namun operator "-set" atau "-repage" yang khusus itu lebih baik bila gambar yang sudah dibaca ke memori, atau yang dihasilkan oleh metode pemrosesan gambar yang rumit, perlu diubah. Sebagai contoh, untuk mengubah offset gambar ketiga (indeks gambar '2', yaitu si 'tree') pada contoh terakhir... |

  magick animation_page.gif \
          \( -clone 2 -set page +55+10 \) -swap 2  +delete \
          animation_mod.gif

[IM Output]
Untuk contoh yang lebih ekstrem tentang mengambil dan mengubah gambar satu per satu dalam sebuah daftar gambar, lihat Frame demi frame. Berikut contoh lain yang memakai "-set" untuk menetapkan komentar pada semua gambar, lalu mengubah satu gambar tertentu.

  magick xc: -duplicate 9 \
              -set comment 'T minus %[fx:n-t]' \
              \( -clone 7 -set comment 'We have ignition!' \) -swap 7 +delete \
              -format "image #%p : %c" info:

[IM Text]

"mpr:" dapat dipakai sebagai cara alternatif untuk menyetel atribut pada gambar yang ada di memori. Sebagai contoh, di sini kita mengambil sebuah gambar berkomentar 'Bad' yang ada di memori, lalu menggantinya dengan komentar 'Good'...

  magick -comment 'Bad Comment' rose: \
          -write mpr:rose +delete \
          -comment Good   mpr:rose  rose.jpg


  magick identify -format "image comment = %c" rose.jpg

[IM Text]

Cara ini berhasil, tetapi sangat kikuk dan menyiksa untuk dipakai, apalagi bila berurusan dengan banyak gambar seperti pada animasi. Nyatanya inilah satu-satunya cara mengubah metadata gambar di IM versi 5. (Ih!)

Atribut global umum

Sedang dikerjakan

Sebagian besar atribut ini umumnya disetel secara global, entah sebelum atau sesudah
gambar dibaca ke memori (tidak ada bedanya).  Biasanya atribut itu dipakai
sebagai kendali umum atas operasi pemrosesan gambar berikutnya.

 * Banyak pengaturan sekadar disimpan secara global untuk dipakai bila perlu
     -fill  -background  -bordercolor  -strokecolor  -mattecolor  -quantize
     +dither  -channels  -size  -gravity  -units  -density  -font  -pointsize
     -tile

 * Sebagian pengaturan memengaruhi cara gambar disimpan ke disk, atau metadata
   yang disimpan bersama gambar.  Ini mencakup
     -loop  -compression  -quality  -depth
     -density  -background

 * -compose itu kikuk, sebab ia hanya bisa disetel secara global. Tetapi bila tidak disetel
   maka tiap gambar dapat memiliki pengaturan yang berbeda (untuk pelapisan).

   Namun sebagian besar di antaranya bisa dimatikan (dengan versi +), yang
   membuat operator mengambil pengaturannya dari metadata gambar
   (mis.: +background jatuh ke metadata gambar asli bila ada)
   tetapi lebih umum ia jatuh ke suatu nilai bawaan. (mis.:
   +gravity jatuh ke 'None' yang berarti tidak ada gravity yang disetel).

   Beberapa di antaranya juga ikut tersimpan bersama gambar saat ditulis. Khususnya
   format GIF akan menyimpan -background dan -bordercolor sebagai bagian dari
   atribut gambar, namun keduanya biasanya diabaikan oleh program yang
   membaca gambar tersebut.

Anda mungkin memperhatikan bahwa sebagian pengaturan dipakai di banyak tempat.
misalnya  -density

  * dipakai saat membaca banyak gambar format vektor seperti
    format gambar Postscript, PDF, dan WMF.
  * juga pada generator gambar khusus seperti label: caption: dan text:
  * dipakai sebagai bagian penggambaran font pada operator -annotate -draw dan -polaroid.
  * Dan terakhir, sebagian format menyimpan density atau resolusi sebagai bagian
    dari format file gambar itu sendiri. Misalnya gambar raster yang dibungkus
    postscript, JPEG, dan TIFF.

Pantas saja pengaturan bisa terasa begitu membingungkan.

Kanvas virtual, serta operator Page dan Repage

Tujuan utama pengaturan 'page' atau 'kanvas virtual' di dalam IM adalah menentukan bagaimana bagian 'nyata' dari sebuah gambar (bagian yang benar-benar berisi data piksel berwarna) menempati konteks 'kanvas' yang lebih besar. Hal ini terutama penting bila banyak gambar terlibat dan perlu diposisikan relatif satu sama lain untuk Layer multi-gambar dan pada Animasi GIF. Pengaturan itu juga dipakai (dan dari sinilah istilah 'page' berasal) untuk menentukan di mana sebuah gambar menempati selembar kertas fisik atau 'halaman' yang lebih besar, pada Postscript atau saat menghasilkan gambar sebuah 'halaman' Text. Meski paling sering dipakai untuk Layer multi-gambar dan Animasi GIF, pengaturan ini juga terlibat dalam mengingat posisi asli gambar saat gambar di-Crop dan di-Trim, juga pada Komposisi layer dan Distorsi gambar umum. Nah, 'page' menentukan dua bagian terpisah: 'kanvas virtual' atau area, yang menetapkan ruang lebih besar tempat gambar itu berada, dan 'offset' atau lokasi di dalam 'kanvas' tersebut tempat gambar yang sebenarnya diposisikan. Meski 'offset' negatif diperbolehkan, 'ukuran kanvas' terbatas pada area dari 0,0 sampai lebar dan tinggi yang diberikan. Artinya, hanya kanvas positif yang dapat ditentukan.
Dua aspek ini, 'ukuran' dan 'offset', berkaitan erat, tetapi biasanya keduanya ingin ditangani secara terpisah, atau dengan cara yang lebih terkendali. Karena itu, selain metode "-page" dan "-set page" yang biasa, disediakan pula opsi tersendiri "-repage" yang memungkinkan kendali lebih halus. Rincinya...
+repage
Tanpa argumen, ia mengembalikan kanvas virtual gambar ke gambar itu sendiri. Artinya, sekadar membersihkan informasi kanvas virtual apa pun yang mungkin dimiliki gambar. Ini sering penting setelah menerapkan operator pembagi gambar seperti Crop dan Trim. Ia terutama penting untuk membuang ukuran dan offset kanvas virtual sebelum menyimpan ke format file gambar GIF atau PNG, sebab banyak peramban memakai informasi kanvas/offset itu sebagai bagian dari penampilan gambar.
-repage WxH
Mengubah ukuran kanvas virtual gambar yang ada, tetapi tidak mengatur ulang posisi gambar pada kanvas itu. Perhatikan bahwa memberikan argumen ini ke "-page" atau "-set page" akan mengembalikan lokasi gambar ke '+0+0', yang barangkali tidak diinginkan..
-repage +X+Y
Sekadar memindahkan gambar pada kanvas virtual ke lokasi absolut ini tanpa mengubah ukuran kanvas gambar.
-repage +X+Y\!
Melakukan pemindahan relatif atas gambar pada kanvas virtual dengan menambahkan angka yang diberikan (positif atau negatif) ke posisi offset gambar yang ada.
-repage 0x0
Berusaha menemukan ukuran kanvas virtual terbaik yang memuat seluruh gambar. Namun ini akan gagal untuk gambar dengan offset negatif, sebab tidak ada cara menentukan kanvas virtual dengan komponen negatif. Untuk menghindari masalah, ia memakai ukuran gambar yang sebenarnya sebagai ukuran kanvas terkecil yang mungkin. Artinya, ia tidak akan pernah memberikan kanvas virtual berdimensi nol.
-repage 0x0+X+Y
Memindahkan offset gambar, lalu mengubah ukuran kanvas virtual agar paling pas dengan lokasi baru gambar itu.
-repage 0x0+0+0
Setara dengan "+repage" atau "+set page" atau "-set page 0x0". Semua informasi kanvas virtual dan offset dibuang.
-repage WxH+X+Y
Setara dengan "-set page WxH+X+Y". Artinya, sekadar memberikan nilai yang diberikan secara langsung.
Perhatikan bahwa penggunaan flag '!' membuat offset yang diberikan menjadi perpindahan relatif terhadap offset gambar saat ini. Artinya, '-repage +5+0\!" akan menggeser offset gambar 5 piksel ke kanan, tanpa mengubah ukuran kanvas virtual. Saat ini perubahan ukuran kanvas virtual secara relatif belum bisa ditentukan secara langsung. Namun hal itu dapat dilakukan dengan escape persen FX. Ini jarang dibutuhkan. Satu contohnya diberikan di Trim dengan warna tertentu. Berhati-hatilah saat memberi gambar posisi offset akhir yang negatif, sebab format file GIF tidak dapat menanganinya dan akan mengembalikannya ke nol bila negatif. Sebagian peramban juga jadi kacau bila diberi gambar PNG beroffset negatif. Informasi kanvas virtual apa yang disimpan bersama gambar bergantung pada formatnya. JPEG Seperti banyak format file gambar lain, gambar JPEG sama sekali tidak menyimpan informasi kanvas virtual. Informasi itu diabaikan dan hilang begitu saja.
GIF Ukuran kanvas virtual dan offset akan disimpan sebagai bagian dari penanganan animasi GIF-nya. Namun format ini tidak menangani offset negatif. Offset negatif apa pun akan dikembalikan ke nol saat disimpan.
PNG Offset, bahkan offset negatif, ikut disimpan, tetapi format file PNG biasanya tidak menyimpan informasi kanvas virtual. Meski begitu, gambar PNG yang disimpan IM menyertakan informasi ukuran kanvas virtual, yang hanya dipakai oleh perintah IM lain. Bila IM membaca gambar PNG tanpa atribut khas IM ini, ia akan menyetel kanvas virtual gambar ke ukuran yang sesuai agar gambar terlihat pada kanvas virtual (seperti "-repage 0x0"). Untuk gambar tanpa offset, artinya kanvas virtual berukuran sama dengan gambar yang sebenarnya.
Sebagian format seperti GIF dan PNG menyimpan informasi kanvas virtual, sebagian lain seperti JPEG tidak. Semua format di atas punya keterbatasannya sendiri untuk informasi kanvas virtual. Hanya format file internal MIFF yang tidak punya keterbatasan semacam itu. Perhatikan bahwa "-page" punya makna khusus bagi operator generator gambar "text:" dan "ps:" (lihat Text: file teks banyak baris dan PS: teks dan grafik berformat Postscript). Karena itu makna ukuran kanvas dan offset yang biasa tidak dipakai saat pembuatan gambar-gambar itu.

Set dan properti per gambar

Namun IM tidak mungkin menyediakan opsi untuk menangani setiap pengaturan yang mungkin dimiliki sebuah gambar. Itu jelas mustahil. Belum lagi pengguna sering ingin menambah atau mendefinisikan pengaturannya sendiri. Karena itu opsi "-set" sesungguhnya dapat mendefinisikan pengaturan APA PUN dengan nilai APA PUN. Bila pengaturan itu bukan atribut gambar yang dikenal secara khusus (yang disimpan agar operator dapat mengaksesnya dengan cepat), ia disimpan ke dalam gambar sebagai 'Properti ' (larik string), dan akan tampil di dekat bagian bawah keluaran "magick identify" yang verbose, atau diambil dan diekspansi memakai escape persen. Gambar rose bawaan, misalnya, otomatis menghasilkan tiga 'properti': dua string tanggal dan sebuah 'signature hash'. Ke situ saya juga menambahkan pengaturan 'properti' buatan saya sendiri.

  magick rose:  -set my_property my_value   -verbose info: |\
    sed -n '/Artifacts/q; /Properties/,$ p'

[IM Text]

Sebagian operator pemrosesan gambar bahkan mengembalikan nilai yang menarik sebagai 'properti' gambar. Nilai itu tidak dibutuhkan operator lain, jadi tidak disimpan sebagai 'atribut', melainkan sebagai string 'properti' untuk kemungkinan dipakai pengguna. Sebagai contoh, pointsize akhir yang dipilih oleh Pas terbaik terhadap ukuran gambar akan disimpan sebagai properti gambar khusus. |

  magick -size 100x label:Anthony  -verbose -identify  property_label.gif |\
    sed -n '/Artifacts/q; /Properties/,$ p'

[IM Output]
| [IM Text]
| Perhatikan bahwa generatorlabel: itu sendiri juga menyetel atribut 'label', yang kebetulan disimpan sebagai string properti.
| _Semua 'properti' disimpan sebagai tipe data string berbentuk bebas, dan disimpan sebagai metadata gambar.

Karena itu, tidak semua 'atribut' disimpan sebagai 'properti', sebab banyak atribut perlu disimpan dan dipakai langsung sebagai data numerik oleh operator pemrosesan gambar. Contohnya adalah atribut 'page' kanvas virtual._
Di sini saya memakai pengaturan "-format" pada identify agar IM mengeluarkan pointsize dari label yang dibuat lalu dibuangnya. |

  magick -size 100x label:Anthony \
          -format 'pointsize = %[label:pointsize]pts' info:

[IM Output]
Memakai informasi ini untuk menghasilkan gambar label baru itu ada triknya, dan akan dibahas di bawah. Salah satu pengaturan buatan pengguna yang paling berguna adalah pengaturan "filename:". Sebagai contoh...

  magick rose: -set filename:my_area '%wx%h' 'rose-%[filename:my_area].png'

Perintah di atas menghasilkan gambar bernama "rose-70x46.png". Demi keamanan, hanya pengaturan buatan pengguna yang berawalan string "filename:" yang boleh dipakai di dalam nama file keluaran, meski nama apa pun boleh dipakai. Untuk contoh lain soal ini lihat Escape persen pada nama file.

Define dan artifact global

Nilai yang didefinisikan dikenal sebagai 'Artifact ' dan didefinisikan secara global untuk semua gambar, serta disetel dengan operator khusus "-define". Tujuan utama 'Artifact ' semacam itu adalah sebagai pengaturan khusus yang dapat dipakai sebagai pengaturan tambahan (atau di luar jalur biasa) oleh coder format file gambar , atau operator pemrosesan gambar. Pada dasarnya ia memungkinkan penambahan pengaturan berbentuk bebas untuk kebutuhan tertentu tanpa perlu membuat 'atribut' baru. Karena disetel secara global, ia tidak melekat pada gambar tertentu, melainkan pada semua gambar dalam sebuah urutan gambar, dan tersedia bahkan ketika belum ada gambar yang dibaca atau dibuat. Perhatikan bahwa API dapat memiliki beberapa daftar gambar, dengan kumpulan 'artifact' berbeda yang melekat padanya, tetapi antarmuka baris perintah (CLI) hanya punya satu daftar gambar aktif, sehingga 'artifact' memang benar-benar global.
Dengan kata lain, 'artifact yang didefinisikan' memberi pengguna mahir cara mengubah operasi normal atau baku dari operator tertentu, melampaui penggunaan argumen biasa. Sebagai contoh, Pengaturan coder JPEG, baik untuk membaca maupun menulis gambar semacam itu...
  -define jpeg:size=300x200
  -define jpeg:preserve-settings=1
  -define jpeg:optimize-coding=true

Opsi distorsi gambar, seperti...

  -define distort:scale=2
  -define distort:viewport=44x44+15+0

Kendali expert filter, seperti

  -define filter:blur=0.75
  -define filter:support=1.25

Sebagian define artifact punya jalan pintas karena sangat sering dipakai pengguna. Sebagai contoh, kendali operasional "-verbose" (lihat di bawah) sebenarnya setara dengan memakai "-define verbose", sehingga membuat artifact 'verbose'. Sebagai contoh...

  magick xc: -verbose info: |\
    sed -n '/Tainted:/q; /Artifacts:/,$ p'

[IM Text]

Dengan begitu, bentuk plus "+verbose" sekadar membuang artifact 'verbose', sehingga setara dengan "+define verbose".

Artifact dan escape persen tertunda

Artifact juga sering dipakai untuk menampung atribut khusus yang akan diberikan kepada gambar yang dibaca setelah define itu diberikan. Pengaturan "-label" pun sekadar menyetel sebuah artifact dengan argumen yang diberikan pengguna. Artifact itu kemudian diubah menjadi pengaturan atau properti 'label' setelah gambar baru dibaca atau dibuat. Sebagai contoh, membuat gambar "rose:" dengan label yang disetel

  magick -label "%wx%h"  rose: -verbose info:  |\
      sed -n '/Tainted:/q; /Properties:/,$ p'

[IM Text]

Artinya, "-label" lebih dulu mendefinisikan artifact 'label' yang ditampilkan itu. Kemudian, ketika gambar rose dibuat (dan atribut ukurannya diketahui), IM mengubah artifact global tersebut menjadi 'properti' khusus gambar, dan barulah pada saat itu escape persen mana pun diekspansi. Inilah yang dikenal sebagai escape persen tertunda. Hal yang sama terjadi pada beberapa opsi pengaturan lain, seperti "-comment" dan "-caption". Karena escape persen tertunda inilah "-define" hanya menyimpan stringnya, sedangkan operator "-set" yang melakukan ekspansi.

Memakai Set "option:" untuk mendefinisikan sebuah artifact

Di atas telah ditunjukkan bagaimana "-set" dapat dipakai untuk properti pribadi bertujuan khusus, per gambar. Sebagai contoh... |

  magick -size 80x40 xc:  -set myinfo 'I love IM!' \
          -gravity center -annotate 0x0 '%[myinfo]' \
          property_annotate.gif

[IM Output]
Namun karena properti melekat pada gambar tertentu, ia tidak dapat dipakai saat pembuatan gambar baru. Sebagai contoh, yang ini akan gagal... |

  magick rose: -set myinfo 'I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   property_append_fail.gif

[IM Output]
Seperti terlihat, properti 'myinfo' tidak ditemukan atau tidak disertakan pada label yang digabungkan. Sebaliknya, artifact yang didefinisikan secara global tersedia bagi generator gambar. Memang harus begitu, agar generator gambar atau coder file gambar dapat membacanya untuk berbagai pengaturan kendali. Karena itu memakai "-define" akan bekerja sebagaimana diharapkan. |

  magick rose: -define myinfo='I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   artifact_append.gif

[IM Output]
Lalu bagaimana caranya membuat label memakai properti atau atribut gambar? Opsi "-define" saat ini tidak mengizinkan penggunaan properti gambar! Triknya adalah memakai awalan khusus "option:" saat memakai opsi "-set". Tambahan ini membuat "-set" mendefinisikan sebuah 'artifact' dengan nama yang mengikuti awalan itu. Sebagai contoh, ini setara dengan contoh terakhir tadi. |

  magick rose: -set option:myinfo 'I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   property_option_append.gif

[IM Output]
Yang lebih penting, opsi "-set" akan mengekspansi escape persen. Artinya, bila kita punya suatu properti per gambar, kita dapat mengubahnya menjadi artifact global. Sebagai contoh, di sini saya membuat sebuah label, lalu mengubah properti 'label:pointsize' yang dibuat generator gambar "label:" menjadi artifact global 'my_pointsize'. Sebagai artifact, informasi itu tersedia ketika saya membuat gambar label kedua. Kedua label lalu saya gabungkan (dengan garis 'gray' sebagai pemisah). Contoh yang sangat rumit. |

  magick -size 100x -gravity center label:Anthony \
          -set option:my_pointsize '%[label:pointsize]' \
          -set option:my_height '%h' \
          -size 100x1 xc:gray \
          -size 100x label:'at %[my_pointsize]pt and %[my_height]px high' \
          -append  property_append.gif

[IM Output]
Perhatikan penempatan "-set option:..." pada contoh di atas. Bila ia diletakkan SESUDAH pembuatan "xc:gray", gambar itulah yang akan dipakai untuk menyetel artifact global. Sebabnya, hanya properti gambar terakhir yang menentukan nilai yang tersimpan dalam artifact global. Alasannya, hanya gambar terakhir yang dipakai untuk mendefinisikan artifact tersebut. Yang sebenarnya terjadi, "-set" diterapkan ke tiap gambar dalam daftar gambar saat ini, meski yang dihasilkannya adalah artifact global. Jadi tiap gambar akan menaruh propertinya sendiri ke dalam artifact global itu, menggantikan nilai yang ditetapkan sebelumnya. Setelah selesai, hanya gambar terakhirlah yang 'mendefinisikan' artifact tersebut. | Untuk saat ini 'escape FX' tidak punya cara membaca properti atau artifact. Karena itu aritmetika atas nilai-nilai semacam itu belum dapat dilakukan.

Jenis gambar saat membaca dan menulis

Operator/pengaturan "-type" menentukan gaya atau ruang warna yang dipakai saat sebuah gambar dibaca atau ditulis, untuk memastikan gambar hasilnya (di memori, atau di dalam file gambar) sesuai dengan yang diharapkan. Sebagai bagian dari itu, ia dapat melakukan sedikit perubahan ruang warna pada saat I/O file, tetapi hanya untuk memastikan gambar berada dalam bentuk yang diharapkan. Sebagai contoh, "-type" punya pengaturan khusus 'bilevel' yang dapat dipakai untuk mengonversi dan menyimpan gambar sebagai gambar monokrom dua warna pada sebagian format gambar. Serupa dengan itu, 'TrueColor' dan 'TrueColorAlpha' dapat dipakai untuk memaksa gambar TIFF disimpan sebagai gambar RGB berwarna penuh meski gambarnya sebenarnya murni grayscale. Pengaturan lain mencakup 'GrayScale' dan 'GrayScaleAlpha' yang memastikan gambar yang ditulis hanya grayscale (masing-masing tanpa dan dengan transparansi). Atau 'Palette' untuk memaksa penggunaan peta warna berindeks pada format yang mendukung opsi ini. Saat membaca format file gambar, pengaturan "-type" bernilai 'TrueColorAlpha' akan memaksa gambar JPEG yang dibaca memiliki kanal 'Alpha' pada penyimpanannya di memori, meski format JPEG sendiri tidak dapat menangani transparansi. Saat menulis ke format file PNG, menyetel "-type" ke 'Pallette' akan memaksanya memakai format gambar internal "PNG8' berindeks warna. Serupa dengan itu, memakai "BiLevel" akan memaksa IM men-dither gambar berwarna menjadi hitam putih pada sebagian besar format file gambar. Sayangnya, makna dan kemampuan persis "-type" bergantung pada format gambar tertentu yang sedang dibaca atau ditulis. Lihat berbagai area contoh Format file gambar. Untuk contoh PNG yang spesifik lihat Format keluaran PNG.


Mengendalikan kualitas gambar

Depth - kedalaman bit format file

Quality dan Depth adalah dua istilah yang sering dibicarakan di forum diskusi dan di halaman-halaman contoh ini, jadi saya ingin menjelaskannya sedikit. Quality adalah pengaturan waktu kompilasi di ImageMagick, dan dipakai untuk menentukan ukuran nilai yang menyimpan gambar di memori IM dan selama pemrosesan. Pada dasarnya ia berarti kualitas pemrosesan yang menjadi dasar kompilasi sebuah IM tertentu. Depth adalah ukuran nilai yang dipakai saat gambar dibaca dari atau disimpan ke sebuah format file gambar. Karena itu ia jauh lebih bervariasi, dan dikendalikan oleh pengaturan "-depth", atau oleh 'depth' asli gambar yang dibaca. Sebentar lagi hal ini dibahas lebih jauh. Ingat...

Quality adalah ukuran nilai 'di memori', dan dikompilasi ke dalam IM.
Depth adalah ukuran nilai format file, dan bersifat variabel.

Kini kebanyakan format gambar ber-depth 8. Artinya, format itu memakai 8 bit (atau nilai dari 0 sampai 28-1) untuk menampung tiap nilai warna yang dipakai dalam gambar. Yaitu nilai 0 sampai 255 untuk merah, 0 sampai 255 untuk hijau, dan 0 sampai 255 untuk kanal biru. Lebih lazimnya gambar jenis ini disebut gambar 24 bit (yaitu "bit per piksel ", BUKAN "bit per nilai " seperti yang dipakai pengaturan "-depth"). Ini mencakup format seperti JPEG). Bila kanal alpha ikut terlibat, jadilah 4 x nilai 8 bit, atau gambar 32 bit/piksel. Inilah yang biasanya dipakai gambar PNG, meski gambar semacam itu juga bisa disimpan dengan 16 bit per nilai. Yang oleh banyak orang disebut gambar 8 bit (8 bit/piksel) sebenarnya adalah gambar dengan palet atau peta warna 8 bit (memberi batas maksimum 256 warna untuk seluruh gambar). Data pikselnya yang sebenarnya adalah nilai indeks 8 bit (0-255) yang lalu dipakai untuk mencari warna piksel itu dari tabel warna. Jadi 'raster' (larik piksel) hanyalah indeks yang dipakai untuk mencari warna piksel sebenarnya dari tabel warna terpisah. Dengan kata lain, meski gambar 8 bit juga ber-depth 8 bit, 8 bit itu adalah indeks ke tabel pencarian warna dan bukan warna sungguhan. Gambar GIF adalah contoh yang baik. Transparansi pada gambar semacam itu biasanya ditangani dengan menetapkan satu warna tertentu sebagai penanda transparansi (disetel dengan pengaturan metadata "-transparent-color") seperti pada format GIF, atau dengan memakai profil khusus untuk sejumlah warna tertentu dalam tabel warna (seperti yang dipakai sebagian gambar PNG8, yang juga gambar berindeks warna seperti GIF). Secara umum...

Gambar 24 bit : 3 x nilai 8 bit - hanya 3 kanal warna
Gambar 32 bit : 4 x nilai 8 bit - 3 warna + kanal Alpha
Gambar 8 bit : gambar berindeks warna 8 bit, dengan batas 256 warna

Karena kebanyakan format gambar hanya menyimpan nilai warna pada depth 8 bit/nilai, banyak orang memasang IM dengan tingkat 'Q' atau Quality depth 8, yang menuntut memori jauh lebih sedikit dan memproses gambar lebih cepat daripada versi IM Q16 yang lebih lazim. Sering kali 3 kali lebih cepat atau lebih. Versi Q8 ini bekerja baik untuk pemrosesan gambar umum (memangkas dan sebagainya) dan konversi antarformat, serta bisa bekerja baik untuk menghasilkan gambar sederhana, menganotasi, atau menimpakan gambar. Namun meski IM berkualitas rendah lebih cepat dan lebih hemat memori, ia tidak bekerja baik begitu Anda mulai memakai rangkaian operasi rumit yang melibatkan banyak perubahan warna, pengubahan ukuran, penggelapan, pencerahan, koreksi warna gamma atau histogram, dan seterusnya. Pada Q8, gambar antara di memori tetap tersimpan dengan kualitas 8 bit, sehingga tiap operasi akan menambahkan distorsi warna kecil secara bertahap. Hasilnya bisa berupa efek pembulatan, terutama untuk warna ekstrem di dekat putih dan hitam. (lihat di bawah).

Quality - kualitas bit di memori

Ingat, Quality adalah pengaturan waktu kompilasi di ImageMagick, dan dipakai untuk menentukan ukuran nilai yang menyimpan gambar di memori IM dan selama pemrosesan. Nilai itu tidak dapat diubah kecuali dengan mengompilasi ulang ImageMagick dari kode sumber. ImageMagick 'Q16' (bawaan IMv7) karenanya memakai memori setidaknya dua kali lipat untuk menampung data gambar sebanyak yang ditampung versi 'Q8', dan bergantung pada CPU Anda, bisa jauh lebih lambat, meski pada prosesor masa kini hal itu tidak begitu mungkin. Serupa dengan itu, versi 'Q32' dan 'Q64' juga dapat dikompilasi, meski keduanya tidak umum dan biasanya hanya dipakai pada pemrosesan gambar kelas sangat tinggi. Lihat pula opsi kualitas kompilasi HDRI yang baru di bawah. ImageMagick 'Q16' juga memungkinkan penyimpanan lebih banyak informasi bit untuk tiap nilai piksel. Artinya, nilai warna disimpan sebagai bilangan bulat dengan rentang dari '0' sampai '2^_quality_ -1'. Nilai terakhir itu dikenal dalam pemrograman IM sebagai 'QuantumRange' saat ini (atau nama lamanya yang sudah usang, 'MaxRGB'). Makin tinggi pengaturan Quality yang dipakai saat mengompilasi IM, makin presisi nilai warna saat gambar disimpan di memori. Artinya, bila dalam memproses gambar Anda menghasilkan banyak variasi warna yang sangat kecil dan halus, variasi itu akan terjaga pada penyimpanan ImageMagick di memori, dan dapat dipakai pada tahap pemrosesan berikutnya. Operasi seperti pengubahan ukuran, filter noise, blur, penajaman, perataan, perubahan warna global, gamma, dan histogram, atau banyak operasi komposisi gambar yang rumit, semuanya dapat menimbulkan error warna yang tidak diinginkan pada IM Q8, sehingga muncul artefak warna yang sangat kentara pada gambar hasilnya. Tentu saja menyimpan gambar akhir ke format gambar ber-'depth' 8 bit akan 'mengkuantisasi' nilai warna itu kembali ke 8 bit, tetapi selama pemrosesan gambar di memori, kualitas gambar antaranya tetap terjaga. Ada beberapa format yang mempertahankan informasi tingkat kualitas lebih tinggi yang dipakai IM. Misalnya format IM MIFF, format piksel terenumerasi TXT, serta format gambar NetPBM. Namun meski versi IM Q8 memungkinkan keluaran gambar ber-depth 16 bit, gambar semacam itu tetap hanya membawa informasi setara depth 8 bit, sebab kualitasnya memang tidak ada di memori untuk disimpan. | _Bila IM membaca gambar memakai nilai 8 bit (banyak format gambar begitu), 'depth' gambarnya akan disetel ke 8 bit, dan saat disimpan IM biasanya akan menyimpan gambar itu pada depth nilai 8 bit yang sama, meski Anda memprosesnya dengan IM versi Q16. Pengaturan ini dapat ditimpa, atau pengaturan "-depth" untuk gambar tersebut dibersihkan, sehingga IM akan menyimpannya pada depth terbaik yang mungkin agar sepadan dengan kualitas IM di memori.

Perhatikan pula bahwa banyak operator yang menghasilkan warna tambahan, seperti Mengubah ukuran gambar, juga akan mengembalikan 'depth' gambar di memori ke pengaturan kualitas waktu kompilasi, sehingga IM lalu akan berusaha menyimpannya pada depth yang lebih tinggi bila mungkin.

_

HDRI - kualitas floating point

HDRI, atau High Dynamic Range Imaging, semula dirancang untuk merepresentasikan secara lebih alami kemampuan mata kita melihat area terang dan gelap sebuah pemandangan sekaligus. Dalam praktik pemrosesan gambar, ia melakukan jauh lebih banyak dari itu. Versi HDRI dari IM (build bawaan) dikompilasi untuk memakai nilai floating point bagi gambar yang disimpan di memori, agar operasi gambar dapat ditangani secara HDRI dengan lebih tepat, sehingga operasi semacam itu tidak 'memotong' warna gambar di ujung-ujungnya. HDRI memakai rentang warna yang sama dengan pengaturan Quality waktu kompilasi untuk penyimpanan di memori. Artinya, nilainya tetap berkisar dari '0' sampai 'Quantum Range' sebagai makna hitam sampai putih. Namun nilainya disimpan memakai floating point ('doubles' dalam istilah pemrograman C) dan bukan bilangan bulat, sehingga efek 'kuantum' dari pembulatan nilai menjadi bilangan bulat tidak akan terlihat. Nilainya juga tidak 'dipotong' ketika melampaui 'Quantum Range' atau menjadi negatif. Pada dasarnya informasi yang hilang di antara tahap-tahap pemrosesan jauh lebih sedikit. Karena itu HDRI vital bila Anda berencana memakai pemrosesan matematis yang sangat berat atas gambar, yang melibatkan nilai negatif sementara, atau penskalaan kuat ke nilai yang sangat kecil atau sangat besar. Ia terutama penting bagi pengguna yang ingin memanfaatkan sepenuhnya kemampuan Fast Fourier Transform (FFT), dan di sanalah paling banyak contoh versi HDRI dari IM akan Anda temui di halaman-halaman ini. Untuk keterangan tentang mengompilasi versi HDRI dari IM lihat Enabling HDRI in ImageMagick di situs utama IM; untuk keterangan khusus Windows dan Ubuntu Linux lihat pula Fourier Transforms Announcement Discussion di forum pengguna. Satu operator penting yang perlu diingat saat memakai HDRI adalah "-clamp". Opsi ini akan memotong nilai dalam gambar yang jatuh di luar rentang normal gambar. Artinya, nilai negatif apa pun dipotong menjadi nol, dan nilai apa pun yang lebih besar dari 'QuantumRange' disetel ke nilai itu. Namun ia TIDAK 'membulatkan' nilai floating point menjadi bilangan bulat.

Efek kuantum, HDRI vs non-HDRI

Pembulatan kuantum... Sebagai contoh, di sini saya memakai operator Level dan Reverse Level untuk memampatkan rentang warna sebuah gambar gradien sehingga hanya memakai nilai 0 sampai 15, lalu memuaikannya lagi. Gradien hasilnya juga ditampilkan sebagai profil gambar (memakai skrip "im_profile") agar lebih mudah diikuti. |

  # Using a normal non-HDRI version of IM...
  magick -size 20x600 gradient:  -rotate 90 \
          +level 0,15  -level 0,15  level_rounding.png
  im_profile -s level_rounding.png  level_rounding_pf.gif

[IM Output]

[IM Output]

Perhatikan pembulatan parah (efek kuantum) yang kini terlihat, membentuk anak tangga pada profil gradiennya. Karena hanya 16 nilai tingkat abu-abu yang dipakai, gambarnya praktis dikonversi ke kedalaman warna 4 bit saja! Perhatikan bahwa masalah pembulatan kuantum semacam ini menjadi sangat lazim pada IM versi Q8, sekadar dengan melakukan beberapa tugas pemrosesan gambar di luar resize dasar dan pemangkasan gambar. Hal yang diatasi IM Q16 yang lebih lazim dengan penggunaan memori tambahannya. Pembulatan kuantum baru menjadi masalah bagi IM Q16 bila Anda memakai pemrosesan gambar yang benar-benar berat, seperti Fast Fourier Transform (FFT), atau penggabungan gambar dengan waktu pajanan (intensitas cahaya) berbeda untuk menghasilkan High Dynamic Range Image. Toh untuk itulah HDRI ditambahkan ke ImageMagick sejak awal. Burning dan clipping... Dan di sini saya 'meregangkan' gradiennya sehingga nilai warna hitam dan putih aslinya melampaui jauh "Quantum Range", sebelum dipulihkan lagi. |

  # Using a normal non-HDRI version of IM...
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%  +level 20%    level_clipping.png
  im_profile -s level_clipping.png  level_clipping_pf.gif

[IM Output]

[IM Output]

Terlihat bahwa IM biasa kehilangan informasi di kedua ujungnya. Nilai di ujung bawah 'terbakar' saat nilainya menjadi negatif, sementara nilai di ujung atas 'terpotong' saat melampaui batas maksimum 'Quantum Range' dari bilangan bulat yang dipakai menyimpan nilai itu. Hasil versi HDRI dari ImageMagick... Mengulang kedua operasi itu dengan versi HDRI dari ImageMagick tidak akan menghasilkan pembulatan, pembakaran, atau pemotongan seperti di atas, tetapi ada biaya tambahan dari sisi memori (doubles butuh ruang lebih besar daripada bilangan bulat). Dari sisi kecepatan, biayanya tidak besar, dan pada banyak perangkat keras komputer modern masa kini justru bisa lebih cepat berkat akselerator floating point.

  # Using HDRI version of IM...
  magick -size 20x600 gradient:  -rotate 90 \
          +level 0,15  -level 0,15  level_rounding_hdri.png
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%  +level 20%    level_clipping_hdri.png
  im_profile -s level_rounding_hdri.png  level_rounding_hdri_pf.gif
  im_profile -s level_clipping_hdri.png  level_clipping_hdri_pf.gif

[IM Output] [IM Output]

Seperti terlihat, gradiennya tetap utuh sempurna, bahkan setelah pemampatan atau peregangan berat atas gambar itu dan dikembalikan lagi.

Clamp untuk memaksakan batas nilai gambar pada HDRI

Gambar HDRI dapat dipaksa 'terpotong' oleh rentang nilai gambar yang normal dengan memakai "-clamp" di antara kedua opsi level. Sebagai contoh... |

  # Using a HDRI version of IM...
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%    -clamp   +level 20%   level_hdri_clamp.png
  im_profile -s level_hdri_clamp.png  level_hdri_clamp_pf.gif

[IM Output]

Penggunaan "-clamp" di atas pada dasarnya menghasilkan gambar yang sama dengan yang akan saya dapat dari versi ImageMagick non-HDRI biasa. Namun gambar ini tidak akan persis sama dengan hasil non-HDRI, sebab meski "-clamp" membakar dan memotong nilai dalam gambar, ia tidak menambahkan efek pembulatan kuantum. Karena itu nilainya baru dibulatkan menjadi bilangan bulat saat penyimpanan akhir ke format file gambar non-HDRI. Opsi "-clamp" bisa sangat penting saat memakai HDRI, untuk mencapai hasil yang Anda inginkan.

Format file HDRI

Tentu saja menyimpan gambar yang berisi nilai sangat kecil, sangat besar, atau negatif ke format file gambar biasa juga akan terpotong, terkuantisasi, bahkan berkurang warnanya, dengan alasan yang sama seperti di atas. Karena itu, bila gambar yang belum 'dinormalisasi' kembali ke skala 0 sampai 'Quantum Range' perlu disimpan, salah satu format file gambar floating point yang langka itu harus dipakai. Format gambar yang dapat menangani nilai floating point (tanpa pemotongan atau pembulatan) antara lain NetPBM PFM. Inilah satu-satunya format file gambar yang tidak menuntut opsi khusus tambahan.
Format file gambar lain juga bisa dipakai, tetapi menuntut sakelar khusus untuk menyatakan bahwa file itu harus menyimpan nilai floating point. Tepatnya, opsi coder "**-define quantum:format=floating-point**" perlu diberikan untuk meminta nilai floating point pada format file tersebut. Pengaturan "-depth" juga dapat dipakai untuk menentukan jenis nilai floating point yang dipakai. Bila "-depth 32" atau kurang (bawaan pada sebagian besar versi IM) dipakai, maka "floats" biasa yang dipakai. Tetapi bila "-depth 64" disetel, maka "doubles" yang dipakai untuk data floating point yang ditulis ke atau dibaca dari format file gambar itu. Format file gambar yang dapat memakai flag khusus ini untuk menyimpan nilai floating point antara lain... TIFF, FITS, dan MIFF. Format file data mentah RGB juga menyimpan (dan membaca) floating point, meski format itu tidak menyimpan ukuran gambar, dan pengaturan floating point-nya perlu ditentukan untuk pembacaan juga.
Opsi coder khusus lainnya adalah "-define quantum:scale=65535.0". Nilai ini akan dikalikan dengan nilai yang dibaca dari file gambar, sehingga nilai floating point ternormalisasi 0.0 sampai 1.0 diskalakan ke rentang nilai internal 0.0 sampai 65535.0. Jadi bila gambar yang Anda dapat nyaris hitam pekat saat membaca gambar floating point, coba tambahkan opsi ini untuk menskalakan nilai yang dibaca ke rentang yang sesuai.
Format file langsung dari memori ke disk, MPC, juga menyimpan nilai floating point yang dipakai versi HDRI dari IM, dan tidak memerlukan flag khusus apa pun. Namun seperti file gambar MPC mana pun, hanya versi IM yang persis sama (kompilasi tertentu) pada mesin yang sama yang akan membaca file semacam itu dengan benar. Karena itu ia hanya cocok untuk file sementara 'baca cepat' pada pemrosesan gambar berbasis skrip, bukan untuk penyimpanan jangka panjang.

Q-level mana yang sebaiknya saya pakai

Ringkasnya, jenis ImageMagick apa yang sebaiknya saya pakai? Q8, Q16, HDRI? Q8 punya jejak memori lebih kecil, sebab nilai gambar disimpan di memori sebagai nilai 8 bit, persis seperti kebanyakan format file gambar. Untuk komposisi dasar, konversi format gambar, 'resize sekali jalan' yang sederhana, atau menggambar di atas gambar, Q8 sudah 'cukup baik'. Q16 melipatduakan jejak memori sebab nilai warna disimpan dalam 16 bit (presisi lebih tinggi). Tetapi bila Anda berencana melakukan pemrosesan gambar berat yang melibatkan banyak lapis operasi, seperti perubahan ruang warna (bahkan sekadar sRGB ke/dari RGB), resize, distorsi, blur, bayangan, dan seterusnya, semuanya pada gambar yang sama dalam satu perintah yang sama (yang memang dianjurkan dengan alasan yang sama), maka 16 bit lebih baik sebab ia menjaga presisi gambar yang lebih rendah di antara tahap-tahap pemrosesan. Anda juga lalu dapat menyimpan dalam format file 16 bit (PNG, MIFF, PbmPlus) di antara perintah, meski penyimpanan akhirnya kembali ke format file gambar 8 bit seperti ICO dan JPEG. (Karena itulah ini menjadi bawaan) Tingkat berikutnya adalah Q16 HDRI , yang membawa presisi ke nilai floating point 32 bit sehingga nilai gambar yang menjadi sangat kecil atau sangat besar dapat ditangani tanpa efek pembulatan dan pemotongan. Nilai negatif pun dapat ditangani, terutama pada sebagian ruang warna. Pada dasarnya ia dipakai untuk mencegah hilangnya data gambar saat memproses gambar dalam keadaan ekstrem, seperti saat memakai gambar HDRI, transformasi Fourier, atau sekadar tingkat pemampatan dan pemuaian tinggi yang bisa muncul pada pemrosesan matematis atas data mentah. Begitulah ringkasnya. Q16 adalah jalan tengah yang baik untuk sebagian besar operasi yang melibatkan distorsi, komposisi banyak gambar, dan efek pemrosesan gambar. Q8 bila memori sempit tetapi Anda hanya melakukan operasi sederhana, HDRI bila Anda melakukan operasi yang ekstrem.

Densitas atau resolusi gambar

Densitas sebuah gambar adalah resolusi spasial (ruang) gambar itu. Artinya, densitas (umumnya dinyatakan dalam dpi, atau titik per inci) sebuah gambar menentukan seberapa jauh jarak (atau seberapa besar) tiap pikselnya, dan dengan demikian ukuran keseluruhan gambar dalam ukuran dunia nyata, dan umumnya dipakai untuk menampilkan atau mencetak gambar pada perangkat dunia nyata. Ia sekadar suatu angka yang tersimpan bersama gambar untuk memberi tahu perangkat keluaran seperti printer dan layar, berapa titik (atau piksel) per inci gambar itu harus ditampilkan, ATAU, untuk format vektor seperti postscript, PDF, MWF, dan SVG, skala piksel untuk menggambar memakai koordinat dunia nyata mana pun yang mungkin dipakai di dalam gambar. Densitas sama sekali tidak berkaitan dengan ukuran piksel gambar yang sebenarnya, ataupun dengan Quality di memori dan Depth format file penyimpanan yang menentukan 'resolusi' warna gambar. Resolusi atau densitas sebuah gambar dapat disetel saat gambar dibaca ke IM dengan fungsi "-density" sebelum membaca atau menulis gambar, atau dengan "-set density" setelah gambar dibaca. Pengaturan "-units" dapat dipakai untuk menentukan apakah angka densitas dinyatakan dalam satuan bawaan (percetakan tradisional) 'PixelsPerInch' atau dalam satuan metrik yang lebih modern 'PixelsPerCentimeter' (PNG memakai yang terakhir). Sebagai contoh, gambar 200x200 piksel pada 600 dpi akan ditampilkan seluas 1/3 inci persegi dalam ukuran dunia nyata. Sebaliknya, gambar 72x72 piksel yang jauh lebih kecil pada 72 dpi akan tampil seluas 1 inci persegi di dunia nyata, meski kualitas spasialnya tidak akan sebagus itu sebagai perbandingan. Yang pertama berkualitas 'foto', yang kedua beresolusi 'layar'. Dalam praktiknya, gambar 72dpi akan tampak 'digital' atau 'berbintik' di printer. Sebaliknya, foto digital modern berukuran besar yang diambil pada 1200dpi mungkin perlu di-resample untuk ditampilkan di layar, atau Anda hanya akan melihat sebagian kecil gambarnya. Untuk keterangan lebih lanjut tentang resolusi dan densitas gambar lihat catatan pada Operator resize Resample. Untuk keterangan tentang resolusi dan densitas teks dan font lihat Pointsize, densitas, dan ukuran font sebenarnya.

Photoshop dan densitas

Penyunting gambar "Photoshop" menyimpan salinan tambahan resolusi gambar ke dalam profil terpisah (bernama '8BIM') di dalam gambar, yang TIDAK akan disentuh IM. Karena itu, bila Anda mengubah resolusi sebuah gambar dengan IM, sebaiknya profil-profil itu juga dibuang dari gambar sebelum dimuat kembali ke "photoshop", atau perubahan densitasnya bisa jadi tidak terlihat. Profil itu saja dapat dibuang dari gambar dengan "+profile 8bim". Dari sebuah diskusi forum IM, Jesper Nilsson (alias stroker) menyarankan pemakaian program "exiftool' untuk langsung mengubah Tag Photoshop pada gambar. Sebagai contoh

  exiftool -g -Photoshop:XResolution=300 -Photoshop:YResolution=300 file.tif

Uji kecepatan berdasarkan Quality

Beberapa uji kecepatan dikirimkan ke Forum IM, Q8 vs. Q16 speed (& HDRI). Hasil kasar dari artikel di atas

  • Jumlah memori yang dipakai per piksel per kanal sesuai dugaan. Q8 - 1 byte, Q16 - 2 byte, Q32 & HDRI mana pun - 4 byte, Q64 (HDRI) - 8 byte.
  • 64bit memberi peningkatan presisi yang berarti untuk operasi floating point, tetapi begitu pula versi HDRI mana pun dari ImageMagick.
  • Dari sisi kecepatan, Q8, Q16, dan HDRI kurang lebih sama cepatnya (dengan asumsi komputer punya MPU floating point), Q32 sekitar 25% lebih lambat dan Q64 (HDRI) sekitar 50% lebih lambat.

| Perhatikan bahwa Q64 otomatis memakai "double long floats", bukan bilangan bulat 64 bit. Ia semacam HDRI presisi ganda, tetapi meski sangat presisi, ia yang paling lambat di antara semua pengaturan kualitas di memori, dan paling banyak memakan memori.
| _Kecepatan sebenarnya bergantung pada spesifikasi komputer Anda, dan pada ada tidaknya Math Co-Processor. Bila hal itu tidak penting, memakai Q16 bawaan, atau HDRI standar, barangkali yang terbaik.

Bila hal itu penting, lakukanlah uji kecepatan serupa pada perangkat Anda sendiri, tetapi dengan operasi yang biasanya Anda perkirakan akan dipakai dalam pemrosesan gambar Anda.

_


Kendali khusus ImageMagick

IM juga punya beberapa opsi khusus yang dipakainya untuk mengendalikan cara kerja operasionalnya, pelaporan informasi, dan keperluan debugging. -version | Mengeluarkan versi IM, kualitas gambar yang dipakainya, dan kapan ia dibangun. IM akan keluar secara implisit setelah mengeluarkan informasi ini. | | Pada IMv7, "-version" akan keluar bila ia SATU-SATUNYA opsi pada baris perintah. Artinya, argumen 'penulisan implisit' terakhir menjadi opsional. Bila ada argumen lain, ATAU bila ia dibaca dari skrip (file atau pipeline), perintah magick tidak akan keluar, melainkan lanjut.
-list | Ini opsi informasional belaka: ia akan menampilkan item yang diminta, lalu keluar. Artinya, opsi ini tidak dapat dipakai bersama opsi lain mana pun, atau bersama pemrosesan gambar. Ia semata-mata disediakan untuk keperluan informasi, terutama dalam skrip, untuk memeriksa opsi masukan dan apakah IM sudah mengimplementasikan opsi tertentu. Argumen yang diberikan menentukan informasi apa yang ingin ditampilkan. Misalnya daftar nama 'color' yang dapat dipakai (seperti yang dipakai oleh ("-fill", "-background", "-mattecolor", "-bordercolor"). Sedangkan 'font' menampilkan font yang secara khusus dikenal IM. Berikut beberapa daftar yang lebih menarik... | list | daftar apa saja yang bisa ditampilkan "-list"!
font | Font yang dikenal (IM juga mengenal font X dan PS)
type | jenis gambar file ("-type" )(setelah IM v6.3.5-7)
atau daftar font (sebelum versi IM tersebut)
color | nama warna yang dikenal untuk berbagai opsi warna.
dispose | semua pengaturan disposal GIF ("-dispose")
compose | komposisi alpha yang tersedia (termasuk metode internal)
layers | metode "-layers" banyak gambar apa saja yang sudah diimplementasikan
distort | Metode distorsi gambar yang tersedia.
morphology | Metode morfologi gambar yang tersedia.
kernel | Kernel morfologi/konvolusi yang tersedia.
command | opsi baris perintah apa saja (baik pengaturan maupun operator) yang tersedia
configure | parameter konfigurasi apa yang dipakai untuk membangun ImageMagick
Pengaturan 'list' terakhir itu, 'Configure', sangat penting, sebab ia memberi tahu pustaka dan delegate apa saja yang tersedia saat IM dibangun. Ia juga menyertakan nomor rilis 'point', yang tidak ada pada keluaran "-version" biasa di versi-versi lama. (Lihat Penanganan versi dalam skrip untuk satu contoh pemakaian informasi ini. IM akan keluar secara implisit setelah mengeluarkan informasi ini. | Pada IMv7, "-list" akan keluar bila ia SATU-SATUNYA opsi pada baris perintah. Artinya, argumen 'penulisan implisit' terakhir menjadi opsional. Bila ada argumen lain, ATAU bila ia dibaca dari skrip (file atau pipeline), perintah magick tidak akan keluar, melainkan lanjut.
-verbose | Melaporkan info tambahan pada sebagian operasi yang lebih rumit.
Misalnya "-segment", yang mengeluarkan banyak rincian kuantisasi warna.
Dan "-distort", yang mengeluarkan informasi tambahan serta padanan 'FX' dari distorsi gambar yang diminta. Juga memantau jumlah perubahan saat mengiterasi operasi "-morphology".Ini terutama berguna untuk menghasilkan informasi gambar yang lebih rinci dari keluaran "info:" dan "-identify". Pengaturan ini dapat dimatikan dengan bentuk 'plus' dari opsinya, "+verbose".
-regard
-warnings
| '-regard-warnings' akan membuat sebagian peringatan informatif tentang beberapa format file gambar menjadi fatal. Ia juga membuat IM mengembalikan status keluar yang semestinya sesuai kondisi error tersebut. Opsi ini dapat dipakai dalam skrip untuk 'membersihkan' file gambar yang berasal dari sumber tak terkendali. Artinya, opsi ini akan membuat IM gagal dan keluar bila gambar JPEG atau TIFF-nya tidak benar, tidak lengkap, atau memuat profil 'unknown'.
-precision {number} | Mengendalikan jumlah angka penting.
Ketika IM mengeluarkan nilai floating point sebagai tanggapan atas berbagai permintaan debugging, verbose, atau pemformatan, pengaturan ini menentukan seberapa presisi keluaran itu. Secara bawaan ia membatasi angka semacam itu sampai 6 angka penting, tetapi operator ini dapat menaikkan atau menurunkan nilai bawaan tersebut. Pengaturan bawaan 6 itu juga dapat diubah lewat variabel lingkungan 'MAGICK_PRECISION'. Ia memengaruhi keluaran dari...

-quiet | Jangan laporkan pesan peringatan informasional. Hanya error yang sebenarnya seperti error I/O, atau opsi yang salah, dan sebagainya. Ini terutama berguna untuk "-crop" atau "-trim" dan "-layers optimize" yang biasanya melaporkan peringatan 'missed images' bila operatornya tidak menghasilkan gambar yang 'nyata'. Opsi ini juga akan mendiamkan coder sebagian format file gambar rumit yang bisa memuat 'unknown chunks' yang biasanya diabaikan IM. Misalnya saat IM membaca gambar TIFF, atau format video MPEG (AVI) yang aneh.
-respect
-parenthesis
| Membuat tanda kurung tidak hanya menyimpan dan memulihkan daftar gambar saat ini, tetapi juga semua pengaturan operasional saat ini ikut disimpan dan dipulihkan. Artinya, bila opsi ini diberikan, pengaturan apa pun yang disetel di dalam tanda kurung akan dikembalikan saat tanda kurungnya berakhir. Lihat contoh-contohnya di Tanda kurung dan pengaturan di atas.
-ping | Untuk perintah "identify". IM akan berusaha menghindari pembacaan dan pendekodean penuh format file gambar untuk informasi dasar seperti ukuran gambar.
-monitor | Melaporkan persentase pemrosesan selama tiap tahap pemrosesan gambar, terutama untuk tugas pemrosesan gambar yang sangat besar atau panjang. Pada API tingkat lebih rendah, Anda akan memakai SetImageInfoProgressMonitor() atau SetImageProgressMonitor()
-debug | Melaporkan secara rinci apa persisnya yang sedang dilakukan IM, di berbagai area. Argumennya adalah daftar opsi yang dipisahkan koma, seperti... | exception | Apa yang tidak dipahami IM dari perintah itu
cache | Melihat berapa banyak ruang disk yang di-cache IM
configure | Menampilkan upaya pencarian IM untuk menemukan file konfigurasinya.
trace | Melaporkan titik trace pada awal tiap fungsi pustaka
annotate | Melaporkan metrik font saat sebuah font dipakai dengan "-annotate".
command | IMv7 -- menampilkan opsi baris perintah (atau skrip) saat sedang diproses. Mis.: pemrosesan opsi.
all | Menampilkan tiap titik trace selama pemrosesan
Ini sangat sangat SANGAT verbose dan tidak dianjurkan
Bila "-debug" dipakai, lokasi keluaran log dikendalikan oleh file "log.xml". Secara bawaan ini disetel ke "console". Agar tersimpan ke file, ubah <log output="console"/> menjadi <log output="file"/> Untuk penggunaan baris perintah dan API, Anda juga dapat mendefinisikan variabel lingkungan untuk menyetel tingkat debug tindakan yang dilakukan IM.

  export MAGICK_DEBUG=all

Membatasi ukuran gambar (catatan singkat)

Untuk mencegah pemakaian memori berlebih, setel batas memori Anda ke katakanlah 16GB. Lalu setel
batas disk ke 4GB. ImageMagick akan keluar bila batas disk terlampaui,
dengan eksepsi "cache resource exhausted".