Contoh penggunaan ImageMagick -- penanganan file gambar
- Pengubah baca
- Penanganan meta-karakter pada nama file masukan
- Gambar terkompresi GZip
- Atribut yang tersimpan
- Gambar terenkripsi
- Menulis banyak gambar (adjoin)
- Nomor urutan (scene) awal
-
Menulis satu gambar berkali-kali
Format file keluaran khusus (khas IM)
miff:info:null:txt:sparse-color:histogram:mpr:mpc:fd:inline:clipboard:-- baca/tulis dari/ke clipboard Windowsephemeral:-- hapus otomatis setelah dibacashow:,win:, danx:-- tampilkan gambar secara langsungx:(sebagai masukan) -- tangkap tampilan lalu gambar ulang Delegate dan coder untuk format gambar - Contoh delegate keluaran
- Mendaftar delegate dan file sumbernya
- Delegate pencetakan
- Menjalankan perintah eksternal
- Delegate Postscript dan PDF
- Konversi format langsung oleh delegate (taint)
-
Penanganan gambar yang benar-benar masif Stream panjang berisi banyak gambar, urutan video Untuk memproses sebuah gambar, kita tidak hanya memerlukan operator yang bekerja pada gambar, tetapi juga cara untuk membaca dan menulis gambar dalam sebanyak mungkin format file yang berbeda. Pada bagian ini kita melihat format file IM secara umum.
Ringkasan format gambar
Salah satu penggunaan ImageMagick yang paling umum justru sama sekali bukan mengubah gambar, melainkan sekadar mengonversi gambar dari satu format ke format lain. Konversi format gambar semacam inilah yang sebenarnya menjadi alasan awal lahirnya IM. Itu sebabnya perintah utama IM diberi nama "magick". Untuk keperluan itu ImageMagick sanggup menangani deretan format gambar dan format file yang membingungkan banyaknya. Ditambah lagi sejumlah besar format masukan dan keluaran khusus untuk gambar uji bawaan, pembuatan gambar sederhana, serta format gambar yang khusus untuk pemrograman skrip shell dan program. Daftar lengkapnya ada di halaman format gambar IM pada situs web IM. Semua ini bisa terasa menakutkan bagi pengguna baru ImageMagick. Saran terbaik saya: abaikan saja sebagian besar format file itu, karena kemungkinan besar Anda tidak akan pernah memerlukannya. Berkonsentrasilah pada apa yang ingin dikerjakan, lalu cobalah mengerjakannya. Kalau belum tahu caranya, carilah contohnya di halaman-halaman ini dan di seantero web. Untuk format gambar yang dicontohkan di IM Examples, lihat indeks referensi, format file.
Membaca gambar
Secara bawaan IM berusaha menentukan jenis format gambar dari kode identifikasi file 'magic' yang ada di dalam file itu sendiri. Bila cara ini gagal, format file gambar harus ditentukan lewat sufiks nama file, atau dengan menambahkan prefiks format. Sebagian format tidak membaca file apa pun dan mengabaikan nama file yang diberikan. Berikut beberapa gambar bawaan yang umum dipakai...
logo: granite: rose:
Sebagian di antaranya menghasilkan gambar berdasarkan argumen yang diberikan sebagai nama file, dan mungkin tambahan "-size" yang mengendalikan ukuran akhir gambar...
-size 30x30 canvas:red
-size 30x30 gradient:yellow-lime
-size 30x30 pattern:fishscales
magick import:
Dalam beberapa kasus beberapa format bahkan bisa dipakai sekaligus...
-size 30x30 tile:pattern:gray95
Namun untuk kasus ini hal itu berlebihan, sebab coder format 'pattern:' sudah memuat coder 'tile:' di dalamnya. Meski begitu, cara ini memperjelas apa yang sebenarnya ingin dilakukan. IM juga dapat mengunduh gambar yang diterbitkan di 'world wide web' dengan menyebutkan URL gambar tersebut. Pada dasarnya ini menyediakan coder gambar 'http:', dan itulah sebabnya cara ini berhasil. |
magick http://www.ict.griffith.edu.au/anthony/images/anthony_castle.gif \
-resize 100x100 castle_logo.png
![[IM Output]](../static/img/files/castle_logo.png)
Seperti terlihat, perintah ini membaca gambar dari WWW dan mengubah ukurannya sebelum akhirnya menyimpan hasilnya ke disk. | Bila format file diberikan sebagai prefiks, sufiks apa pun yang menjadi bagian nama file tidak berpengaruh pada cara file itu dibaca. Justru hal ini sangat penting saat membaca sebagian format file, misalnya penanganan format "text:" versus "txt:". Tentu saja bila sebuah generator gambar memang membaca file gambar untuk diproses dengan cara khusus (contohnya "tile:"), format file pada sufiks (atau prefiks) kembali menjadi penting, seperti pada contoh terakhir tadi
Prefiks coder khusus "implicit::" dapat dipakai untuk 'mematikan' pemakaian coder apa pun, sehingga ':' boleh muncul di dalam nama file. Nama file boleh menyisipkan 'meta-karakter file' khusus seperti '*' dan '?'. IM akan mengembangkan karakter-karakter itu menjadi daftar nama file yang akan dibaca, sehingga tidak perlu bantuan shell eksternal, sekaligus terhindar dari masalah batas panjang baris perintah. Sebagai contoh...
magick montage '*.jpg' -geometry 50x50+2+2 image_index.gif
Perintah ini menghasilkan satu gambar indeks montage berisi seluruh file JPEG di direktori saat ini. Perhatikan bahwa saya perlu mengapit argumennya dengan tanda kutip supaya nama file dikembangkan oleh ImageMagick, bukan oleh shell UNIX saya. Spesifikasi "magick montage" yang lebih lengkap ada di bawah. Tentu saja shell linux juga dapat mengembangkan karakter '*' dan '?' yang diberikan tanpa tanda kutip. Namun dalam beberapa kasus Anda bisa terbentur 'batas baris perintah' bila daftar file berkembang menjadi sangat banyak nama file. Berikut contoh lain pemakaian shell linux untuk mengembangkan nama file...
magick image_[0-9].gif image_[1-9][0-9].gif animation.gif
magick image_?.gif image_??.gif image_???.gif animation.gif
magick image_(?|??|???|????).gif animation.gif
Lihat juga Membaca frame, pengubah baca di bawah, untuk nomor berformat yang bertambah di dalam nama file. Bila nama file hanya berupa string satu karakter '-', IM membaca gambar dari standard input. |
cat tree.gif | magick - -frame 5x5+2+2 read_stdin.gif
![[IM Output]](../static/img/files/read_stdin.gif)
Perhatikan bahwa sebagian format file gambar memungkinkan beberapa file gambar sekadar disambung menjadi satu stream panjang multi-gambar. Format semacam itu antara lain format gambar PbmPlus/NetPBM yang sederhana, serta format file khusus milik IM sendiri, MIFF: |
for image in eye.gif news.gif storm.gif
do
magick $image miff:-
done |
magick - -frame 5x5+2+2 +append read_multiple_stdin.gif
![[IM Output]](../static/img/files/read_multiple_stdin.gif)
Karakter khusus '@' di awal nama file berarti gantilah nama file itu dengan isi file yang diberikan. Artinya, Anda bisa membaca sebuah file yang berisi daftar file! |
echo "eye.gif news.gif storm.gif" > filelist.txt
magick @filelist.txt -frame 5x5+2+2 +append filelist.gif
![[IM Output]](../static/img/files/filelist.gif)
'@' juga dapat dipadukan dengan nama file khusus '-' untuk membaca daftar nama file dari standard input. |
echo "eye.gif news.gif storm.gif" |\
magick @- -frame 5x5+2+2 +append filelist_stdin.gif
![[IM Output]](../static/img/files/filelist_stdin.gif)
| Pembacaan daftar nama file dari sebuah file dengan sintaksis '@' ditambahkan pada IM v6.5.2-1.
| Sebagai langkah pengamanan, cara ini hanya berlaku untuk file gambar sungguhan. Cara ini tidak berlaku untuk generator gambar seperti "rose:" atau "label:string", dan tidak dapat dipakai untuk 'menyertakan' opsi baris perintah dari sebuah file.
Pengubah baca atau pengaturan extract
Gambar dapat diubah begitu selesai dibaca ke memori, tetapi sebelum gambar itu benar-benar ditambahkan ke urutan gambar saat ini. Untuk itu tersedia pengaturan "-extract". Sebagai contoh, di sini saya memangkas gambar rose... |
magick -extract 32x32+20+5 rose: +repage rose_extract.gif
![[IM Output]](../static/img/files/rose_extract.gif)
Cara lain, tambahkan pengubah baca di ujung nama file memakai kurung siku '[...]'. Sebagai contoh... |
magick 'rose:[32x32+20+5]' +repage rose_read_modifier.gif
![[IM Output]](../static/img/files/rose_read_modifier.gif)
Namun perhatikan bahwa karakter '[]' biasanya juga merupakan meta-karakter khusus shell, jadi bila dipakai sebaiknya pengubah tambahan itu diapit tanda kutip agar tidak ditafsirkan oleh shell UNIX. Pengaturan "-extract" dan pengubah baca mengerjakan tugas yang sama, hanya saja yang belakangan menimpa yang pertama. Selain itu, saat memakai pengubah, biarkan IM sendiri yang menangani meta-karakter pengembangan nama file seperti '*' dan '?', sebab shell UNIX tidak akan 'menemukan' file yang diminta gara-gara pengubah tersebut. Apa yang terjadi dalam keadaan itu bergantung pada shell-nya. Karena itu seluruh nama file sebaiknya diapit tanda kutip bila memakai pengubah baca. Tujuan sebenarnya dari pengubah baca ini adalah membatasi kebutuhan memori, dengan membuang gambar yang tidak diinginkan atau mengecilkan gambar selagi gambar masih dibaca ke memori. Misalnya ketika membaca seluruh isi direktori berisi gambar JPEG berukuran besar. Berikut daftar seluruh pengubah baca khusus (dan pengaturan "-extract" ) beserta efeknya. '#' mewakili suatu angka.
- '
[#]' '[#-#]' '[#,#,#]'[#,#-#,#]'. Membaca frame -
Memilih sub-frame tertentu dari format file multi-gambar pada gambar yang baru dibaca. Angka indeks '
#' yang diberikan menentukan nomor frame yang dibaca. Beberapa indeks sekaligus dapat ditulis dengan koma atau sebagai rentang indeks. Indeks gambar dimulai dari nol untuk gambar pertama, 1 untuk gambar kedua, dan seterusnya. Bila indeksnya negatif, penghitungan dimulai dari ujung urutan gambar secara terbalik: -1 untuk gambar terakhir, -2 untuk gambar kedua dari belakang. Konvensinya persis sama dengan yang dipakai operator daftar gambar. Sebagai contohmagick document.pdf'[0]' first_page_of_pdf.gif magick animation.gif'[1-3]' second_to_fourth_frames.gif magick animation.gif'[-1,2]' last_then_the_third_frame.gif
IM juga bisa diminta membaca gambar berdasarkan daftar angka. Sebagai contoh..
magick 'image_%03d.png[5-7]' ...
akan membaca file "image_005.png", "image_006.png", dan "image_007.png". Dengan cara ini indeks negatif tidak dapat dipakai.
- '
[#x#]' Mengubah ukuran saat baca -
Sejak IM versi 6.2.6-2 ditambahkan pengubah baru untuk membantu pengguna IM menangani gambar yang sangat sangat besar. Pengubah ini mengubah ukuran gambar yang baru saja dibaca, tepat sebelum gambar itu ditambahkan ke gambar lain yang sudah ada di memori. Ukurannya bisa diperkecil maupun diperbesar. Sebagai contoh... |
magick pattern:gray95'[60x60]' enlarged_dots.gif
![[IM Output]](../static/img/files/enlarged_dots.gif)
Peringatan: untuk saat ini pengubah baca sama sekali tidak memakai flag resize seperti '!' (tidak mempertahankan rasio aspek) atau '>' (hanya memperkecil gambar yang lebih besar. (mungkin kalau Anda mengajukan permintaan?) Pengubah ini juga bisa dipakai sebagai cara lain menentukan ukuran kanvas warna polos. Yang sebenarnya terjadi adalah pengubahan ukuran gambar bawaan berukuran satu piksel. Sebagai contoh... |
magick 'canvas:DodgerBlue[50x50]' canvas_size.gif
![[IM Output]](../static/img/files/canvas_size.gif)
Pengubah ini paling penting saat Anda hendak membaca banyak gambar yang sangat sangat besar, sebab setiap gambar diubah ukurannya sebelum gambar berikutnya dibaca, sehingga total memori yang dibutuhkan untuk menangani gambar-gambar itu jauh berkurang. Misalnya, alih-alih...
magick montage '*.tiff' -geometry 100x100+5+5 -frame 4 index.jpg
yang membaca dulu seluruh file tiff, baru kemudian mengubah ukurannya, lakukanlah...
magick montage '*.tiff[100x100]' -geometry 100x100+5+5 -frame 4 index.jpg
Dengan begitu setiap gambar dibaca dan diubah ukurannya sebelum berlanjut ke gambar berikutnya. Pemakaian memori jadi jauh lebih sedikit, dan swapping disk (thrashing) mungkin bisa dicegah saat batas memori tercapai.Untuk gambar JPEG saya juga menyarankan pemakaian pengaturan khusus "-define" sebagai gantinya, sehingga menghasilkan sesuatu seperti...
magick montage -define jpeg:size=200x200 '*.jpg[100x100]' -strip \
-geometry 100x100+5+5 -frame 4 index.png
Pengaturan khusus ini diteruskan ke pustaka JPEG dan dipakai untuk membatasi ukuran gambar JPEG selama proses pembacaan. Namun hasilnya tidak persis: gambar yang dihasilkan berada di antara ukuran itu dan dua kali ukuran itu, dengan rasio aspek tetap terjaga. Rinciannya ada di membaca gambar JPEG. Gabungan keduanya membuat pembacaan jauh lebih cepat dan pemakaian memori untuk gambar JPEG lebih hemat lagi. Terutama saat menghasilkan banyak thumbnail kecil. Lihat pembuatan thumbnail secara umum.
- '
[#x#+#+#]' Memangkas saat baca -
Sejak IM v6.3.1, bila offset ikut ditambahkan, bentuk di atas berubah menjadi pemangkasan gambar yang sedang dibaca. Misalnya, untuk mengambil bagian kecil berukuran 600x400 piksel dari gambar yang jauh lebih besar.
magick 'image.png[600x400+1900+2900]' tileimage.png
Namun cara ini membaca seluruh gambar ke memori lebih dulu, lalu memangkasnya sebelum akhirnya ditambahkan ke urutan gambar saat ini. Bila Anda ingin menangani gambar yang benar-benar besar, saya sarankan melihat perintah "stream" dan menyalurkan gambar lewat pipe ke perintah "magick" untuk pemrosesan lanjutan. Lihat penanganan gambar masif di bawah.
Bila gambar sudah di-"gzip", IM otomatis mengurai kompresinya ke sebuah file sementara sebelum berusaha mengenali format gambar dan mendekodenya. Jadi gambar bukan hanya bisa disimpan dalam format terkompresi gzip, tetapi juga langsung dipakai pada pemrosesan IM berikutnya. Untuk gambar berbasis teks yang besar, penghematan ruang disknya bisa luar biasa. | Format PNG sudah memuat kompresi "gzip" sebagai bagian dari spesifikasi formatnya. Dalam hal ini digit pertama dari dua digit pengaturan "-quality" PNG menentukan tingkat kompresinya. Rincian selengkapnya ada pada contoh format file gambar PNG.
Uraian di atas hanyalah ringkasan singkat opsi masukan khusus yang tersedia saat membaca gambar ke ImageMagick. Ringkasan lengkapnya ada di halaman Anatomi baris perintah pada situs web ImageMagick.
Seperti terlihat sebelumnya, masukan gambar dapat diubah oleh beberapa pengaturan IM, misalnya "-size" untuk pembuatan gambar dan "-define jpeg:size=??" untuk pembacaan JPEG. Opsi lain juga memengaruhi pembuatan masukan gambar, di antaranya "-page", "-type", "-dispose", "-delay". Lihat mengatur/mengubah meta-data gambar. | Berhati-hatilah saat meneruskan argumen dari pengguna ke IM di dalam skrip, dan pastikan argumen itu memang sesuai harapan. Anda tentu tidak ingin skrip pemrosesan gambar di web mengembalikan gambar berisi file password sistem.
Penanganan meta-karakter pada nama file masukan
Sedang dikerjakan
Selain shell yang menangani meta-karakter (kecuali argumen itu diapit
tanda kutip), IM juga punya penanganan meta-karakter sendiri pada nama file.
Sebagai contoh
magick *.jpg ....
dikembangkan oleh shell SEBELUM nama file diteruskan ke IM, sedangkan
magick '*.jpg' ....
membuat shell meneruskan "*.jpg" ke ImageMagick, yang lalu mengembangkannya
menjadi daftar nama file internal! Ini disediakan untuk mendukung Windows DOS, dan
sebagai cara mencegah luapan batas baris perintah pada perintah seperti
"magick mogrify" dan "magick montage", yang biasanya memproses daftar gambar yang panjang.
Jadi supaya IM benar-benar membaca file yang di disk memang bernama
'*.jpg', pakailah salah satu bentuk berikut...
magick '\*.jpg' ....
magick "\*.jpg" ....
magick "\\*.jpg" ....
magick \\\*.jpg ....
CATATAN; baris kedua TIDAK disarankan karena sebagian shell (bukan bash) dan sebagian
API (program C, mungkin juga PHP) bisa saja membuang backslash tunggalnya, lalu
meneruskan '*.jpg' ke IM yang akan mengembangkannya lagi!
Di samping '?' dan '*', IM juga menambahkan penanganan meta-karakter ':', '%'
dan '[...]' untuk pengubah baca. Namun maknanya berbeda
(penentuan codec, penyisipan nomor scene, dan pengubah baca) dari
sintaksis shell biasa untuk meta-karakter tersebut.
Sebagai contoh, pengguna DOS perlu meng-escape 'huruf drive' pada path nama file
yang diteruskan ke ImageMagick. Sebagai contoh...
magick C\:\path\to\image.jpg ....
Contoh lain adalah saat memuat gambar yang mengandung kode waktu. Sebagai contoh..
magick "time_10\:30.jpg" ....
akan membaca nama file "time_10:30.jpg" dari disk. Tanpa backslash itu, IM
bisa mengira gambar tersebut harus dibaca dengan format file gambar (atau delegate)
"time_10:" yang tidak ada, lalu gagal dengan cara yang tidak terduga.
Alternatifnya adalah memakai tanda tanya...
magick "time_10?30.jpg" ...
Namun itu bisa juga cocok dengan file lain seperti "time_10_30.jpg"!
Mengompres gambar
Sedang dikerjakan
IM juga membaca file yang telah dikompresi, asalkan diberi sufiks yang
sesuai, atau spesifikasi format gambarnya.
Artinya, gambar yang disimpan sebagai "image.gif.gz" akan diurai kompresinya dulu,
sebelum didekode dari format gambar GIF-nya.
Gambar XPixmap (xpm) dan NetPbm/PbmPlus (ppm) yang di-gzip juga ditangani secara
otomatis, baik oleh Imagemagick maupun oleh pustaka delegate biasa format itu. Jadi
bentuk terkompresinya bisa langsung dipakai di IM, maupun di program lain
yang memahami format file tersebut.
Lihat [menyimpan gambar terkompresi](#save_gzip) di bawah.
Menyimpan gambar
Memproses gambar memang penting, tetapi menyimpan hasilnya dengan cara yang tepat bisa sama pentingnya. Argumen terakhir pada "magick", "magick montage", dan "magick composite" menentukan nama file serta format gambar untuk penulisan akhir gambar (keluaran gambar bawaan). Meski begitu, gambar juga bisa disimpan di tengah-tengah rangkaian gambar memakai "-write" (lihat di bawah). Untuk menentukan format file penyimpanan gambar, Anda bisa memakai sufiks nama file, seperti yang saya pakai di hampir semua contoh ini, atau memberi prefiks string "{format}:" pada nama file. Sebagai contoh... |
magick tree.gif GIF:tree_image
Bila gambar hasilnya diperiksa, akan terlihat bahwa yang dibuat memang file gambar GIF, meskipun nama filenya sendiri tidak bersufiks ".gif". Penulisan format tidak membedakan huruf besar-kecil, jadi huruf kecil maupun huruf besar sama saja. Penentuan format gambar ini menjadi sangat penting ketika gambar hendak disimpan ke standard output perintah (memakai nama file "-"). Nama file khusus ini tidak punya sufiks, jadi ImageMagick harus diberi tahu format apa yang dipakai. Kalau tidak, gambar akan memakai format asal gambar itu (bila diketahui). Sebagai contoh, di sini kita menulis enumerasi piksel IM ke layar memakai "-" agar hasilnya keluar ke standard output.
magick tree.gif -resize 1x3\! txt:-
Cara ini juga dipakai untuk meneruskan gambar ke perintah lain seperti "magick identify" lewat 'pipeline' shell, tanpa menyimpannya ke file sementara.
magick tree.gif -resize 200% miff:- | identify -
Pada contoh ini terlihat pula bahwa nama file khusus "-" dipakai juga untuk menandai pembacaan gambar dari standard input oleh perintah "magick identify". Keterangan lebih lanjut ada pada panduan resmi Anatomi baris perintah, nama file keluaran.
Escape persen pada nama file
Nama file penyimpanan boleh memuat beberapa urutan escape persen (%) khusus, tepatnya '%d', '%x', dan '%o'. Semuanya menyisipkan 'nomor scene' gambar ke dalam nama file memakai format 'printf()' bahasa C. Keterangan lebih lanjut ada di menulis urutan multi-gambar di bawah. Tentu saja ini berarti karakter persen yang ingin disisipkan ke nama file harus digandakan ('%%'). Sejak IM v6.4.8-4, pengaturan khusus yang sudah disiapkan lebih dulu (harus diawali 'filename:') juga dapat disisipkan ke nama file akhir. Sebagai contoh... |
magick rose: -set filename:mysize "%wx%h" 'rose_%[filename:mysize].png'
![[IM Output]](../static/img/files/rose_70x46.png)
Perintah ini menyimpan gambar rose bawaan ke sebuah file yang namanya memuat ukuran gambar itu dalam piksel, tepatnya nama file "rose_70x46.png". Dengan sedikit cara berputar, setiap escape persen properti gambar jadi bisa dipakai sebagai bagian nama file keluaran. Perhatikan bahwa hanya properti gambar berbentuk '%[filename:_label_]' yang boleh dipakai di dalam nama file keluaran (selain escape '%d' biasa. Pembatasan ini ada demi alasan keamanan, dan karena nama file gambar yang sah pun bisa memuat '% dan '[]'. Peringatan: jangan menyertakan sufiks file di dalam pengaturan filename! IM tidak akan melihatnya, dan menyimpan gambar memakai format file aslinya, bukan format yang tercantum pada pengaturan filename. Artinya, nama filenya memang bersufiks seperti yang Anda tentukan, tetapi format gambarnya bisa berbeda! Pengaturan 'filename:' tidak harus sama untuk setiap gambar. Anda bisa membangkitkan, bahkan menghitung atau menetapkan pengaturan yang berbeda untuk tiap gambar yang dipakai. Berikut contoh lain: saya mengubah sebuah gambar, lalu menulisnya ke nama file baru yang dibangun dari nama file asli masing-masing gambar.
magick eye.gif news.gif storm.gif -scale 200% \
-set filename:f '%t_magnify.%e' +adjoin '%[filename:f]'
Perintah ini memperbesar setiap gambar seperti "eye.gif" lalu menyimpannya ke file "eye_magnify.gif" di direktori saat ini. Namun ketiga gambar dibaca ke memori semuanya, lalu diubah oleh satu perintah. Ini bukan solusi yang disarankan untuk sejumlah gambar besar, atau untuk gambar yang jumlahnya sangat banyak, karena batas memori bisa tercapai sehingga berlanjut ke swapping disk (thrashing). Perhatikan bahwa "+adjoin" di sini sangat penting untuk mencegah IM menyimpan semua gambar menjadi satu animasi GIF multi-gambar dengan nama file gambar pertama saja. Saya juga memastikan sufiks asli nama file tetap terjaga memakai urutan escape "%e". Biasanya menyertakan sufiks di dalam pengaturan filename adalah ide buruk, sebab IM tidak melihatnya saat sufiks itu berasal dari urutan escape ketika menentukan format file keluaran. Namun pada contoh ini formatnya tidak berubah sehingga tidak menjadi masalah. Tetap perlu kehati-hatian. Untuk mendapatkan nama file asli gambar secara persis, pakai '%d/%f' atau '%d/%t.%e'. Bisa juga '%m' sebagai ganti '%e', yaitu format sebenarnya (dengan huruf kapital) yang ditemukan IM pada file gambar aslinya (yang belum tentu cocok dengan sufiks nama file asli itu). Perhatikan bahwa untuk gambar bawaan, banyak string urutan escape ini kosong. Begitu pula bila tidak ada direktori, '%d akan kosong. Ini masalah yang sudah dikenal pada IMv7 Contoh lain pemakaian 'urutan escape nama file' ada di memangkas gambar menjadi tile, tempat teknik itu dipakai untuk membangkitkan nama file berdasarkan posisi tile yang dihitung bagi tiap gambar hasilnya. Lihat juga contoh di memakai convert alih-alih mogrify.
Sufiks GZip otomatis
IM juga otomatis meng-"gzip" gambar bila sufiks ".gz" diberikan. Sebagai contoh, di sini saya menyimpan gambar bawaan "rose:" sebagai file GIF tanpa kompresi yang di-"gzip". Kompresi LZW biasa milik GIF saya matikan, sebab kompresi itu menghalangi "gzip" mencapai kompresi terbaiknya. |
magick rose: -compress none rose.gif.gz
Cara peramban menangani gambar ter-gzip bergantung pada jenis file yang dikembalikan server web dan pada cara peramban Anda menangani gambar terkompresi. Karena itu gambar di atas tidak saya tampilkan langsung. Klik ikon 'art' untuk melihat apa yang dilakukan peramban Anda terhadap gambar semacam itu dari server web ini. Bandingkan ukurannya dengan gambar GIF terkompresi LZW yang disimpan secara biasa... |
magick rose: rose.gif
![[IM Output]](../static/img/files/rose.gif)
Rose yang di-"gzip" berukuran
byte, sedangkan rose terkompresi LZW biasa berukuran
byte. Seperti terlihat, kompresi GZIP sebenarnya sedikit lebih baik daripada kompresi LZW yang dipakai format GIF, jadi mungkin lebih cocok untuk keperluan pengarsipan. File gambar ter-gzip lebih lazim dipakai untuk penyimpanan jangka panjang format file gambar yang secara bawaan tidak punya kompresi apa pun. Termasuk di dalamnya format file IM "MIFF:" dan format file gambar NetPBM yang lebih sederhana.
Atribut yang tersimpan
Sedang dikerjakan
Pengaturan lain yang khusus untuk penulisan gambar....
-depth -quality -compress -type -loop
-set label -set comment
Lihat juga [kedalaman gambar](basics.html#depth),
[jenis gambar](basics.html#type),
[kualitas JPEG](formats.html#jpg_write),
[kualitas PNG](formats.html#png_quality).
[loop GIF](anim_basics.html#loop).
Bahas kompresi file, yang menjadi bagian dari berbagai format gambar.
Kompresi yang dipakai berbeda-beda untuk format gambar yang berbeda.
Terutama perubahan kompresi dari JPEG ke TIFF yang diperlukan.
Memakai atau "[-compress](https://imagemagick.org/command-line-options/#compress)
None" dan pemilihan format teks/biner NetPBM lewat "[-compress](https://imagemagick.org/command-line-options/#compress)".
Kompresi GIF dan paten hak ciptanya.
Selain memakai IM untuk menurunkan -quality atau mengubah formatnya ke format
lain, opsi -compression jarang dipakai. Sering kali opsi itu hanya dipakai
secara internal oleh IM untuk menyimpan gambar dengan kompresi yang sama seperti saat gambar dibaca.
Gambar terenkripsi
IM juga memungkinkan penyimpanan gambar sensitif dalam keadaan terenkripsi dengan frasa sandi, memakai opsi "-encipher" dan "-decipher". Lihat mengenkripsi gambar
Menulis banyak gambar - teknik adjoin
Masalah besar dalam menyimpan gambar adalah bahwa ImageMagick bekerja dengan urutan (daftar) gambar yang terurut, bukan satu gambar saja pada satu waktu. Karena itu IM berusaha menulis SEMUA gambar pada urutan gambar saat ini ke nama file yang diberikan. Bila format filenya mendukung banyak gambar, secara bawaan IM menyimpan seluruh gambar pada urutan itu ke dalam file gambar tersebut. Misalnya, bila Anda melihat halaman contoh penanganan dasar animasi GIF, akan terlihat bahwa beberapa frame gambar disimpan ke satu format file gambar untuk menghasilkan animasi. Bila format keluarannya tidak memungkinkan banyak gambar disimpan dalam satu file, IM justru menghasilkan banyak file. Misalnya saat menyimpan ke format gambar seperti JPEG dan PNG dan seterusnya. Perilaku ini juga bisa dipaksakan pada format gambar yang sebenarnya mendukung banyak gambar per file, seperti GIF dan PS, memakai pengaturan penanganan file keluaran "+adjoin".
magick eye.gif news.gif storm.gif +adjoin image.gif
Bila nama ketiga gambar yang dihasilkan di atas diperhatikan baik-baik, akan terlihat bahwa IM menghasilkan gambar bernama "image-0.gif" sampai "image-2.gif". |
Sebelum ImageMagick versi 6.2.0, nama file keluaran dari perintah di atas akan menjadi "image.gif.0" sampai "image.gif.2". Hal itu menimbulkan banyak masalah karena sufiks nama filenya hilang, sehingga diubah menjadi menambahkan nomor gambar sebelum sufiks nama file. |
|---|---|
Alternatifnya adalah menambahkan konstruksi 'printf() bahasa C' "%d" ke nama file keluaran. String khusus ini digantikan oleh nomor gambar saat ini untuk tiap gambar dalam urutan. |
magick eye.gif news.gif storm.gif +adjoin image_%d.gif
Di sini kita menghasilkan gambar "image_0.gif" sampai "image_2.gif", memakai garis bawah alih-alih tanda hubung yang menjadi bawaan IM. | _Selain '%d' untuk angka desimal, tersedia pula '%x' untuk angka heksadesimal (huruf kecil), '%X' untuk angka heksadesimal (huruf besar), atau '%o' untuk angka oktal.
_
| _Bila Anda benar-benar menginginkan karakter persen yang diikuti salah satu huruf tersebut, karakter persennya harus digandakan untuk meng-escape maknanya. Artinya, pakailah '%%' agar simbol persen benar-benar dihasilkan.
| '%d' pada nama file keluaran sebenarnya otomatis mengaktifkan pengaturan "+adjoin" ImageMagick.
Meski saya sebenarnya tidak memerlukan "+adjoin" pada contoh di atas, mencantumkannya tetap ide yang baik, sekadar supaya jelas bahwa yang dihasilkan adalah gambar-gambar terpisah._
Cara ini bekerja baik untuk gambar yang jumlahnya sedikit, tetapi bila gambarnya lebih dari sepuluh akan tercampur nomor satu digit dan dua digit. Dan bila lebih dari seratus, muncul pula nomor tiga digit. Saat itu terjadi, daftar isi direktori tidak lagi menampilkan gambar tersimpan sesuai urutan, sebab "image_15.gif" muncul lebih dulu secara alfabetis daripada "image_5.gif". Tentu ada cara memperbaikinya. Misalnya memakai ekspresi shell baris perintah seperti..
magick image_[0-9].gif image_[1-9][0-9].gif animation.gif
magick image_?.gif image_??.gif image_???.gif animation.gif
magick image_(?|??|???|????).gif animation.gif
magick 'image_%d.gif[0-123]' animation.gif
Cara terakhir adalah cara IM yang semestinya untuk menangani sederet file, meski Anda perlu tahu rentang angka yang hendak dipakai. '%d' memformat tiap angka agar cocok dengan nama file (lihat berikutnya)Bagaimanapun, cara ini merepotkan dan rawan salah, bisa memunculkan error bila ada file yang hilang, serta bisa bergantung pada jenis sistem komputer yang dipakai. Lebih baik masalah ini dihindari sama sekali. Kalau Anda akrab dengan bahasa 'C' (lihat halaman man sistem UNIX untuk 'printf'), kemungkinan besar sudah tahu bahwa dengan sesuatu seperti "%03d" nomor frame urutan gambar selalu berupa angka 3 digit (dengan nol di depan). Nama gambarnya kalau begitu menjadi "images_000.gif", "images_001.gif", dan seterusnya.
magick eye.gif news.gif storm.gif +adjoin image_%03d.gif
Dengan cara ini gambar bukan hanya bernomor, tetapi juga terdaftar secara alfabetis dengan benar, sehingga penanganan file gambar jauh lebih mudah. Karena itu saya menyarankan penambahan '%03d' atau apa pun yang sesuai pada nama file keluaran setiap kali Anda hendak menulis banyak gambar sebagai file gambar terpisah.
Nomor scene yang ditulis
Bila Anda ingin urutan gambar dimulai dari '1', bukan '0', dan tidak ingin mengganti nama semua file gambar hasilnya, solusi paling sederhana adalah menyisipkan gambar 'sampah' di depan urutan yang akan ditulis.
magick null: eye.gif news.gif storm.gif +adjoin image_%01d_of_3.gif
rm image_0_of_3.gif
Tentu saja "+insert" bisa dipakai untuk melakukan ini setelah pemrosesan gambar. Solusi ini memang tidak terlalu elok, tetapi berhasil, sederhana, dan kompatibel mundur dengan versi mayor IM yang lebih lama. Sejak IM versi 6.2, pengaturan "-scene" dapat dipakai untuk menetapkan nomor awal urutan gambar saat ini.
magick eye.gif news.gif storm.gif +adjoin -scene 101 image_%03d.gif
Yang menghasilkan file gambar "image_101.gif" sampai "image_103.gif".
Menulis satu gambar berkali-kali
Masih soal menulis gambar, sebuah gambar dapat ditulis dari tengah-tengah rangkaian operasi gambar memakai operator gambar khusus "-write". Ini sangat berguna bila Anda ingin mengeluarkan gambar beberapa kali pada berbagai titik selama pemrosesan gambar. Contohnya lihat pemrosesan gambar kompleks dan debugging. Berikut contohnya: saya punya foto beberapa burung nuri, atas kebaikan Kodak Lossless True Color Image Suite (gambar 23), tetapi saya ingin menyimpannya dalam berbagai ukuran memakai satu perintah saja...
magick parrots_orig.png \
\( +clone -resize x128 -write parrots_lrg.jpg +delete \) \
\( +clone -resize x96 -write parrots_big.jpg +delete \) \
\( +clone -resize x64 -write parrots_med.jpg +delete \) \
-resize x32 parrots_sml.jpg
Seperti terlihat, kita dapat memakai operator daftar gambar untuk memproses 'klona' sebuah gambar, menulis hasilnya, lalu menghapusnya dan mundur kembali ke gambar sumber aslinya, dan mengulangi proses itu sebanyak yang diperlukan. Pada kasus ini artinya saya tidak berulang kali mengubah ukuran gambar yang sama, sehingga error pengubahan ukuran tidak menumpuk. Artinya pula saya bisa saja lebih dulu menghasilkan gambar yang kecil, baru kemudian yang besar, tanpa masalah, atau mengubah gambar dengan berbagai cara berbeda untuk tiap file gambar yang dihasilkan. Jadi, urutan dan cara pengubahan tiap gambar sama sekali tidak berpengaruh! Perhatikan bahwa "+clone" sebenarnya tidak menggandakan data gambar! IM memakai proses kloning berbasis hitungan referensi yang hanya menyalin piksel gambar ketika piksel itu diperbarui. Karena itu memori yang benar-benar terpakai pada proses di atas hanya cukup untuk menampung gambar asli dan gambar baru yang dihasilkan. Hal itu juga membuat "+clone" sangat cepat dan hemat memori.
Berikut teknik lain untuk hal yang sama, tetapi menyimpan gambar aslinya ke register gambar bernama memakai "MPR:" (lihat di bawah), bukan "-clone".
magick scroll.gif -background lightsteelblue -flatten -alpha off \
-write mpr:scroll -resize x128 -write scroll_lrg.jpg +delete \
mpr:scroll -resize x96 -write scroll_big.jpg +delete \
mpr:scroll -resize x64 -write scroll_med.jpg +delete \
mpr:scroll -resize x32 scroll_sml.jpg
Di sini kita menyimpan satu salinan gambar asli ke register gambar "mpr:scroll", sebelum mengubah gambar yang masih ada di memori setelah penulisan. Perhatikan bahwa sebuah register MPR sebenarnya sanggup menampung satu urutan gambar utuh. Begitu hasil operasi itu ditulis dan dihapus dari memori, gambar asli (atau urutan gambar asli) dipulihkan, lalu prosesnya diulang sebanyak yang diperlukan. Tentu saja, seperti sebelumnya, "-write" tidak perlu dipakai pada gambar terakhir, karena gambar itu bisa langsung dikeluarkan seperti biasa. Kalau "-write" tetap dipakai, gambar terakhirnya bisa dibuang saja memakai format file khusus lain, "NULL:" (lihat di bawah).Sepatah peringatan tentang "-write": karena sebagian format file menuntut gambar berada dalam bentuk khusus untuk ditulis, operator "-write" dapat mengubah gambar. Gambar GIF misalnya bisa mengalami reduksi warna (lihat kuantisasi dan dithering). Namun format lain membiarkan gambar sumbernya apa adanya (lihat MIFF dan MPC di bawah). Bila Anda perlu melindungi diri dari perubahan itu (karena gambarnya tidak sekadar dihapus setelahnya), pakailah "+write" yang membuat klona internal gambar untuk ditulis, lalu menghapusnya setelah selesai. Namun ingat, cara itu bisa melipatduakan pemakaian memori untuk menampung salinan gambar yang telah diubah demi penulisan. Setidaknya untuk sesaat.
Format file khusus (khas IM)
Seperti terlihat di atas (dan akan digali pada bagian berikutnya, format file gambar yang umum), ImageMagick memahami sangat banyak format file gambar yang terkenal. IM juga menyertakan cukup banyak generator gambar khusus (dicontohkan pada pembuatan kanvas). Di samping itu semua ada pula beberapa format file yang sangat khusus, yang memungkinkan penanganan gambar dengan cara yang sangat khusus pula.
-
miff: -
Inilah format file ImageMagick. Seluruh urutan gambar beserta semua atribut yang menyertai gambar disimpan dalam format file ini. Tentu saja hanya perintah ImageMagick yang membaca format ini, jadi format ini tidak cocok untuk pertukaran antarpaket pemrosesan gambar yang berbeda. Tujuan utama format file "
miff:" adalah sebagai format simpan antara, saat gambar diproses dengan cara yang panjang dan rumit. Format ini juga cocok untuk 'menyalurkan' gambar dari satu perintah IM ke perintah IM lain lewat pipe, sambil meneruskan meta-data gambar dan atribut lain yang menyertainya. Saya menyarankan agar opsi "+depth" disertakan saat menulis "miff:". Opsi itu mengembalikan 'kedalaman masukan' gambar ke kualitas memori IM sehingga penyimpanan gambar antara memakai kualitas terbaik yang mungkin. Tentu saja kedalaman gambar simpanan bisa 'dipangkas' memakai "-depth 8" agar ukuran gambar di disk berkurang, namun hal itu juga memaksa munculnya efek pembulatan kuantum (kecuali penyimpanan floating-point HDRI ikut diaktifkan). Bagi yang tertarik mengurai format ini: file diawali header teks biasa berisi seluruh atribut gambar. Header itu berakhir pada satu baris yang memuat sebuah karakter formfeed. Header ini sendiri merupakan cara yang berguna untuk mengambil informasi dasar gambar di berbagai skrip pemrosesan gambar. Sebagai contoh, di sini saya memakai perintah GNU-sed untuk menampilkan header "miff:" sampai pemisah formfeed, memperlihatkan seluruh atribut gambar bawaan "rose:".magick rose: miff:- | sed -n '/^\f$/q; p'
Ini sebenarnya cukup berguna karena menyingkapkan seluruh flag pengaturan dan meta data yang IM ketahui tentang gambar itu. Namun ada pula statistik, yang dihasilkan oleh perintah "magick identify", operator "-identify", atau format khusus "info:"; bila diminta dengan opsi "-verbose". (lihat berikutnya) Format file gambar ini sangat ringan tuntutan penguraiannya, dan meski tidak terkompresi, sanggup menangani gambar jenis APA PUN yang dikenal IM. Format ini hampir menjadi format paling ideal untuk gambar sementara dan untuk perintah gambar yang disalurkan lewat pipe, walaupun hanya program ImageMagick yang bisa membacanya. Lihat juga register memori gambar "MPR" dan format pemetaan memori ke disk "MPC" di bawah. | _Data gambar mentah (biner) sebenarnya diawali urutan empat karakter "\n\f\n:", (formfeed pada satu baris tersendiri, lalu titik dua). Cara membaca data itu dikodekan di dalam data header, tetapi biasanya berupa bilangan bulat biner dalam tupel RGB. Namun kanalnya bisa lebih banyak, dan datanya bahkan bisa berupa nilai float atau double.
Dalam banyak hal format ini praktis sama dengan format file gambar PbmPlus biner, hanya dengan header yang jauh lebih luas untuk menampung meta-data gambar, serta lebih banyak variasi jumlah kanal dan tipe data._
- Streaming gambar MIFF
-
Format "
miff:" adalah format file gambar 'streaming'. Artinya, banyak gambar ditangani cukup dengan menyambung atau menderetkan gambar-gambar itu satu demi satu. Jadi 'stream' berisi banyak gambar dapat dihasilkan cukup dengan menulis gambar-gambar itu ke tujuan yang sama, misalnya sebuah pipeline. Bahkan bila masing-masing gambar dihasilkan oleh perintah yang berbeda. Misalnya Anda punya loop berisi perintah pemrosesan gambar, dan tiap perintah cukup mengeluarkan gambar MIFF 'streaming'. Setelah loop selesai, 'stream' gambar itu dapat disalurkan lewat pipe ke satu perintah untuk menghasilkan montage, kolase, animasi, atau yang lain. Sebagai contoh, perintah berikut menghasilkan daftar warna yang berawalan huruf 'b', lalu memakai loop perintah "magick" untuk menghasilkan petak warna berlabel, satu warna setiap kali. Petak-petak itu lalu 'disalurkan' ke "magick montage" untuk menghasilkan tabel warna sederhana.magick -list color | egrep '^b' | \ while read color junk; do \ magick -label $color -size 70x20 xc:$color +depth miff:-; \ done |\ magick montage - -frame 5 -tile 6x -geometry +2+2 \ -background none color_table.png
Contoh khusus di atas sudah diprogram menjadi skrip "show_colors " yang dapat Anda pakai untuk mencari, menemukan, dan menampilkan warna bagi keperluan pemrosesan gambar Anda. Contoh di atas adalah contoh 'pipeline gambar streaming yang sangat berguna untuk menghasilkan urutan multi-gambar. Contoh lain teknik ini antara lain penempatan terprogram gambar layer, pin di peta, 'gambar warna bernama' pada warna menurut nama, serta animasi seperti yang diperlihatkan di riak acak. Teknik ini juga bisa dipakai bersama operasi seperti "-write miff:-", sehingga gambar format miff dikeluarkan dari beberapa tempat sekaligus dalam satu perintah. Tiap gambar otomatis disambungkan pada stream keluaran akhirnya. Hal ini terutama berguna untuk men-debug perintah pemrosesan gambar yang rumit.Cara alternatifnya (lazim dipakai pada skrip PHP) adalah teknik 'perintah terbangkit', yaitu memakai skrip shell untuk membangkitkan perintah "magick" panjang yang akan dijalankan. Skrip pada animasi pelengkungan gambar memakai teknik ini.
-
info: -
Format file "
info:" (ditambahkan pada IM v6.2.4) TIDAK mengeluarkan gambar sungguhan! Pada dasarnya format ini mengeluarkan informasi yang sama dengan keluaran perintah "magick identify" ImageMagick. Seperti "magick identify", format keluaran ini dikendalikan oleh opsi "-format" dan "-verbose" sehingga hanya informasi tertentu yang Anda minati saja yang dikeluarkan, sebagaimana didefinisikan pada halaman escape properti gambar.Sebagai contoh, alih-alih menyalurkan gambar MIFF ke "magick identify" seperti di atas (lihat menyimpan gambar), kita bisa memakai perintah berikut untuk mengambil identifikasi satu baris dari format gambar hasilnya.magick granite: info:-
Tentu saja pengaturan "-format" bisa dipakai untuk mengeluarkan informasi yang diinginkan dalam bentuk tertentu yang lebih mudah diurai. Yang membuat "info:" begitu berguna adalah gambar dapat dihasilkan sekaligus informasi tambahan tentang gambar itu diambil pada saat yang sama. Caranya dengan memakai operator "-write" untuk menyimpan format gambar khusus ini ke sebuah file (atau ke standard output biasa perintah tersebut). | |
magick rose: -shave 12x0 -repage 64x64+9+9 \
-format '%wx%h %g' -write info:info_paged.txt paged.gif
![[IM Output]](../static/img/files/paged.gif)
| | ![[IM Text]](../static/img/files/info_paged.txt.gif)
Ada pula operator "-identify" yang setara dengan memakai "-write info:" untuk mengeluarkan informasi identifikasi gambar ke standard output. Ini membuat pemantauan apa yang terjadi pada gambar Anda semakin mudah saat men-debug perintah IM. Sebagai contoh... | |
magick logo: -identify \
-trim -identify \
+repage -identify \
-resize 80x80\! -identify \
logo_thumbnail.gif
![]()
| | ![]()
Di sini terlihat bagaimana "-trim" mengurangi ukuran gambar tetapi tetap menjaga informasi 'crop' tentang bagian gambar mana yang dipangkas, lalu "+repage" membuang informasi 'kanvas' atau 'halaman' tambahan itu. Dan seterusnya. Seperti halnya perintah "magick identify", baik "info:" maupun "-identify" menjadi jauh lebih rinci bila pengaturan "-verbose" dinyalakan. Di sini keluaran panjangnya saya batasi hanya beberapa baris pertama, sekadar supaya Anda mendapat sedikit gambaran tentangnya.
magick rose: -verbose info: | head
| _Pengaturan "-verbose" juga menyebabkan informasi tambahan tentang gambar yang sedang dibaca atau ditulis dicetak ke standard error (kecuali untuk format "info:"). Pengaturan itu juga membuat beberapa operator seperti "-colors" mengeluarkan informasi tambahan. Karena itu sebaiknya pengaturan ini dimatikan lagi setelah dipakai bersama "-identify" atau format "info:".
Sebagai contoh _ "-verbose -write info:image_info.txt +verbose" atau "-verbose -identify +verbose" .
| Pembacaan terskrip atas keluaran dari bentuk apa pun "identify" sebaiknya dilakukan tanpa membedakan huruf besar-kecil. Dengan begitu kompatibilitas mundur antarversi ImageMagick lebih terjamin.
CATATAN: "info:" (dan "-identify") hanyalah format keluaran, yang menghasilkan keluaran sama dengan perintah "identify". Gambar tidak dapat dibaca atau dibuat memakai format file "info:". Tersedia pula "-print" untuk mencetak informasi, tetapi opsi itu diterapkan hanya sekali terhadap seluruh urutan gambar. Artinya operator ini dapat dipakai untuk menghitung ekspresi '%[fx:...]' yang jauh lebih rumit dan melibatkan banyak gambar. Namun ingat, tidak seperti cara-cara di atas, operator ini hanya diterapkan sekali untuk semua gambar.
-
null: -
Sebagai format keluaran, format ini sekadar 'membuang' hasil gambar. Jadi bila dipakai sebagai argumen terakhir pada perintah "
magick", "magick montage", atau "magick composite", hasil akhirnya tidak akan disimpan! Mengapa? Bisa jadi Anda lebih tertarik pada gambar tertentu yang dihasilkan selama pemrosesan ketimbang pada hasil keseluruhannya, terutama saat men-debug. Sebagai contoh, di sini kita mengambil dan menyimpan satu gambar dari sebuah urutan gambar, lalu membuang semua gambar lainnya memakai "null:". |magick eye.gif news.gif storm.gif tree.gif rose: logo: \ ( -clone 2 -write write_storm.gif ) null:
![[IM Output]](../static/img/files/write_storm.gif)
Cara ini jauh lebih sederhana daripada berupaya menghapus semua gambar lain satu per satu. Namun sebagai format gambar masukan, "null:" menghasilkan gambar penampung khusus berupa satu piksel transparan, dengan flag khusus 'null source', di dalam urutan gambar saat ini. Gambar khusus ini terutama penting untuk menyisakan celah pada montage, dan sebagai pemisah daftar bagi komposisi layer multi-gambar. Gambar ini berkerabat dekat dengan format gambar khusus lain yang dikenal sebagai 'missed image', yang bisa muncul pada operasi seperti "-crop". Format gambar ini dihasilkan ketika sebuah operasi menghasilkan hasil kosong atau tidak masuk akal. Keduanya sama-sama berupa satu piksel transparan, sehingga gambar "null:" pun diperlakukan seolah-olah 'missed image'. Sampai saat ini belum ada cara untuk membuang "null:" ataupun 'missed image' dari urutan gambar saat ini. Namun cara semacam itu sudah diusulkan. Kirimi saya email bila Anda merasa memerlukannya.
-
txt: -
Ini adalah file teks ASCII sederhana yang pada dasarnya mendaftar tiap piksel gambar, satu piksel per baris. Ini bukan pengubah teks-ke-gambar untuk keperluan umum; untuk itu lihat contoh file teks multi-baris. Bila 'enumerasi piksel' tidak dikenali, gambar diteruskan ke coder format "
text:" untuk dirender sebagai file teks biasa. Sebagai contoh, berikut gambar "netscape:" yang diskalakan menjadi gambar 2x2 piksel, lalu didaftar memakai format gambar "txt:".magick netscape: -scale 2x2! txt_netscape.txt
Baris pertama (header) sebuah gambar padat berisi informasi dasar tentang gambar itu. Informasinya terdiri dari... File Magic: header gambar menetapkan file ini sebagai format gambar teks khusus IM (misalnya file "ImageMagick pixel enumeration"); di kalangan komputasi ini dikenal sebagai 'magic' file, yaitu string kode yang menandai file ini sebagai format file tertentu tersebut. Ukuran gambar: dua angka berikutnya menentukan ukuran gambar yang termuat dalam file ini. Mengalikan kedua angka itu sekaligus memberi tahu berapa banyak baris yang mesti menyusul header untuk mendefinisikan gambar secara utuh. IM selalu mengeluarkan sebanyak itu baris, meski nanti akan terlihat bahwa saat membaca Anda TIDAK perlu mendefinisikan SEMUA pikselnya. MaxValue: angka terakhir pada header menetapkan 'nilai maksimum' data gambar yang mungkin. Pada contoh di atas nilainya '255', hasil dari pemakaian kedalaman 8 bit. Gambar bawaan "netscape:" dikeluarkan pada kedalaman ini karena secara internal gambar itu didefinisikan memakai nilai 8-bit, sehingga IM mempertahankan tingkat kedalaman tersebut. Keterangan lebih lanjut ada pada bagian pengaturan kedalaman. Namun pengaturan kedalaman itu bisa ditimpa (sampai batas nilai Q IM Anda atau pengaturan kualitas saat kompilasi, dengan mengubah "-depth" gambar. Sebagai contoh, di sini saya mengeluarkan nilai warna sebagai nilai 16 bit (dari 0 sampai 65535)...
magick netscape: -scale 2x2\! -depth 16 txt_netscape_16.txt
| Sampai saat ini 'nilai maksimum' tertentu tidak dapat ditetapkan untuk dipakai pada format file keluaran. Nilai yang berbeda hanya dapat didefinisikan lewat pengaturan "-depth" saat ini, sehingga nilai maksimumnya sama dengan 2^depth-1.
Colorspace: butir terakhir pada header menetapkan ruang warna data yang menyusul. Bila gambarnya memuat transparansi, huruf 'a' (untuk alpha) ikut ditambahkan di ujung nama ruang warnanya, dan satu kolom angka tambahan disisipkan di dalam tanda kurung. Gambar grayscale dikeluarkan sebagai 'grey', tetapi tetap mendefinisikan sedikitnya tiga angka yang nilainya sama untuk tiap piksel. Sebagai contoh, berikut gambar yang sama memakai ruang warna 'LAB' dengan tambahan kanal alpha!
magick netscape: -scale 2x2\! -colorspace LAB -alpha set txt_cspace_lab.txt
Setelah header awal menyusul baris data piksel, satu baris untuk tiap piksel gambar. Koordinat: dua angka pertama sampai titik dua ':' adalah posisi piksel, dimulai dari 0. Nilai warna: setelah itu nilai warna piksel (dari 0 sampai MaxValue yang diberikan pada header) ditulis di dalam tanda kurung, berjumlah 3 sampai 5 angka bergantung pada ruang warna gambar saat itu. Spasi bersifat opsional, jadi berhati-hatilah saat mengurai angka di dalam tanda kurung. |
Nilainya biasanya bilangan bulat. Namun sejak IM v6.9.2-1, bila define khusus "-define txt:compliance=css" diberikan bersama "-depth 16", nilainya disajikan sebagai nilai persentase dengan tanda '%'. Ini bagian dari kepatuhan pada SVG dan CSS. |
|---|---|
Komentar warna: apa pun yang mengikuti angka di dalam tanda kurung dianggap komentar. IM mengisikan informasi tambahan tentang warna piksel memakai format yang bisa diuraikannya sebagai argumen warna (rincian spesifikasi warna ini ada pada entri manual "-fill"). Namun komentar warna itu berubah-ubah, meski biasanya diawali nilai warna heksadesimal bertanda pagar ('#'), lalu bisa menyusul nilai RGB() atau nama warna bergantung pada data piksel yang diberikan. Nama-nama warna itu semestinya dipahami ImageMagick, tetapi hanya dimaksudkan sebagai rujukan, sebab sifatnya murni komentar. Warna apa persisnya yang disediakan sangat bergantung pada versi IM yang Anda pakai, terutama pada IM v6 versi awal dan sebelumnya. Tidak ada jaminan bahwa bagian komentar ini tidak akan berubah lagi di kemudian hari, jadi sebaiknya jangan diandalkan. IM sendiri tidak mengandalkannya saat membaca gambar enumerasi piksel. Berikut contoh cara membaca enumerasi piksel dengan benar di dalam skrip shell. Format persis gambar TXT ditentukan oleh perintah convert, lalu 'tail' dipakai untuk membuang header, 'tr' untuk mengganti tiap karakter bukan angka dengan satu spasi, supaya 'while' berikutnya mudah membaca angkanya, sekaligus membuang angka komentar yang mungkin tersisa. |
magick rose: -resize 3x2\! -depth 8 -colorspace RGB -alpha off txt:- |
tail -n +2 | tr -cs '0-9.\n' ' ' |
while read x y r g b junk; do
echo "$x,$y = rgb($r,$g,$b)"
done
Membaca gambar TXT juga sah. Anda tidak perlu mendefinisikan SEMUA piksel gambar. Bahkan pikselnya pun tidak harus berurutan dengan benar! ImageMagick sekadar membaca tiap baris pendefinisi piksel secara bergantian, lalu 'menggambarkannya' ke kanvas gambar kosong. Yang dipakai untuk itu hanya angka di dalam tanda kurung pada tiap baris, bukan nama warnanya. Kanvas kosong awalnya dibersihkan dan disetel ke warna latar belakang saat itu. Karena itu piksel yang tidak disediakan gambar "txt:" akan dibiarkan berwarna itu. Untuk pemakaian gambar "txt:" yang menarik, lihat pemetaan piksel maju, tempat saya mengeluarkan gambar enumerasi piksel, lalu mengubah tiap lokasi pikselnya sehingga gambarnya berputar (terdistorsi), sebelum gambar enumerasi piksel itu dibaca kembali ke IM. Pada gambar hasilnya sebagian lokasi piksel tidak terdefinisi, sedangkan lokasi lain menerima beberapa piksel sekaligus. IM menanganinya tanpa masalah.
Format "txt:" terutama berguna bersama operator "-unique-colors", yang mengganti tiap gambar pada urutan gambar saat ini dengan gambar baru berisi satu piksel untuk tiap warna unik yang ditemukan. Bila hasilnya dikeluarkan ke file berformat "txt:", didapat ringkasan dasar warna yang terkandung dalam sebuah gambar (walau tanpa jumlah kemunculannya atau histogramnya). Sebagai contoh, berikut warna-warna yang dipakai gambar tree. Karena GIF hanya bisa memakai angka 8 bit, warnanya pun dikeluarkan pada kedalaman yang sama. | |
magick tree.gif -unique-colors txt:-
![[IM Output]](../static/img/images/tree.gif)
| ![[IM Text]](../static/img/files/tree_colors.txt.gif)
Ada alternatif lain selain format "txt:" milik IM, yaitu berbagai format file gambar NetPBM. Secara bawaan IM mengeluarkan format ini dalam bentuk biner, tetapi "-compress" dapat dimatikan agar keluar versi teks ASCII format NetPBM. Sebagai contoh.
magick tree.gif -unique-colors -compress None -depth 8 tree_netpbm.ppm
Mungkin Anda memperhatikan bahwa angka pada contoh di atas cocok dengan angka pada format enumerasi piksel ("txt:") milik IM. Lihat gradien yang diubah ukurannya untuk beberapa contoh pembuatan gambar berformat NetPBM agar dibaca IM. Bila Anda hanya menginginkan warna satu piksel tertentu, gambarnya bisa dipangkas menjadi satu piksel lalu dikeluarkan sebagai gambar "txt:".
magick rose: -crop 1x1+12+26 txt:
Atau pakailah format escape FX khusus untuk mengeluarkan warnanya dalam bentuk yang langsung dapat dipakai IM.
magick rose: -format '%[pixel:u.p{12,26}]' info:
Lihat juga mengambil warna gambar.
-
sparse-color: -
Ini format gambar keluaran khusus yang mengembalikan daftar sederhana berisi koordinat dan warna, dipisahkan koma, untuk tiap piksel yang tidak transparan. String keluarannya cocok untuk langsung dijadikan masukan bagi operator sparse color. Sebagai contoh, perintah ini menemukan segelintir piksel yang 'paling dekat' dengan warna merah murni pada gambar "
rose:".magick rose: -alpha set -fuzz 13% +transparent red sparse-color:
Dalam banyak hal format ini lebih berguna daripada format "txt:" yang ditunjukkan di atas, tetapi hanya bila pikselnya cuma segelintir. Namun perlu diingat, saat tulisan ini dibuat keluarannya berada dalam satu baris saja. Skrip shell mungkin perlu mengubah spasi pada keluaran itu menjadi baris baru.
-
histogram: -
Ini sebenarnya format gambar "
miff:", hanya saja dengan komentar gambar yang sangat besar berisi hitungan lengkap semua warna di dalam gambar. Tepatnya pada atribut 'Comment={...}' di header teks "miff:". Sebagai contoh, di sini kita kembali mendaftar warna yang ada pada gambar "tree", tetapi kali ini disertai jumlah piksel tiap warnanya. Komentar histogram teks itu diambil dari gambar "histogram:" memakai magick identify kedua yang diformat dengan "info:". | |magick tree.gif -define histogram:unique-colors=true \ -format %c histogram:info:-
![[IM Output]](../static/img/images/tree.gif)
| ![[IM Text]](../static/img/files/tree_histogram.txt.gif)
| Format keluaran "info:" ditambahkan pada IM v6.2.4. Untuk versi IM sebelum itu, pakailah.. |
magick tree.gif histogram:- | identify -format %c -
| Akan terlihat bahwa formatnya nyaris persis sama dengan format TXT sebelumnya, atau format gambar enumerasi piksel IM, termasuk komentar pada nilai warnanya. Bedanya hanya lokasi X,Y yang digantikan oleh hitungan jumlah piksel. | Komentar ini bisa sangat lama pembuatannya. Sejak IM v6.6.1-5, pengaturan khusus "-define histogram:unique-colors=false" dapat ditambahkan untuk mematikan pembuatan komentar itu bila Anda tidak memerlukannya. |
|---|---|
Gambarnya sendiri berupa grafik histogram berukuran 256x200 piksel. Sumbu x adalah nilai warna (0-255) dan sumbu y adalah jumlah piksel (dinormalisasi terhadap banyaknya piksel). Histogram tiap kanal ditampilkan dengan warna yang diwakilinya, lalu dijumlahkan. Karena itu merah dan biru bertumpang tindih menjadi magenta. Dengan kata lain, tiap kanal warna punya histogramnya sendiri-sendiri. Bila Anda ingin gambarnya dikonversi ke format lain, simpan saja ke format itu. "histogram:" adalah format pemrosesan gambar khusus. Format ini mengonversi gambarnya, lalu mengeluarkannya dalam format yang ditentukan sufiks nama file atau kode "_format_ :" selanjutnya. |
magick rose: \
-define histogram:unique-colors=false \
histogram:histogram.gif
![[IM Output]](../static/img/files/histogram.gif)
Gambar yang sangat gelap akan condong berat ke kiri, sedangkan gambar yang terang condong berat ke kanan. Begitu pula nada tengah, yang terwakili di bagian tengah. Supaya lebih jelas, di sini saya memisahkan histogram tiap kanal warna. Komentar teks histogramnya juga saya buang (bila masih ada), lalu gambarnya saya ubah ukurannya untuk ditampilkan.
magick histogram.gif -strip -resize 50% -separate histogram-%d.gif
---
Untuk gambar "rose:" di atas terlihat bahwa merah lebih menyebar, menunjukkan betapa pentingnya warna itu pada gambar tersebut. Sebaliknya hijau dan biru memuncak di sebelah kiri, menunjukkan pengaruhnya sangat kecil pada gambar itu. Bila Anda lebih tertarik pada kecerlangan gambar ketimbang warnanya, konversikan gambar itu ke grayscale sebelum menghasilkan gambar "histogram:". |
magick rose: -colorspace Gray \
-define histogram:unique-colors=false \
histogram:histogram_gray.gif
![[IM Output]](../static/img/files/histogram_gray.gif)
Seperti terlihat, histogram gambar grayscale sedikit berbeda. Warna merah yang dominan berubah menjadi abu-abu bernada tengah, sehingga muncul puncak di tengah histogram. Selain itu area kecil berwarna nyaris putih pada gambar kini menghasilkan puncak yang jelas di ujung kanan grafik. Ruang yang sama sekali kosong di ujung kiri juga menunjukkan tidak adanya bercak gelap sedikit pun pada gambar itu. Di sisi lain, histogram 'global' yang lebih baik dapat dihasilkan cukup dengan memisahkan semua kanal warna pada gambar asli lalu menyambungkannya. Histogram hasilnya mewakili seluruh nilai warna tidak peduli dari kanal mana nilai itu berasal. |
magick rose: -separate -append \
-define histogram:unique-colors=false \
histogram:histogram_values.gif
![[IM Output]](../static/img/files/histogram_values.gif)
Sayangnya karena "histogram:" adalah format keluaran, gambarnya harus disalurkan lewat pipe ke perintah lain, disimpan ke disk, atau memakai simpan/baca khusus "mpr:", bila Anda ingin memprosesnya lebih lanjut. Contohnya ada pada "mpr:" di bawah. Akan lebih baik seandainya cara menghasilkan histogram (dan grafik lain) tersedia sebagai operator, bukan sebagai format keluaran khusus.
-
mpr:_{label}_ -
(Memory Program Register) menyimpan seluruh urutan gambar ke sebuah register memori bernama, yang datanya dapat dibaca kembali belakangan. Jadi bila Anda ingin menyimpan gambar untuk dipakai nanti dalam operasi gambar yang rumit, hal itu bisa dilakukan. Menulis ke "
mpr:" di akhir pemrosesan tidak ada gunanya, sebab memori program dikembalikan ke sistem begitu program selesai. Karena itu pakailah operasi tulis untuk menyimpan gambar ke sebuah file di tengah langkah pemrosesan Anda, bila gambar itu diperlukan pada proses yang lain. 'label ' yang diberikan pada "mpr:" boleh apa saja, sebab label itu sekadar penanda tempat gambar disimpan di memori. Label itu bahkan boleh berupa angka sederhana bagi orang yang menulis skrip dan enggan berurusan dengan nama, meski nama membuat skrip lebih mudah diikuti. Setelah gambar disimpan (lihat di bawah), gambar itu dapat dibaca lagi dari lokasi memori 'berlabel' yang sama, sebanyak yang Anda mau. Sebagai contoh... |magick tree.gif -write mpr:tree +delete \ \ mpr:tree mpr:tree mpr:tree +append mpr.gif
![[IM Output]](../static/img/files/mpr.gif)
Perhatikan pemakaian "+delete" pada pemrosesan gambar di atas. Di situ sebenarnya tidak perlu (cukup baca ulang "mpr:tree" dua kali, bukan tiga), tetapi sangat lazim untuk menghapus semua gambar dari urutan gambar saat ini setelah gambar-gambar itu disimpan ke register "mpr:". Pada dasarnya kedua baris di atas dapat dianggap sebagai dua perintah "magick" yang benar-benar terpisah, hanya saja gambar antaranya memakai register memori bernama, bukan ruang disk. Dalam banyak hal memakai "mpr:" mirip dengan memakai klona atau duplikat (yang sebenarnya bisa dipakai pada contoh di atas), tetapi "mpr:" memungkinkan kita membuang seluruh gambar sepenuhnya, untuk mengosongkan daftar gambar saat ini bagi pekerjaan lain. Keunggulan terbaik cara ini adalah pengaturan dan operasi yang hanya bekerja pada masukan gambar pun jadi bisa dipakai. Misalnya memakainya bersama operator gambar masukan "tile:" untuk menyusun tile dari sebuah gambar pada area yang lebih luas. |
magick tree.gif -flip -write mpr:tree +delete \
-size 64x64 tile:mpr:tree mpr_tile.gif
![[IM Output]](../static/img/files/mpr_tile.gif)
"mpr:" juga dapat dipakai untuk menangkap keluaran sebagian filter format gambar keluaran khusus guna diproses lebih lanjut. Sebagai contoh, di sini kita menyimpan gambar keluaran dari "histogram:" lalu membacanya kembali dan meneruskan pemrosesannya dalam perintah yang sama, |
magick rose: -define histogram:unique-colors=false \
-write histogram:mpr:hgram +delete \
mpr:hgram -strip -resize 50% histogram_resized.gif
![[IM Output]](../static/img/files/histogram_resized.gif)
Penyimpanan di memori "mpr:" sebenarnya satu-satunya cara memakai ulang gambar yang sudah ada di memori lewat filter I/O khusus seperti format file keluaran "histogram:" atau format file masukan "tile:". Hal yang sama berlaku untuk opsi khusus yang menerima gambar masukan sungguhan, misalnya "-tile" atau untuk gambar "pemetaan warna" yang memakai gambar lain sebagai sumber. Lihat peta warna multi-gambar. PERHATIKAN bahwa opsi semacam itu sedang digantikan pada IMv7 oleh versi yang tidak menuntut gambarnya dibaca dari file. Ini juga satu-satunya cara memakai metode -draw 'image' untuk menimpakan gambar dengan gambar yang dibangkitkan di memori, walau masih banyak teknik lain untuk itu. Gambar "mpr:" sebenarnya menyimpan seluruh urutan gambar, bukan hanya satu gambar. Mirip mengambil potret urutan gambar saat ini supaya bisa dimuat ulang belakangan untuk pemrosesan lanjutan. Ini misalnya memungkinkan Anda menyalin seluruh urutan animasi untuk diduplikasi atau diklona, tanpa perlu tahu berapa banyak gambar yang sebenarnya terlibat. Contohnya ada di komposisi layer. Bila di dalam "mpr:" memang ada banyak gambar, masing-masing gambar tetap bisa diambil dari urutan itu! Memakai "mpr:image'[2]'" akan menarik gambar ketiga dari urutan multi-gambar yang disimpan dengan "-write mpr:image". Sebagai contoh, di sini saya mengambil gambar 'storm' dari sekumpulan empat gambar. |
magick eye.gif news.gif storm.gif tree.gif \
-write mpr:images -delete 0--1 \
\
mpr:images'[2]' mpr_extract.gif
![[IM Output]](../static/img/files/mpr_extract.gif)
Operator kloning gambar umumnya tidak sanggup menangani jumlah gambar yang tidak diketahui dan berubah-ubah. Bahkan sebelum operator klona ditambahkan, "mpr:" adalah satu-satunya cara menduplikasi gambar di memori tanpa memakai file disk antara. | Sejak IM v6.8.2 gambar juga bisa disimpan pada proses daemon caching IM jarak jauh. Dengan begitu gambar (beserta meta-datanya) dapat dioper antar perintah IM yang berjalan terpisah, tanpa perlu ruang disk. LihatDistributed Pixel Cache Daemon
-
mpc: - Ini format simpan ke disk khusus milik IM yang awalnya dirancang untuk gambar yang benar-benar besar. Pada dasarnya format ini adalah file disk hasil pemetaan memori program, yang disimpan ke disk sebagai dua file biner: "
.mpc" yang menampung meta-data gambar, dan ".cache" yang menampung pixel-cache gambar.
Format "MPC:" membuat dua file untuk menyimpan satu gambar
File semacam itu tidak lagi berfungsi setelah IM dikompilasi ulang atau ditingkatkan versinya, dan hanya berlaku untuk IM yang dikompilasi bagi mesin tertentu. Karena itu format ini hanya cocok untuk file sementara yang 'cepat dibaca', misalnya menampung gambar sementara pada pemrosesan gambar terskrip, bukan untuk penyimpanan jangka panjang. Sebagai contoh...
magick very_big_image.tif very_big_image.mpc
akan membuat dua file di disk: satu file kecil "very_big_image.mpc" dan satu file dump memori khusus bernama "very_big_image.cache". Ukuran file kedua kemungkinan besar jauh lebih besar daripada format file gambar mana pun, sebab isinya sekadar dump memori mentah tanpa kompresi. Namun file itu tidak perlu 'dibaca masuk' atau 'didekode', melainkan bisa langsung 'di-page' ke memori komputer dan dipakai apa adanya, tanpa beban pemrosesan. Yang dibutuhkan hanya ruang disk dan IO disk yang banyak. Dengan kata lain, yang diperlukan cuma waktu akses disk untuk membaca, tanpa pemrosesan format file. Jadi tidak perlu ada pendekodean data. Karena gambarnya sudah 'siap-memori', format ini terutama berguna untuk gambar sementara segala ukuran, sebab langsung dapat dipakai oleh perintah IM berikutnya yang Anda jalankan. Namun ingat, dua file dihasilkan sekaligus dan ukurannya lebih besar daripada ukuran file gambar biasa, jadi berhati-hatilah dengan pemakaian disk dan pembersihan skrip Anda. Skrip IM saya sendiri memanfaatkan betul fitur ini. Contohnya lihat skrip "de-pixelate" dan "divide_vert", yang memakai cukup banyak file gambar sementara untuk operasi pemrosesan gambar. Fitur ini luar biasa berguna bagi skrip atau komposisi alpha dalam mogrify yang harus sanggup membaca gambar yang sama berulang-ulang kali, sebab IM tidak perlu mendekode gambarnya, atau menghabiskan banyak memori sekadar untuk menyimpannya. Fitur ini juga sangat berguna untuk memproses gambar yang sangat besar, ketika Anda harus mengambil atau memangkas bagian gambar yang lebih kecil untuk diproses sungguhan. Namun karena sebagian besar operasi gambar sebenarnya membuat salinan klona selama pemrosesan, salinan baru di memori tetap bisa terbentuk. Jadi kehati-hatian tetap diperlukan. Memangkas atau mengubah ukuran menjadi jauh lebih kecil adalah operasi teraman untuk penanganan gambar besar dengan MPC. Keterangan lebih lanjut ada di penanganan gambar yang benar-benar masif di bawah.
fd:{file_descriptor}- Nama file khusus ini memungkinkan penentuan 'file descriptor ' tertentu tempat gambar dibaca atau ditulis. Nama '
fd:0' adalah 'standard input ' dan 'fd:1' adalah 'standard output ' program. Keduanya setara dengan memakai '-' sebagai nama file. Namun 'file descriptor ' mana pun boleh ditentukan untuk membaca/menulis gambar, termasuk 'fd:2' untuk 'standard error ', atau handle file lain yang sebelumnya sudah dibuka oleh program induk. Pemakaian yang paling umum ada pada penulisan skrip shell tingkat lanjut, saat Anda mungkin punya beberapa stream file gambar. Atau pada daemon jaringan yang mungkin membuka beberapa stream file sekaligus.
inline:{base64_file|data:base64_data}- Gambar inline memungkinkan pembacaan gambar yang didefinisikan dalam pengodean base64 khusus. Misalnya, untuk membaca gambar berkode base64 pakailah...
inline:base64_image.txt
Pengodean itu bisa berasal dari sebuah file, tetapi lebih lazim diberikan langsung sebagai argumen baca alih-alih sebagai nama file dari sumber gambar eksternal. Cara ini lebih lazim dipakai sebagai alternatif 'blob' di baris perintah, atau pada pemrosesan gambar lewat API. Atau tempatkan data gambarnya langsung di baris perintah...
inline:data:mime-type;base64,/9j/4AAQSk...knrn//2Q==
Sebagai contoh, mari kita kodekan sebuah gambar yang sangat kecil ke base64 (ada banyak program yang bisa melakukan konversi ini)...
openssl enc -base64 -in noseguy.gif
Perhatikan bahwa data base64 boleh memuat spasi kosong sebanyak apa pun, misalnya return dan baris baru. Formatnya sekadar mengabaikannya. Data base64 juga hanya memakai karakter ASCII biasa, itulah sebabnya pengodean ini dipakai untuk data biner pada email dan halaman web. Dengan begitu data biner pun dapat disimpan di dalam program dan skrip tanpa masalah. Misalnya, saya bisa menaruh perintah berikut di dalam skrip shell sehingga skripnya sendiri sudah memuat gambar itu, dan karenanya tidak memerlukan sumber gambar eksternal terpisah. |
magick 'inline:data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
' b64_noseguy.gif
![[IM Output]](../static/img/files/b64_noseguy.gif)
Ingat, dengan cara ini gambarnya dapat dipakai di dalam skrip Anda (shell maupun API). Tidak perlu ada file gambar eksternal terpisah yang membuat pemasangan skrip sederhana menjadi lebih rumit. Lalu mengapa "inline:" berbentuk serumit ini? Pada dasarnya karena inilah format yang dipakai untuk gambar inline pada halaman web HTML. Misalnya, pada contoh berikut gambar di sebelah kanan disisipkan langsung secara inline pada halaman web, bukan sebagai file eksternal terpisah, memakai tag HTML berbentuk... |
<IMG SRC="data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs="
ALT="Nose Guy" WIDTH=32 HEIGHT=32 VSPACE=5 HSPACE=5 BORDER=0 >
Ini tidak berfungsi pada semua peramban web; misalnya tidak berfungsi pada IE7 dan sebelumnya, tetapi berfungsi pada IE8. Pada dasarnya kebanyakan peramban web modern memahaminya.
Format data inline serupa juga dipakai untuk gambar 'face' pada header email, dan mungkin banyak jenis file lain. SELINGAN: berkat bagian 'magic' ImageMagick, sebagian besar format file gambar tidak perlu menyertakan mime-type (bagian 'image/gif' pada string panjang itu). Kenyataannya IM memang mengabaikannya sama sekali). Namun koma ',' tetap diperlukan untuk menandai akhir bagian tersebut pada string data gambar inline. |
magick 'inline:data:,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//U
b//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ek
yky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguW
w6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7
' b64_folder.gif
![[IM Output]](../static/img/files/b64_folder.gif)
PERINGATAN: masukan opsi baris perintah dibatasi 5000 karakter. Banyak shell (terutama masukan PC-DOS) juga punya batas panjang total baris perintah. Karena itu cara ini tidak cocok untuk gambar base64 yang sangat besar.
-
clipboard: - Membaca atau menulis gambar dari atau ke Clipboard Windows. (khusus Windows).
-
ephemeral:{image_file} -
Baca lalu hapus file gambar ini. Ini format pembacaan gambar khusus yang membuat IM menghapus file gambar yang diberikan setelah file itu dibaca ke memori. Perhatikan bahwa gambar di memori belum diproses atau bahkan belum disimpan ketika file bacaannya dihapus. Ini sangat berbahaya dan harus dipakai dengan kehati-hatian ekstrem. Kebanyakan dipakai pada menjalankan perintah eksternal. Di situ delegate latar belakang membaca gambar masukan, lalu menghapusnya begitu datanya didapat. Penghapusan itu memberi tahu proses 'induk' di latar depan bahwa 'anak'-nya siap berjalan sendiri, karena sudah selesai membaca gambar yang disediakan. Program utamanya lalu dapat berbenah dan melanjutkan pemrosesan gambarnya secara terpisah, atau sekadar keluar, tergantung keadaan. Delegate keluaran gambar "
show:" memakai cara ini bersama perintah "magick display", untuk otomatis menjalankan tampilan gambar di latar belakang sebelum perintah utamanya lanjut atau keluar. (lihat di bawah) Misalnya, saya memakai cara ini pada skrip shell yang memanggil "flicker_cmp" untuk menampilkan sejumlah hasil antara, tetapi kemudian otomatis lanjut (atau keluar) ketika IM memberi isyarat bahwa program itu sudah selesai membaca gambar masukannya, yaitu dengan menghapus gambar kedua yang diberikan. Bila Anda memerlukan umpan balik itu tetapi juga perlu mempertahankan gambar yang dibaca, buatlah salinan, hard link, atau symbolic link ke gambar aslinya, lalu berikan file itu sebagai "ephemeral:". dengan begitu saat file itu dihapus, gambar aslinya tetap terjaga. CATATAN: saat ini belum ada cara membuat "animate" atau "display" memberi isyarat kapan animasinya selesai, atau kapan gambarnya benar-benar ditampilkan. :-( Namun "magick" bisa diminta membaca gambar "ephemeral:" terpisah, untuk memberi tahu skrip pengendali bahwa pemrosesan gambarnya sudah mencapai titik tertentu.# Blur an image, and show an on screen comparision before # auto-deleting and exiting. magick rose: input_image.png magick input_image.png -blur 0x5 blurred.png flicker_cmp input_image.png ephemeral:blurred.png &
# wait for the second image to have been read and deleted! while [ -f blurred.png ]; do usleep 100; done
# At this point we can continue (or exit) without problems. # while the on screen display continues in background. rm -f input_image.png
Saya juga memakai cara ini pada program latar belakang lain, sebagai isyarat bahwa program latar belakang itu siap melanjutkan.
-
show:,win:danx:-- menampilkan gambar langsung di layar -
Ini format keluaran khusus yang langsung menampilkan gambar hasilnya ke layar Anda. Alih-alih menyimpan gambar ke sebuah file, format ini sekadar menampilkan hasilnya. Cara ini sangat berguna untuk menguji perintah IM dengan cepat guna melihat hasilnya, dan sangat disarankan untuk keperluan itu. Namun ketiganya hanyalah versi yang sangat sederhana dari perintah "
display" dan "animate". Sebagai contoh, untuk mendapat ringkasan cepat gambar-gambar di sebuah direktori...magick montage *.jpg show:
Untuk melihat area yang berbeda antara dua gambar...
magick compare image1.png image2.png show:
Semua format yang didaftar di sini sebenarnya memanggil program "display" untuk menjalankan tugasnya. Namun masing-masing menangani tugas itu dengan cara berbeda. Misalnya 'show:' memakai delegate yang menjalankan perintah eksternal untuk menjalankan program "display" terpisah. Artinya begitu gambar ditampilkan, perintah aslinya melanjutkan pemrosesannya (biasanya lalu keluar, kecuali Anda memakai "-write show:" ). Sebaliknya, 'x:' atau 'win:' menunggu Anda menutup jendela tampilannya dulu sebelum perintah asli boleh melanjutkan (dan keluar). Sayangnya tidak satu pun cara ini menampilkan animasi dengan baik. Untuk itu lebih baik animasinya (dalam format MIFF) disalurkan lewat pipe ke perintah "animate".
-
x:(sebagai masukan) - membaca tampilan X Window -
Tampilan X window saat ini juga dapat dibaca memakai operator "
x:", dengan cara yang mirip perintah "import. Bahkan tanpa opsi apa pun, operator ini berlaku persis seperti perintah "import". Pakai tombol kiri untuk memilih jendela yang salinannya hendak ditangkap, atau tandai sebuah area memakai tombol tengah. Sebagai contoh, untuk memilih jendela memakai tetikus, lalu menampilkan jendela yang baru ditangkap itu di jendela lain (keluar begitu jendela tangkapannya ditampilkan)...magick x: show:
PERINGATAN. bila Anda menangkap jendela yang tidak terpetakan (dijadikan ikon), atau tertutup jendela lain, isi gambarnya akan berupa area kosong, atau isi jendela yang menutupinya!!! Jadi pastikan jendela yang ditangkap terlihat sepenuhnya di layar. Untuk menangkap seluruh tampilan, pakai 'root' sebagai nama jendela.
magick x:'root' full_screen_dump.jpg
Atau pakai pengubah baca untuk menangkap area tertentu dari tampilan.
magick x:'root[300x400+879+122]' part_screen_dump.jpg
Dengan memberikan nama jendela, jendela tertentu dapat ditangkap. Misalnya perintah ini menangkap jendela berjudul 'MailEd'...
magick x:'MailEd' window.jpg
Namun cara itu sebenarnya kurang manjur, sebab sering kali ada beberapa jendela bernama sama, atau nama jendelanya memang tidak bisa ditentukan. Cara yang lebih baik adalah memberi tahu IM jendela persisnya lewat "X Window ID", yaitu angka yang dipakai tampilan X untuk mengenali sebuah jendela (atau jendela anak) secara unik. X Window ID biasanya dicari memakai perintah "xwininfo", tetapi program lain seperti "xdotool" dan "xwit", juga perkakas lain seperti "xprop", dapat dipakai untuk mencari informasi tentang jendela. Misalnya kelas jendela, nama, judul, ukuran dan penempatannya, jendela anak, serta dekorasi dari window manager. Sebagai contoh, untuk menemukan semua jendela yang judul atau namanya memuat "Mozilla Firefox"...
xwininfo -root -all | grep "Mozilla Firefox"
Dari keluaran perintah di atas saya lalu dapat mengambil X Window ID jendela yang saya inginkan. Berikut skrip bash yang sedikit lebih rumit yang saya pasang di window manager saya. Saat saya menekan sebuah tombol, skrip itu mencari ID jendela yang sedang 'fokus', menangkapnya, lalu menamai filenya sebagai PNG di direktori saya saat itu memakai nomor tangkapan berikutnya, mengikuti tangkapan-tangkapan sebelumnya.
bash -c "
id=$(xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //')
magick x:$id capture-tmp-$$.png
num=$( ls capture-[0-9]*.png 2>/dev/null | sed -n '$ s/[^0-9]//gp' )
num=$( printf %03d $(expr $num + 1) )
mv capture-tmp-$$.png capture-$num.png
"
Sebagian besar program terminal memberi tahu X Window ID yang dipakainya untuk menampilkan teks lewat variabel lingkungan "WINDOWID". Jadi bila perintah ini dijalankan dari baris perintah XTerm atau Gnome Terminal, Anda akan menangkap salinan jendela terminal saat itu.
magick x:$WINDOWID this_terminal.png
Sekarang sedikit hiburan... Di sini saya menangkap isi terminal saya saat itu, menggambari isinya, lalu memakai "display" untuk menggambarkannya kembali ke jendela terminal yang sama!
window=`xwininfo -children -id $WINDOWID |\
sed -n 's/^ *\(0x[^ ]*\).*/\1/p'`; \
window="${window:-$WINDOWID}"; \
magick x:$window -background black \
-draw 'fill black rectangle 40,40 160,160' \
-draw 'stroke red line 50,50 50,150 line 50,150 150,150' \
-draw 'fill lime circle 110,100 80,100' \
-draw 'stroke dodgerblue line 50,150 150,50' \
rose: -geometry +180+60 -composite \
png:- |\
magick display -window $window -
Perintah pertama di atas dirancang untuk jendela "XTerm", yang menuntut jendela tujuan "magick display" berupa jendela anak dari "WINDOWID" yang diberikan. Baris kedua kembali memakai nilai asli "WINDOWID" bila tidak ada jendela 'anak' yang ditemukan, seperti pada jendela "Gnome-Terminal". Begitu jendela yang dipakai ditentukan, jendela itu ditangkap, digambari, lalu dikembalikan ke jendela terminal! Dan seketika Anda punya keluaran grafis langsung di jendela terminal saat itu. Berikut contoh yang lebih sederhana: perintah ini menggelapkan isi jendela setiap kali dijalankan. Cobalah jalankan beberapa kali di jendela "xterm" sungguhan, dan Anda akan melihat bahwa makin lama sebuah perintah berada di jendela terminal, makin gelap tampilannya!
window=`xwininfo -children -id $WINDOWID |\
sed -n 's/^ *\(0x[^ ]*\).*/\1/p'`; \
window="${window:-$WINDOWID}"; \
magick x:$window -background black -colorize 20% png:- |\
magick display -window $window -
Dan inilah 'tangkapan layar' yang memperlihatkan apa yang terjadi saat saya mengulangi perintah di atas di jendela "xterm" saya sendiri...
Perlu diingat, meski isi terminalnya berubah, perubahan itu hanya sementara. Bila Anda menjadikannya ikon, menutupinya, atau berpindah layar desktop lalu kembali ke terminal, perubahannya hilang karena program terminal menggambar ulang jendelanya dan menghapus 'gambaran' Anda sendiri. Cara di atas jauh kurang manjur pada "Gnome-Terminal" dibandingkan pada "XTerm", sebab yang pertama gemar 'menggambar ulang' jendelanya setiap kali menggulir, sedangkan "XTerm" tidak. Bayangkan skrip IM yang menampilkan hasil grafik dan hal lain langsung di berbagai jendela sebagai bagian dari program klien yang lebih besar. Beginilah sebenarnya cara banyak penampil postscript, bahkan banyak peramban web, menampilkan keluaran dari sub-program khusus. Yaitu dengan membiarkan sub-program itu mengambil alih dan menggambar langsung ke sub-jendela yang disediakan. Bereksperimenlah, dan tolong beri tahu saya (dan yang lain) apa yang Anda temukan, lewat email atau forum pengguna IM.
Coder dan delegate untuk format gambar
Coder adalah modul pustaka dinamis (biasanya ditulis dalam bahasa pemrograman C) yang menangani aspek "format:" pada masukan dan keluaran gambar. Coder juga bisa dipakai pengguna untuk membuat filter bertujuan khusus. Coder mungkin menuntut pemasangan pustaka eksternal tambahan, yang sering disebut 'pustaka delegate'. Coder dimuat sebagai modul dinamis hanya ketika diperlukan, artinya pustaka terkait yang dipakai sebuah coder tidak perlu dipasang kecuali Anda memang hendak memanfaatkan coder tersebut. Contoh-contoh ini tidak membahas pemrograman C yang diperlukan untuk menulis coder, tetapi di dalam kode sumbernya ada contoh coder yang dapat dipakai untuk membuat modul coder Anda sendiri.
Delegate sekadar sebuah perintah yang dikenal IM dan memungkinkannya mengonversi antarformat yang berbeda. Dengan begitu IM dapat memakai perintah yang 'lebih sederhana' dan sudah tertulis itu, alih-alih menuntut coder biner yang lebih rumit untuk menangani suatu format file gambar. Untuk mendapatkan daftar delegate yang tersedia, pakai perintah khusus...
magick -list delegate
Program 'delegate' yang paling dikenal dan dipakai IM adalah "ghostscript", yang memungkinkan IM membaca dan mengonversi gambar vektor berformat Postscript dan PDF yang sangat rumit menjadi format file gambar raster lain yang dapat dibaca IM. Namun 'perintah delegate ' sangat berguna pula bagi pengguna, sebab memungkinkan IM diperluas agar sanggup menangani jenis gambar khusus, atau menyediakan cara lain untuk membaca dan menulis gambar tersebut. 'Perintah'-nya sendiri didaftar dalam file bernama "delegates.xml" yang terletak di direktori konfigurasi sistem IM. Namun IM juga membaca "delegates.xml" yang terletak di sub-direktori pribadi ".magick" pada direktori home Linux/UNIX pengguna. Di file kedua inilah pengguna sebaiknya menaruh 'delegate perintah' mereka.
Contoh perintah delegate masukan
Sebagai contoh, saya bisa membuat file "delegates.xml" pribadi di sub-direktori ".magick" pada direktori home Linux/UNIX saya, berbentuk...
<?xml version="1.0" encoding="UTF-8"?>
<delegatemap>
<delegate decode="flip" command="magick '%i' -flip 'miff:%o'"/>
</delegatemap>
Ini file konfigurasi 'delegate' yang lengkap, tetapi hanya baris tengahnya yang benar-benar berupa delegate. Delegate yang sangat sederhana, yang memberi tahu IM bahwa bila ia menemukan gambar bersufiks '.flip' atau berprefiks format 'flip:', ia harus memanggil perintah di atas untuk membaca gambar berformat 'flip' itu. Sebagai contoh.. |
magick flip:tree.gif delegate_tree_flip.gif
![[IM Output]](../static/img/files/delegate_tree_flip.gif)
Pada contoh ini yang dilakukan perintah delegate hanyalah memakai perintah IM "magick" terpisah untuk membalik gambar secara vertikal, bahkan sebelum perintah IM aslinya membaca dan memproses gambar itu! Delegate mengandaikan perintahnya memahami format file gambar yang diberikan, dan mengembalikan format file gambar APA PUN yang dipahami dan dapat diproses IM sendiri (dalam hal ini format file gambar MIFF). Bagian '%i' dan '%o' pada delegate mewakili nama file sementara, yaitu nama file masukan dan keluaran yang disediakan bagi perintah delegate itu. Nama file tersebut dibangkitkan IM dan terletak di direktori sementara. Nama file sementara ini juga TIDAK bersufiks gambar, jadi penting untuk memberi prefiks jenis format gambar yang diinginkan bila memang perlu. Hal ini dibuat demikian demi alasan keamanan, dan karena IM sendiri mungkin hanya membaca aliran data, bukan file sungguhan. Artinya pula perintah delegate tidak perlu mengurus hal seperti pembersihan file itu setelah selesai. Ada pula substitusi '%' lain untuk hal-hal seperti nama file sementara kedua bagi file sementara antara, kerapatan gambar, ukuran, dan seterusnya. Rincian lebih lanjut tentang escape ini dan opsi delegate lainnya ada pada komentar di bagian atas file "delegate.xml" 'sistem' yang terpasang bersama IM. Contoh ini mungkin tampak konyol dan sepele, tetapi pada dasarnya artinya Anda kini dapat memakai perintah sekunder untuk mengonversi file data APA PUN menjadi gambar APA PUN yang dipahami IM. IM lalu tahu cara menangani jenis data itu secara otomatis berdasarkan sufiks gambar atau prefiks format, tanpa Anda perlu mengingat semua rinciannya. Banyak delegate jenis ini sudah ditambahkan ke file sistem, jadi layak dilihat-lihat. | _Demi alasan keamanan, delegate di dalam file "delegates.xml" pribadi tidak menimpa delegate yang didefinisikan pada file "delegates.xml" sistem yang terpasang. Anda hanya bisa menambahkan format delegate baru yang unik di ".magick/delegates.xml" pada direktori home Anda; delegate kembar yang menyusul akan diabaikan.
Tentu saja bila format masukannya sudah dikenali secara internal, delegate sistem tidak akan dilihat sama sekali.
Dan seperti biasa, bersihkan masukan pengguna mana pun (terutama pengguna web), sebab Anda tentu tidak ingin pengguna memanfaatkan sebuah delegate tanpa sepengetahuan Anda.
_
Sebagai contoh, sejak IM v6.4.2-6 delegate "autotrace:' ditambahkan ke file delegate sistem, yang menjalankan perintah "AutoTrace" saat membaca gambar masukan APA PUN. IM mengonversi gambar masukan itu ke format gambar PNG yang dibutuhkan program delegate tersebut, menyaringnya lewat delegate, lalu membaca SVG hasilnya (biasanya lewat pustaka RSVG eksternal) untuk menghasilkan versi bertepi mulus dari gambar bitmap masukan aslinya. Lihat contoh konvertor raster ke vektor. Bila sebuah konvertor menghasilkan beberapa file gambar (misalnya PNG), semua gambar terpisah itu perlu digabungkan ke satu format multi-gambar seperti MIFF, supaya IM dapat membaca banyak gambar dari satu file keluaran. Kadang IM merangkai beberapa program delegate sekaligus untuk membaca sebuah gambar. Misalnya, untuk membaca halaman 'HTML' sebagai gambar, IM lebih dulu memanggil delegate "html2ps" untuk mengonversinya ke postscript. Lalu file postscript hasilnya dikonversi menjadi sekumpulan gambar memakai program delegate khusus "ghostscript". Tentu saja memakai dua delegate atau lebih seperti ini bisa menimbulkan masalah lain karena interaksinya rumit, pemasangannya keliru, dan bug yang mungkin ada pada program delegate itu. Namun secara umum cara ini berhasil, dan menjadi salah satu aspek kunci yang membuat ImageMagick terasa ajaib.
Contoh delegate keluaran
Hal serupa dilakukan saat menyimpan ke format file gambar tertentu yang tidak langsung dipahami IM. Misalnya, dengan menambahkan delegate ini ke file ".magick/delegates.xml" pribadi Anda, IM dapat diberi tahu cara membuat file gambar '.xyzzy'.
<delegate decode="gif" encode="xyzzy" command='mv "%i" "%o"'/>
![[IM Text]](../static/img/files/write_stdout.txt.gif)
![[IM Text]](../static/img/files/write_identify.txt.gif)
![[IM Output]](../static/img/files/eye_magnify.gif)
![[IM Output]](../static/img/files/news_magnify.gif)
![[IM Output]](../static/img/files/storm_magnify.gif)
![[IM Output]](../static/img/files/image-0.gif)
![[IM Output]](../static/img/files/image-1.gif)
![[IM Output]](../static/img/files/image-2.gif)
![[IM Output]](../static/img/files/image_0.gif)
![[IM Output]](../static/img/files/image_1.gif)
![[IM Output]](../static/img/files/image_2.gif)
![[IM Output]](../static/img/files/image_000.gif)
![[IM Output]](../static/img/files/image_001.gif)
![[IM Output]](../static/img/files/image_002.gif)
![[IM Output]](../static/img/files/image_1_of_3.gif)
![[IM Output]](../static/img/files/image_2_of_3.gif)
![[IM Output]](../static/img/files/image_3_of_3.gif)
![[IM Output]](../static/img/files/image_101.gif)
![[IM Output]](../static/img/files/image_102.gif)
![[IM Output]](../static/img/files/image_103.gif)
![[IM Output]](../static/img/files/parrots_lrg.jpg)
![[IM Output]](../static/img/files/parrots_big.jpg)
![[IM Output]](../static/img/files/parrots_med.jpg)
![[IM Output]](../static/img/files/parrots_sml.jpg)
![[IM Output]](../static/img/files/scroll_lrg.jpg)
![[IM Output]](../static/img/files/scroll_big.jpg)
![[IM Output]](../static/img/files/scroll_med.jpg)
![[IM Output]](../static/img/files/scroll_sml.jpg)
![[IM Text]](../static/img/files/write_miff_info.txt.gif)
![[IM Text]](../static/img/files/color_table.png)
![[IM Text]](../static/img/files/info_image.txt.gif)
![[IM Text]](../static/img/files/info_verbose.txt.gif)
![[IM Text]](../static/img/files/txt_netscape.txt.gif)
![[IM Text]](../static/img/files/txt_netscape_16.txt.gif)
![[IM Text]](../static/img/files/txt_cspace_lab.txt.gif)
![[IM Text]](../static/img/files/txt_shell_read.txt.gif)
![[IM Text]](../static/img/files/tree_netpbm.ppm.gif)
![[IM Text]](../static/img/files/rose_one.txt.gif)
![[IM Text]](../static/img/files/rose_sparse.txt.gif)
![[IM Output]](../static/img/files/histogram-0.gif)
![[IM Output]](../static/img/files/histogram-1.gif)
![[IM Output]](../static/img/files/histogram-2.gif)
![[IM Text]](../static/img/files/b64_image.txt.gif)
![[snapshot]](../static/img/img_diagrams/xterm_darken.png)