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

Contoh penggunaan ImageMagick -- membuat thumbnail dan framing

Kata pengantar dan indeks contoh penggunaan ImageMagick

Penyimpanan thumbnail

Pembuatan thumbnail secara umum

Teknik non-IM lainnya |

Menambah pernak-pernik

|

Teknik framing

Framing dengan gambar tepi

Salah satu penggunaan ImageMagick yang paling besar adalah pembuatan thumbnail untuk album foto keluarga, halaman olahraga dan hobi, katalog, dan seterusnya. Biasanya untuk dipakai di world wide web atau di CD foto. Halaman ini menyajikan contoh dan teknik yang dipakai untuk menghasilkan thumbnail.


Penyimpanan thumbnail

Saya ingin mulai dengan satu hal yang sangat penting. Gambar asli dari kamera video dan hasil pindai foto sebaiknya disimpan di tempat yang aman dalam format aslinya, sebaiknya format non-lossy (bukan format gambar JPEG), tanpa modifikasi, resize, atau perubahan lain, kecuali mungkin penggantian nama file. Tentu saja gambar hasil pindai bisa dipindai ulang, tetapi jauh lebih baik memakai ulang sumber aslinya daripada mengerjakannya lagi dari salinan yang mutunya sudah menurun. Ini SANGAT penting, karena modifikasi dalam bentuk apa pun berarti hilangnya sebagian informasi dalam gambar, dan gambar asli itulah sumber yang memungkinkan gambar diolah ulang untuk keperluan lain. Gambar asli tidak harus menjadi gambar kerja, yang bisa saja di-resize atau disesuaikan warnanya untuk ditampilkan; yang penting gambar itu tersimpan dan dicadangkan di tempat yang aman untuk dipakai kelak. Hal berikutnya, bahkan sebelum thumbnail apa pun dibuat, adalah memutuskan bagaimana thumbnail akan disimpan relatif terhadap format gambar berukuran normal, lalu berpegang pada skema itu. Ini terutama penting untuk halaman web. Skema yang ada antara lain...

  • Simpan gambar foto utama dalam format lossy JPEG pada ukuran yang diinginkan atau diperlukan, lalu pakai nama yang sama untuk thumbnail yang dihasilkan, tetapi dengan format gambar GIF. Misalnya nama file sama, tetapi format dan sufiksnya berbeda. Gambar utama: photo_name.jpg Thumbnail: photo_name.gif
  • Simpan thumbnail dengan nama yang sama di sub-direktori bernama, misalnya, "thumbs" atau apa pun yang nyaman bagi Anda. Gambar utama: photo_name.jpg Thumbnail: thumbs/photo_name.jpg
  • Pakai format yang sama dengan gambar aslinya, tetapi dengan tambahan string pada nama file. Tambahan yang lazim antara lain "_tn", "_small", "_thumb", dan seterusnya... Gambar utama: photo_name.jpg Thumbnail: photo_name_tn.jpg
  • Gabungan dari cara-cara di atas. Tidak ada alasan thumbnail tidak boleh disimpan dalam format gambar yang berbeda, dengan sufiks tambahan pada nama file, sekaligus disimpan di subdirektori! Gambar utama: images/photo_name.jpg Thumbnail: thumbs/photo_name.jpg.gif Cara ini sebenarnya cukup lazim di WWW, dan saya bahkan pernah melihat kedua direktori itu disimpan di mesin yang sama sekali terpisah!

Skema pertama bisa memakai "magick mogrify" untuk menghasilkan semua thumbnail tanpa merusak gambar aslinya, yaitu lewat pengaturan "-format" yang menentukan format gambar keluaran. Sejak IM v3.2.0, skema kedua juga bisa dikerjakan dengan "magick mogrify" berkat tambahan pengaturan khusus "-path" yang menentukan direktori lain sebagai tempat menyimpan gambar yang telah diubah. Sebagai contoh, perintah ini mengonversi gambar JPG menjadi thumbnail GIF di sub-direktori "thumbs" yang baru saja dibuat.

  mkdir thumbs
  magick mogrify  -format gif -path thumbs -thumbnail 100x100 *.jpg

Metode lainnya menuntut salah satu dari ini: menyalin dulu gambar aslinya sebelum menjalankan "magick mogrify", membuat skrip khusus untuk memproses gambar, atau cara DIY yang lain. Sejumlah teknik non-IM yang lebih sederhana diuraikan di akhir bagian contoh Pemrosesan batch - tanpa memakai "magick mogrify". Metode mana pun yang dipilih, yang penting adalah memilih satu skema penyimpanan thumbnail, lalu berpegang padanya. Dengan skema yang sama untuk semua thumbnail, skrip shell atau Perl bisa ditulis agar pembuatan thumbnail dan bahkan pembuatan tautan HTML-nya menjadi mudah. Soal ini akan dibahas nanti.

Pemilihan format thumbnail

Format tempat thumbnail disimpan sangat memengaruhi ukuran akhirnya di disk dan kecepatan unduhnya di halaman web. Untuk itu saya sarankan Anda mempelajari rangkuman berbagai format file yang umum. Khususnya, perhatikan hal-hal berikut...

**JPEG** mengompres dengan baik dan bersifat lossy, tetapi dirancang untuk gambar dunia nyata yang besar, bukan thumbnail kecil. Format ini juga TIDAK memungkinkan transparansi dalam bentuk apa pun. Ringkasnya, format ini bagus untuk gambar besar, buruk untuk thumbnail. Waspadai profil (lihat bagian berikutnya). Meski JPG tidak dianjurkan untuk thumbnail, untuk menampilkan gambar di WWW disarankan memakai gambar yang lebih kecil, 800x600 piksel, dengan persentase "`[-quality](https://imagemagick.org/command-line-options/#quality)`" yang jauh lebih rendah (katakanlah 50 atau bahkan 30%), walau tampilannya tidak akan begitu bagus. Ada pula yang menyarankan bahwa "`[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor) 2x1`" juga menghasilkan ukuran gambar JPEG yang lebih kecil. Saya menyarankan agar gambar asli yang utuh jangan pernah diletakkan langsung di web, kecuali sementara (di lokasi yang dirujuk) supaya seorang teman bisa mengunduhnya. Ingat, jangan menautkannya (bahkan lewat pengindeksan direktori), dan jangan lebih dari sehari, atau gambar itu bisa terjaring Google.
 **GIF** cocok untuk gambar kecil yang sederhana, dan kompresinya lumayan. Batas warnanya 256, tetapi pada gambar kecil hal ini jarang terasa. Format ini juga bisa membuat animasi bergaya kartun, meski thumbnail tidak memerlukannya, kecuali Anda memang ingin tampil berhias. Yang jadi masalah, format ini hanya punya transparansi boolean (hidup/mati), sehingga border pada gambar berbentuk khusus tampak buruk sekali. Solusinya adalah merancang thumbnail agar hanya memakai transparansi boolean, atau mengaturnya supaya hanya bisa dipakai di atas warna latar belakang tertentu. Untuk rinciannya lihat contoh [GIF di atas warna atau pola latar belakang](formats.html#bgnd). 
 **PNG** adalah format ideal masa kini untuk thumbnail. Kompresinya bagus, dan punya beberapa gaya format internal. Format ini non-lossy, bisa menampilkan semua warna, dan kini dipahami hampir semua peramban (walau Microsoft Internet Explorer sebelum v7 perlu tambahan java script pada halaman web). Yang lebih penting, format ini memahami warna semitransparan, sehingga bayangan dan tepi bisa tajam dan bersih, atau pudar dan buram sesuai keinginan. Namun format ini tidak menangani animasi, meski format MNG yang berkerabat bisa. Sayangnya sangat sedikit peramban yang tampaknya mendukung format itu. Untuk thumbnail, ukuran gambar akhir bisa diperkecil dengan menurunkan kedalaman dan jumlah warna, serta menyetel kualitas kompresi "`bzip`" yang lebih tinggi (digit pertama pada "`[-quality](https://imagemagick.org/command-line-options/#quality)`") untuk gambar thumbnail akhirnya. Sebagai contoh, berikut ini disarankan untuk thumbnail PNG kecil yang tidak melibatkan transparansi.


        -strip  -quality 95  PNG8:thumbnail.png

Ini memakai format PNG yang lebih kecil, 8 bit, atau terbatas 256 warna. Gambar akhir juga bisa diproses ulang lewat aplikasi sekunder (lihat Pemrosesan PNG non-IM) yang bisa mencari sendiri kompresi PNG terbaik untuk gambar tertentu itu. Ada pula program yang melakukan pengurangan warna ke format internal PNG yang lebih kecil sambil mempertahankan warna semitransparan. Hal ini belum ditangani IM saat ini. Satu kata terakhir soal format... Format apa pun yang dipakai untuk thumbnail, kalau harus menyimpan gambar antara yang belum selesai, pakailah format PNG (tanpa pengurangan warna) atau MIFF. Dengan begitu informasi warna gambar terjaga sebanyak mungkin pada tahap antara. Lakukan pengurangan warna, atau simpan ke format GIF atau JPEG, hanya sebagai langkah yang benar-benar terakhir. Ini penting, jadi saya ulangi...

JANGAN gunakan JPEG, PNG8, atau GIF untuk gambar kerja antara!
Lebih baik pakai PNG atau MIFF.

Profil, stripping, dan penanganan JPEG

Banyak gambar dari kamera digital, perangkat lunak pemindai, dan sebagian program lukis (Photoshop terkenal soal ini) menyimpan informasi tambahan tentang gambar dalam bentuk profil. Ini mencakup format gambar seperti JPEG, PNG, TIFF, dan sejak IM v6.2.4-1 juga GIF. Tentu saja format khas IM, MIFF, juga begitu. (Lihat Profil gambar untuk informasi yang lebih rinci.) Profil ini bisa berukuran sampai 60 Kb, sehingga sangat memengaruhi ukuran file, dan secara bawaan IM akan mempertahankan informasi profil tersebut. Thumbnail tidak memerlukan data ini, dan sering kali gambar utamanya pun tidak. Profil bisa dihapus dari gambar dengan perintah IM berikut...

  magick input.jpg  -strip output.jpg

  magick mogrify -strip  *.jpg

Opsi "-profile '*' " juga bisa dipakai untuk menghapus profil. Namun sebaiknya profil hanya di-strip ketika gambar memang dimodifikasi, terutama saat ukurannya diperkecil untuk tampilan web atau untuk gambar thumbnail. Meng-strip profil sambil melakukan resize, khususnya untuk menghasilkan gambar thumbnail yang lebih kecil, begitu lazimnya sehingga "-resize" dan "-strip" digabung menjadi satu operasi baru, justru untuk keperluan ini. Sewajarnya operasi resize ini diberi nama "-thumbnail". Sebagai contoh...

  magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif

  magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'

| Sebelum IM v6.5.4-7, "-thumbnail" akan meng-strip SEMUA profil dari gambar, termasuk profil warna ICC. Sejak versi itu profil warna dipertahankan. Kalau profil warna tidak diinginkan, "-strip" semua profil.
"magick mogrify" tentu saja akan menghasilkan thumbnail untuk seluruh direktori berisi gambar JPEG, tetapi hati-hati agar perintah itu tidak menimpa thumbnail yang ingin dipertahankan. Untuk sejumlah metode non-IM lain dalam mengulang proses atas banyak gambar, lihat bagian contoh Pemrosesan batch - tanpa memakai Mogrify. Untuk gambar yang sangat besar, operator resize "-thumbnail" melangkah lebih jauh: gambarnya lebih dulu diperkecil sampai 5 kali ukuran thumbnail akhir, baru kemudian operasi resize yang sesungguhnya dijalankan. Ini mempercepat pembuatan thumbnail. Namun untuk mem-thumbnail gambar JPEG, ada metode yang lebih baik lagi untuk membatasi ukuran gambar awal, yaitu dengan tidak membaca seluruh gambar ke memori sejak awal. Pengaturan "-define jpeg:size=" (seperti pada contoh di atas) adalah petunjuk khusus bagi pustaka gambar JPEG untuk mengurangi jumlah data yang dibaca dari gambar JPEG yang SANGAT BESAR. Lihat Membaca file JPEG. | _Sebelum IM v6.5.6-0, pengaturan coder ini diambil dari pengaturan "-size". Ini menimbulkan masalah ketika pengguna memakai "-size" untuk pembuatan gambar, tetapi kemudian pembacaan JPEG memberi hasil yang tak terduga. Karena itu pengaturan ini diubah menjadi pengaturan coder tersendiri.

Pada versi IM yang lebih lama, pengaturan itu mungkin perlu direset dengan "+size sebelum membaca gambar JPEG, karena peran 'ganda' inilah._
Sejak IM versi 6.2.6-2 ditambahkan pengubah baca gambar yang baru, yang memungkinkan gambar masukan di-resize segera setelah dibaca. Opsi ini bekerja pada SEMUA format gambar, bukan hanya gambar JPEG. Namun ini bukan pengganti pengaturan "-define jpeg:size=" untuk gambar JPEG. Karena itu, cara yang dianjurkan untuk me-resize format gambar masukan APA PUN kini adalah...

  magick -define jpeg:size=240x180 input.img'[120x90]' \
          -strip  output_thumbnail.gif

Baiklah, mari kita lanjut ke contoh thumbnail IM yang praktis...


Pembuatan thumbnail secara umum

Membuat thumbnail secara umum (tinggi tertentu)

Mari kita magick sebuah contoh gambar JPEG berukuran besar menjadi thumbnail GIF setinggi 90 piksel dengan lebar yang disesuaikan otomatis (dalam batas lebar 250 piksel) agar rasio aspek gambarnya terjaga. |

  magick -define jpeg:size=500x180  hatching_orig.jpg  -auto-orient \
          -thumbnail 250x90   -unsharp 0x.5  thumbnail.gif

[IM Output]
Perhatikan bahwa di atas saya memakai opsi "-thumbnail". Opsi ini bukan hanya me-resize gambar, tetapi juga meng-strip seluruh informasi profil dan komentar yang mungkin ada pada gambar JPEG aslinya. Selain itu, karena ia memakai operator resize "-sample" untuk pengecilan awal gambar, prosesnya lebih cepat sekaligus memberi hasil yang memadai untuk thumbnail kecil. Saya juga menyetel "-define jpeg:size=" minimum untuk gambar yang dibaca. Nilai ini diteruskan ke pustaka JPEG, yang akan mengembalikan gambar berukuran antara ukuran itu dan dua kali lipatnya (kalau memungkinkan), alih-alih gambar asli yang sangat besar itu secara utuh. Intinya, jangan membanjiri memori komputer dengan gambar raksasa kalau memang tidak perlu. Petunjuk ukuran JPEG yang saya pakai setidaknya dua kali ukuran thumbnail akhir, supaya resize tetap menghasilkan tampilan yang layak. Operator "-auto-orient" memastikan gambar, kalau berasal dari kamera digital, diputar dengan benar sesuai orientasi kameranya. Ini tidak diperlukan untuk gambar 'desktop' yang saya pakai, tetapi saya sertakan di atas demi pengguna kamera digital. Perhatikan bahwa orientasi tetap bisa meleset, terutama untuk foto yang diambil tegak lurus ke bawah atau ke atas, misalnya saat memotret dokumen. Hasilnya adalah thumbnail dengan tinggi tertentu, tetapi lebarnya bervariasi. Saya memakai thumbnail semacam ini untuk halaman web saya sendiri, supaya sederet gambar dalam satu baris sama tingginya dan tampak rapi. Batas lebar 250 piksel di atas itu penting. Kalau dibiarkan kosong (misalnya memakai "-thumbnail x90"), IM bisa bermasalah saat membuat thumbnail dari gambar yang sangat panjang dan tipis seperti yang ditunjukkan di Web Line Images. Hasilnya justru berupa pembesaran gambar yang sangat sangat panjang, bukan thumbnail kecil. Sebagian orang (termasuk saya) merasa bahwa meski resize IM termasuk salah satu implementasi terbaik (lihat Resize IM vs program lain), hasilnya masih agak buram. Karena itu hasil di atas bisa diperbaiki dengan menajamkan gambarnya sedikit (memakai "-unsharp") setelah operasi resize "-thumbnail". Untuk informasi lebih lanjut lihat Menajamkan gambar yang di-resize -- teknik resize ala Photoshop, Tetapi sungguh, semuanya kembali pada selera pribadi.
Versi "magick mogrify"-nya sama dengan perintah "magick" (tanpa gambar masukan di awal), tetapi akan membuat thumbnail secara otomatis untuk setiap gambar JPEG di direktori saat ini. Argumen gambarnya diapit tanda kutip supaya IM sendiri yang memindai direktori, bukan shell baris perintah. Ini mencegah 'line limit overflow error' pada direktori yang berisi gambar dalam jumlah sangat banyak.

  magick mogrify  -format gif -define jpeg:size=500x180 -auto-orient \
                -thumbnail 250x90 -unsharp 0x.5  '*.jpg'

| _Perhatikan bahwa "magick mogrify" akan membuat thumbnail tanpa pandang bulu, menimpa gambar mana pun yang bernama sama. Dalam hal ini gambar GIF. Berhati-hatilah sekali setiap kali memakai perintah ini.

Sebaiknya selalu buat salinan cadangan sebelum melakukan pemrosesan apa pun.
| _Alih-alih menentukan format yang berbeda (memakai "-format") supaya "magick mogrify" tidak menimpa gambar sumber aslinya, pengaturan "-path" bisa dipakai untuk menetapkan direktori thumbnail tersendiri. Kedua opsi keluaran itu bisa dipakai bersamaan.

Meski "magick mogrify" bisa mengeluarkan gambar baru dengan sufiks yang berbeda ("-format") atau direktori yang berbeda ("-path"), hanya itulah pilihan yang tersedia pada perintah ini. Kalau nama gambarnya juga ingin diubah, misalnya menambahkan "_tn" atau "_sm" untuk menandai versi thumbnail atau versi kecil, saya sarankan buat skrip shell yang mengerjakannya untuk Anda, memproses gambar satu per satu memakai "magick". Saya menulis skrip semacam itu, sekaligus menghasilkan indeks HTML pada saat yang sama.

Resize thumbnail agar pas

Bentuk lain pembuatan thumbnail otomatis adalah mengecilkan gambar agar pas dalam kotak berukuran tetap, katakanlah "100x100", tetapi dengan mempertahankan rasio aspek gambarnya. Nah, itulah arti bawaan pengaturan geometry pada resize. Namun saya lebih suka tidak memperbesar gambar yang memang sudah muat di kotak seperti itu. Untuk itu tambahkan ">" pada string geometry-nya. |

  magick -define jpeg:size=200x200 hatching_orig.jpg \
          -thumbnail '100x100>' rectangle.gif

[IM Output]
Seperti sebelumnya, rasio aspek gambarnya dipertahankan, sehingga thumbnail-nya kecil kemungkinan berukuran tepat 100 piksel persegi. Namun setidaknya salah satu dimensi gambarnya akan 100 piksel.

Menambah padding pada thumbnail

Permintaan yang paling sering berikutnya adalah membuat thumbnail yang tepinya diisi border berwarna tertentu (biasanya 'black' atau 'transparent', tetapi untuk contoh-contoh ini saya akan memakai 'skyblue') supaya ukuran thumbnail-nya persis seperti yang diinginkan. Contohnya: gambar 400x300 piksel yang dikecilkan agar muat di kotak 100x100 piksel biasanya (dengan cara di atas) berukuran 100x75 piksel. Kita ingin menambahkan border padding di bagian atas dan bawah gambar (dan di sisi kiri kanannya juga untuk memastikan) supaya gambar thumbnail akhirnya selalu berukuran 100x100 piksel. Ada beberapa cara melakukannya, dan sejak IM v6.3.2 cara terbaiknya adalah memakai operator Extent. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -background skyblue -gravity center -extent 100x100 pad_extent.gif

[IM Output]
Sejak IM versi 6.2.5, crop viewport juga bisa dipakai, lalu hasilnya diratakan di atas sebuah warna latar belakang. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -gravity center  -crop 120x120+0+0\! \
          -background skyblue  -flatten    pad_view.gif

[IM Output]
Perbedaan utama antara memakai Extent dan crop viewport adalah apakah yang diinginkan itu kanvas virtual yang minimal, atau seluruh areanya benar-benar diisi padding. Cara lain memberi padding pada gambar adalah menumpangkan thumbnail di atas gambar latar belakang (gambar sungguhan, warna polos, atau kanvas yang di-tile) yang ukurannya pas, dalam hal ini gambar bawaan "granite:" berukuran 128x128. |

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          granite: +swap -gravity center -composite pad_compose.gif

[IM Output]
Metode ini mungkin yang paling baik dipakai pada versi IM yang lebih lama (seperti IM v5), meski operasi "-composite" harus dikerjakan oleh perintah "composite" tersendiri, bukan dengan cara satu perintah seperti di atas. Namun dari sudut pandang pemrosesan gambar, semua cara di atas sebenarnya melakukan hal yang sama.

Memotong thumbnail agar pas

Alternatifnya, alih-alih memberi padding pada gambar agar pas dengan ukuran thumbnail yang kita mau, adalah memotong bagian gambar yang tidak muat pada ukuran akhir. Tentu ini berarti sebagian gambar asli benar-benar hilang, terutama bagian tepinya, tetapi hasilnya adalah thumbnail yang diperbesar dari bagian tengah gambar. Bagian tengah ini biasanya (walau tidak selalu) merupakan subjek utama gambar, jadi cara ini praktis untuk membuat thumbnail. Sejak IM v6.3.8-3 ditambahkan flag opsi resize khusus '^' agar hal ini lebih mudah. Kita tinggal me-resize memakai flag ini lalu memangkas bagian gambar yang meluap dari ukuran yang diinginkan. |

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif

[IM Output]
Seperti terlihat, thumbnail gambarnya jauh lebih besar dan lebih rinci, tetapi dengan konsekuensi terpotongnya sisi-sisi gambar asli. Untuk informasi lebih lanjut tentang opsi ini lihat Resize untuk mengisi area tertentu. | Sebelum IM v6.3.8-3, saat flag khusus ini ditambahkan, dibutuhkan akal-akalan yang sangat rumit untuk mencapai hasil yang sama. Lihat Mengubah ukuran untuk mengisi ruang tertentu untuk rinciannya.

Ukuran thumbnail berdasarkan luas area

Dua metode terakhir sering membuat gambar jadi sangat kecil dengan banyak padding tambahan, atau justru memotong banyak bagian gambar supaya ruangnya terisi penuh. Namun dengan flag resize yang berbeda, kita bisa mendapat thumbnail yang berada di antara dua ekstrem itu. Misalnya, thumbnail 100x100 piksel memuat 10.000 piksel. Nah, kalau resize diminta mengubah ukuran gambar kita menjadi kira-kira sebanyak itu piksel (memakai flag '@' pada resize), hasilnya adalah gambar yang butuh sedikit padding sekaligus sedikit pemotongan. Cara ini memaksimalkan ukuran thumbnail yang dihasilkan tanpa memotong terlalu banyak. Sebagai contoh... |

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 10000@ \
          -gravity center -background skyblue -extent 100x100  area_fit.gif

[IM Output]
Seperti terlihat, thumbnail-nya punya sedikit padding dan gambarnya sedikit terpangkas, tetapi hasilnya barangkali merupakan kecocokan terbaik antara gambar dan ruang thumbnail yang tersedia.

Rangkuman memuatkan gambar ke ruang tertentu

Ringkasnya, berikut hasil ketiga metode untuk mem-thumbnail gambar ke area berukuran tertentu. Ketiganya memakai kode yang persis sama, hanya dengan sedikit perubahan pada argumen/flag resize yang dipakai. [IM Output]
Pas dengan padding
resize, tanpa flag | [IM Output]
Pas berdasarkan area
resize, flag '@' | [IM Output]
Dipotong agar pas
resize, flag '^'

Padding dan crop persegi

Metode padding dan crop di atas mengandaikan ukuran akhir area tempat gambar harus muat sudah diketahui. Tetapi tidak selalu begitu. Kadang yang diinginkan hanya 'mempersegikan gambar', entah dengan memberinya 'padding' (persegi eksternal) atau dengan 'mencukur' tepinya (persegi internal). Dari Squaring Images di Forum Diskusi IM, dikembangkan sejumlah metode. Mempersegikan secara eksternal bisa dilakukan dengan Mosaic untuk membuat kanvas latar belakang yang lebih besar memakai salinan gambar yang diputar. |

  magick thumbnail.gif \
          \( +clone -rotate 90 +clone -mosaic +level-colors white \) \
          +swap -gravity center -composite    square_padded.gif

[IM Output]
Sebaliknya, mempersegikan secara internal sedikit lebih sulit dan menuntut lebih banyak kerja. Yang satu ini memakai penanganan mask yang berat untuk menghasilkan kanvas yang lebih kecil. |

  magick thumbnail.gif \
          \( +clone +level-colors white \
             \( +clone -rotate 90 +level-colors black \) \
             -composite -bordercolor white -border 1 -trim +repage \) \
          +swap -compose Src -gravity center -composite \
          square_cropped.gif

[IM Output]
Cara alternatifnya adalah memakai distort no-op dengan viewport distort untuk memangkas atau memberi padding pada gambar (lihat Crop persegi terpusat dengan viewport distort). Pada dasarnya cara ini memakai 'percent escape' untuk melakukan perhitungan yang diperlukan operasi sejenis Extent. Persegi eksternal (padding)... |

  magick thumbnail.gif  -virtual-pixel white -set option:distort:viewport \
     "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_external.gif

[IM Output]
Pengaturan piksel virtual dipakai untuk menentukan warna padding-nya. Persegi internal (dipangkas)... |

  magick thumbnail.gif   -set option:distort:viewport \
     "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_internal.gif

[IM Output]
Berkat halaman Tidbits milik Fred Weinhaus. Ini versi yang lebih sederhana, tetapi akan menghilangkan meta-data (seperti string komentar atau profil) yang mungkin dimiliki gambar. |

  magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
          xc:none +swap -gravity center -composite square_internal_2.gif

[IM Output]
| IMv7 akan memungkinkan perhitungan matematis di atas dikerjakan langsung sebagai bagian dari argumen crop atau extent, sehingga meta-data gambar tidak hilang.

Crop manual

Cara biasa saya membuat gambar thumbnail untuk halaman web saya adalah campuran skrip otomatis dan manual. Susunan akhir gambar saya begini..

  • Saya memakai PNG atau TIFF untuk hasil pindai foto yang asli dan SANGAT besar. Atau gambar JPEG asli yang diunduh dari kamera digital. Pada dasarnya ini gambar sumber asli yang tidak dimodifikasi, untuk diarsipkan. Sekarang saya juga suka menyertakan string "_orig" pada nama file gambar ini.
  • Gambar format JPEG yang lebih kecil untuk versi yang bisa dilihat di web ketika thumbnail-nya diklik atau dipilih. Gambar ini di-resize agar muat di kotak 800x800 piksel, ukuran yang cocok untuk dilihat kebanyakan pengguna web. Biasanya saya menambahkan "_md" pada nama file untuk menandai gambar berukuran sedang.
  • Dan terakhir thumbnail GIF yang di-resize ke tinggi tetap 90 piksel dengan lebar bervariasi. Dengan begitu baris-baris thumbnail yang dipusatkan di halaman web tampak cukup rapi dan teratur, tetapi otomatis mengisi lebar jendela peramban, berapa pun ukuran jendela yang dipakai pembacanya. Sekali lagi, biasanya saya kini menyertakan "_tn" pada nama file gambar untuk menandai bahwa itu thumbnail.

Pertama-tama saya membuat gambar JPEG yang bisa dilihat di web (ukuran sedang) dengan "magick mogrify" dari gambar hasil pindai aslinya. Ini memperkecil waktu unduh dan ukuran tampil gambar menjadi sesuatu yang praktis bagi pengguna web pada umumnya (yang bisa saja terhubung lewat modem). Dari gambar-gambar itu saya membuat set thumbnail awal, lagi-lagi dengan "magick mogrify". Namun pada foto biasa saya sering mendapati subjek thumbnail-nya jadi terlalu kecil untuk menjadi thumbnail yang efektif saat dilihat. Untuk membenahinya saya memeriksa thumbnail yang dibuat otomatis itu, dan pada sekitar separuh kasus saya membuat sendiri thumbnail 'yang di-zoom ke subjek' secara manual. Saya membaca gambar JPEG-nya lalu memangkasnya sampai ke subjek utama gambar, jadi seolah 'menyorot' subjek fotonya dan membuang sebagian besar konteks latar belakangnya. Hasilnya kemudian dihaluskan dan di-thumbnail, entah memakai "magick -thumbnail", atau lebih sering di program grafis yang sama yang saya pakai untuk melihat dan memangkas gambar (biasanya "XV", lihat di bawah). Jadi alih-alih thumbnail yang orang-orang di fotonya nyaris tak terlihat (kiri), saya memangkas secara manual di sekitar subjeknya, menonjolkan inti fotonya (kanan), sebelum di-thumbnail. Dengan begitu pengguna bisa melihat isi gambar lebih jelas, sehingga lebih mudah memutuskan apakah mereka benar-benar ingin mengunduh dan melihat versi JPEG gambar yang lebih besar. Queensland KiteFlyers, Ron dan Val Field
[IM Output]
Thumbnail
yang dibuat
otomatis | | [IM Output]
Thumbnail yang dipangkas
dan di-resize
secara manual
(Klik salah satu gambar untuk melihat foto pindaian aslinya)
Tentu cara ini lebih banyak menuntut kerja manual, tetapi hanya perlu dilakukan sekali per gambar, dan hanya pada gambar yang punya banyak ruang kosong seperti pada contoh di atas. Saya juga hanya melakukannya untuk gambar yang akan saya taruh di web. Tentu saja, karena "magick mogrify" akan menimpa thumbnail yang sudah ada, termasuk yang mungkin dibuat dengan tangan, perintah itu tidak bisa dipakai lagi setelah thumbnail dibuat secara manual. Perintah "magick mogrify" berguna, tetapi juga sangat berbahaya karena menimpa banyak gambar. Selalu pikirkan dulu sebelum menjalankan "magick mogrify" secara menyeluruh atas semua gambar Anda.

Halaman thumbnail HTML

Setelah semua gambar thumbnail tertata di direktori, saya memakai skrip perl khusus bernama "thumblinks" yang saya tulis sendiri, yang mencari gambar-gambar itu (foto JPEG dan thumbnail GIF), lalu menghasilkan tautan HTML, bahkan halaman foto HTML yang lengkap. Skrip itu membaca ukuran thumbnail GIF dan menyertakannya di HTML, lalu memasang file header dan footer yang sudah disiapkan di sekeliling tautan thumbnail-nya. Skrip itu juga membuang tautan thumbnail dari daftar yang dihasilkannya kalau menemukan tautan yang sudah ada di file header atau footer itu sendiri. Ini kedengarannya rumit, tetapi membuat pembuatan halaman HTML saya sangat cepat dan luwes, dan memastikan SEMUA gambar yang sudah di-thumbnail dalam sebuah direktori telah ditambahkan ke halaman indeks direktori itu, sambil tetap membiarkan saya memberi komentar pada gambar tertentu di header indeksnya. Halaman itu juga jadi tidak bergantung pada ukuran jendela pengguna, karena menyesuaikan diri secara otomatis. Untuk contoh sederhana keluaran skrip "thumblinks" saya, lihat Tomb of Castle Artworks. Untuk contoh singkat dan titik awal membuat tautan semacam itu, lihat contoh pemakaian perintah identify.

Thumbnail tautan halaman web FavIcon

Ikon "favion.ico" sering dicari peramban web di halaman web tingkat teratas sebuah situs web, untuk seluruh situs itu. Gambar tersebut memakai format gambar multi-resolusi khusus dan bisa dibuat seperti berikut.

  magick image.png -alpha off -resize 256x256 \
          -define icon:auto-resize="256,128,96,64,48,32,16" \
          favicon.ico

'image.png' boleh gambar apa saja, tetapi sebaiknya persegi. Kalau belum persegi, sebaiknya mempersegikannya juga jadi langkah pertama pada perintah di atas. Resolusi yang lebih besar seperti 128 atau 256 piksel juga bisa disertakan, tetapi sedikit peramban yang memanfaatkannya. Ukuran 16 dan 32 piksel jauh lebih lazim dipakai dalam file ICO semacam itu, jadi memberi penekanan khusus pada keduanya bisa berguna. Ingat pula bahwa banyak peramban akan mengurangi warna gambarnya untuk memperkecil ruang penyimpanannya di file bookmark pengguna. Ini membawa kita ke satu hal lain. Karena biasanya hanya gambar yang paling kecil yang dipakai, dengan pengurangan warna lebih lanjut, sebaiknya gambarnya dibuat sekecil dan setegas mungkin. Berikut contoh me-resize gambar secara manual untuk format file ICO.

  magick image.png  -background white \
          \( -clone 0 -resize 16x16 -extent 16x16 \) \
          \( -clone 0 -resize 32x32 -extent 32x32 \) \
          \( -clone 0 -resize 48x48 -extent 48x48 \) \
          \( -clone 0 -resize 64x64 -extent 64x64 \) \
          -delete 0 -alpha off -colors 256 favicon.ico

Seperti disebutkan, umumnya hanya gambar "favion.ico" di direktori tingkat teratas sebuah situs web yang dipakai. Namun lokasi gambar thumbnail tautan itu bisa juga ditentukan dengan menambahkan tag HTML berikut ke header halaman Anda...

  <LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
  <LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">

"/path/to/favicon.ico" bisa berupa URL/URI absolut atau parsial ke lokasi tempat peramban mengambil gambar thumbnail halaman web itu. Pemakaian 'REL="shortcut"' khas Internet Explorer (sebelum IE9) dan secara resmi bukan bagian dari spesifikasi HTML. Kedua tag HTML itu bisa disatukan memakai 'REL="shortcut icon"', tetapi dengan memisahkannya, format file gambar non-ICO (seperti SVG) bisa dipakai untuk peramban selain IE, misalnya Firefox. Ingat, kalau elemen html ini tidak dipakai, yang dipakai adalah file "favicon.ico" di direktori tingkat teratas situs web itu (kalau ada). Format gambar ICO dipahami secara universal oleh semua peramban modern. Semua peramban kecuali Internet Explorer juga bisa memakai format file gambar JPEG, PNG, dan GIF untuk thumbnail tautannya. Beberapa seperti Firefox bahkan bisa memanfaatkan GIF animasi atau format file gambar SVG. Namun karena format-format terakhir ini umumnya tidak bisa memuat beberapa gambar dengan resolusi dan jumlah warna yang berbeda, mungkin lebih baik tetap memakai format file ICO untuk gambar "favion.ico".


Teknik non-IM lainnya

Program "XV" yang saya pakai untuk pemrosesan gambar manual juga membuat gambar thumbnail, di sub-direktori bernama ".xvpics". Format gambar di direktori itu adalah format thumbnail khas program itu sendiri (sufiks nama file di direktori tersebut diabaikan). Thumbnail ini dibatasi 80x60 piksel, jadi agak "kecil" (kecuali kalau "xv" diretas agar memakai thumbnail yang lebih besar -- lihat tautan di bawah). IM memahami format thumbnail "xv" (yang berbasis format gambar "NetPBM"), jadi semua thumbnail bisa dibuat cepat dengan XV, lalu thumbnail XV dari gambar JPEG itu di-magick menjadi gambar GIF untuk diproses lebih lanjut...

   xv -vsmap &               # generate thumbs with the "Update" button
   rm .xvpics/*.gif          # delete XV thumbs of existing "gif" thumbnails
   magick mogrify -format gif .xvpics/*.jpg
   mv .xvpics/*.gif .        # move the new "gif" thumbnails to original dir

Kalau Anda bosan dengan kecilnya thumbnail XV, apalagi pada layar modern yang lebih besar, kode XV bisa diretas. Lihat catatan modifikasi XV yang saya tulis, yang memungkinkan XV memakai ukuran thumbnail yang lebih besar. Saya sendiri memakai thumbnail 120x90 piksel.


Pemrosesan lanjutan -- menambah pernak-pernik

Yang di atas barulah awal dari apa yang bisa dilakukan untuk membuat thumbnail lebih menarik. Di luar gambar thumbnail dasar, border dan rotasi bisa ditambahkan, bahkan dengan pemilihan gaya secara acak, supaya galeri thumbnail Anda jauh lebih menarik. Tambahan semacam itu pada thumbnail saya sebut 'pernak-pernik', seperti serat halus yang menempel di baju setelah dicuci. Artinya, tambahan itu memang tidak perlu, tetapi bisa membuat halaman web dan gambar indeks jauh lebih menarik. Perlu diingatkan bahwa banyak metode dan pemrosesan berikut ini sangat rumit dan mungkin menuntut pengetahuan yang lebih dalam tentang berbagai opsi pemrosesan gambar ImageMagick.

Menambah label gambar

Saat membuat thumbnail, label juga bisa ditambahkan di atas, di bawah, atau bahkan di atas permukaan thumbnail-nya. Namun pemrosesan gambar semacam ini dibahas lebih tuntas di Menganotasi gambar dengan label. Hanya saja, ingatlah untuk memakai "-thumbnail" atau "-strip", bukan "-resize", pada contoh-contoh di sana. Sebagai contoh... |

  magick thumbnail.gif \
          -background Lavender -fill navy -font Candice -pointsize 24 \
          label:Hatching   -gravity South -append \
          labeled.gif

[IM Output]
Dengan memakai font gabungan, label yang sangat berhias bisa ditumpangkan ke atas gambarnya sendiri. Di sini, misalnya, saya memakai teknik font garis luar lembut lebih pekat untuk menganotasi thumbnail, dengan menggelapkan area di sekitar teks agar teksnya selalu terbaca. |

  magick -define jpeg:size=400x400  hatching_orig.jpg  -resize '120x200>' \
      \( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
         -font SheerBeauty -pointsize 72 -gravity Center \
         -strokewidth 8 -stroke black  -fill black  -annotate 0,0 '%c' \
         -channel RGBA -blur 0x8 \
         -strokewidth 1 -stroke white  -fill white  -annotate 0,0 '%c' \
         -fuzz 1% -trim +repage -resize 115x \
      \) -gravity North -composite           -strip annotated.gif

[IM Output]
Perhatikan bahwa di sini saya tidak memakai gambar "thumbnail.gif" yang sudah dibuat sebelumnya, dan tidak memakai operator resize Thumbnail untuk meng-strip profil dan komentar dari gambar. Saya lalu memakai "+clone", "+sample", dan "-alpha" untuk membuat kanvas kerja transparan yang lebih besar, yang juga memuat salinan meta-data gambar aslinya. Dengan begitu saya bisa memakai string 'comment' gambar itu lewat operator anotasi "-annotate" untuk memasok teks yang ditumpangkan pada gambar. Baru di bagian akhir, setelah overlay teksnya selesai dikomposisikan, saya merapikan dan meng-strip ("-strip") informasi itu.

Tombol timbul

Operator "-raise" pada dasarnya dibuat dengan satu tujuan: menyoroti tepi gambar persegi panjang sehingga membentuk tombol timbul. Ini transformasi thumbnail yang sederhana, cepat, dan efektif. |

  magick thumbnail.gif  -raise 8   raised_button.gif

[IM Output]
Operator yang sama punya bentuk 'plus' yang bisa dipakai untuk membuat efek sorotan yang cekung. |

  magick thumbnail.gif  +raise 8   sunken_button.gif

[IM Output]

Tombol gelembung

Dengan sedikit akal-akalan, operator "-raise" bisa dipakai untuk menghasilkan tombol timbul yang halus dan 'mirip gelembung'.

  magick thumbnail.gif -fill gray50 -colorize 100% \
          -raise 8 -normalize -blur 0x8  bubble_overlay.png
  magick thumbnail.gif bubble_overlay.png \
          -compose hardlight -composite  bubble_button.png

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

Lihat metode komposisi cahaya untuk informasi lebih lanjut tentang teknik semacam ini. Untuk efek lain sejenis lihat Self Framing (internal) di bawah, dan untuk membawanya ke tingkat berikutnya lihat Teknik mask pencahayaan di bawah.

Menambah border

Operator "-border" yang sederhana dan bersahaja bisa dipakai untuk membuat kerangka yang cukup rumit di sekeliling gambar. |

  magick thumbnail.gif \
          -bordercolor black -border 3   -bordercolor white -border 2 \
          \( -background black -fill white -pointsize 24 \
             label:Hatching   -trim +repage \
             -bordercolor black -border 10 \
          \) -gravity South -append \
          -bordercolor black -border 10   -gravity South -chop 0x10 \
          border_framework.gif

[IM Output]

Frame sederhana

Dengan cara serupa, operator "-frame" memudahkan penambahan frame di sekeliling gambar |

  magick thumbnail.gif   -mattecolor peru  -frame 9x9+3+3  framed.gif

[IM Output]
Operator ini juga punya banyak opsi lain untuk membuat selusinan gaya frame yang berbeda. Contoh berbagai kemungkinannya bisa dilihat di Frame, menambahkan border bergaya 3D.

Framing dengan montage

Perintah montage menawarkan cara yang jauh lebih mudah untuk melakukan semua hal di atas, dan lebih banyak lagi. Ia bukan hanya bisa membuat thumbnail (atau seluruh halaman berisi thumbnail), tetapi juga bisa memberi label pada thumbnail berisi informasi seperti nama file, ukuran di disk, dan dimensi, atau string yang ditentukan pengguna. Berikut pemakaian sederhana "magick montage" untuk membuat thumbnail ber-frame. |

  magick montage -define jpeg:size=240x200  -label '%c'  hatching_orig.jpg \
          -frame 6  -geometry '120x100>'  montage_simple.gif

Labelnya berasal dari komentar file gambar JPEG, yang dulu ditambahkan ke gambar itu memakai perintah non-IM "wrjpgcom". Lihat Pemrosesan JPEG non-IM untuk rinciannya. [IM Output]
Bahkan hanya dengan "magick montage" saja, pembuatan thumbnail bisa dibuat benar-benar berhias. |

  magick montage -define jpeg:size=400x180  -label '%c' hatching_orig.jpg \
          -thumbnail '200x90>' -geometry '130x100>'  -mattecolor peru \
          -frame 6  -bordercolor skyblue  -font LokiCola  -pointsize 18 \
          montage_fancy.gif

[IM Output]
Lihat "Montage, larik gambar" untuk rinciannya. Anda mungkin secara khusus tertarik pada contoh Peta gambar thumbnail HTML dengan montage. Contoh itu membuat halaman indeks HTML berisi thumbnail; mengeklik thumbnail-nya akan memunculkan gambar aslinya, di direktori yang sama.

Tepi lembut dan ber-blur

Operator Vignette menyediakan cara sederhana untuk menambahkan tepi yang buram di sekeliling gambar. |

  magick thumbnail.gif -alpha set \
          -background none  -vignette 0x4  vignette.png

[IM Output]
Tentu saja, karena thumbnail ini memakai warna semitransparan, ia perlu disimpan dalam format PNG. Metode Morphology Distance menghasilkan 'feathering' tepi gambar yang benar-benar transparan. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -morphology Distance Euclidean:1,10\! +channel feathered.png

[IM Output]
Jarak maksimum area transparannya dikendalikan flag penskalaan jarak khusus 10\!'. Flag ini baru ditambahkan di IM v6.6.1-6. Keuntungan tambahannya, cara ini juga bekerja pada gambar berbentuk khusus, meski diperlukan inisialisasi yang lebih rumit agar piksel anti-alias terjaga dengan benar dalam rumus jaraknya. Lihat Feathering bentuk memakai Distance untuk rinciannya. Feathering di sini murni gradien linear, dan bisa disesuaikan lebih lanjut memakai operator kontras non-linearitas sigmoidal untuk memberinya tampilan yang lebih halus dan meruncing dengan berbagai cara. Feathering gambar memakai blur juga bisa dilakukan, dengan cara yang sama, yaitu menambahkan piksel virtual transparan sebelum mem-blur kanal alpha saja. Cara ini menghasilkan feathering yang lebih lembut pada gambar, sekaligus membulatkan sudut-sudut gambarnya secara kentara. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png

[IM Output]
Operasi "-level" tambahan (yang hanya menyesuaikan kanal transparansi) memastikan tepinya menjadi transparan penuh, bukan cuma setengah transparan. Namun nilainya memang jatuh tajam ke nol tepat di tepi, karena kurva mirip sigmoid yang dihasilkan blur. Efeknya juga bersifat aditif di sudut-sudut, sehingga sudutnya membulat, sedangkan pada gambar berbentuk khusus dengan cekungan tajam, efek itu bisa membuat piksel yang transparan penuh menjadi semitransparan. Karena itu, untuk bentuk khusus hasilnya mungkin perlu di-mask terhadap gambar aslinya (memakai komposisi Dst-In). Namun untuk thumbnail persegi panjang hasilnya sudah memuaskan. Contoh lain pemakaian feathering semacam ini bisa dilihat di thumbnail berlapis. Alih-alih melakukan penyesuaian level pada feather yang sudah di-blur, kanal alpha yang telah di-blur itu bisa di-threshold pada '50%', sehingga gambar thumbnail di atas mendapat sudut yang seolah-olah membulat. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -blur 0x8  -threshold 50% +channel rounded_corner_blur.gif

[IM Output]
Meski sangat sederhana, hasilnya bukan cara yang benar-benar bagus untuk membulatkan sudut gambar. Pertama, sudutnya sebenarnya tidak melingkar, melainkan berupa kurva 'hiperbolik'. Kedua, hasilnya bukan kurva anti-alias yang halus, melainkan memperlihatkan 'gerigi' akibat efek aliasing operasi threshold. Meski begitu, gambar ini bisa disimpan ke format file GIF. Lihat transparansi boolean GIF untuk rinciannya. Perhatikan pula bahwa operasi "-blur" bisa menjadi sangat lambat kalau argumennya besar untuk menghasilkan sudut membulat yang lebih besar. Karena itu cara membulatkan sudut ini sama sekali tidak dianjurkan untuk skala besar. Untuk efek tepi ber-blur yang lebih tidak biasa, radial blur bisa diterapkan hanya pada kanal alpha. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x45 +channel  radial_blur_edge.png

[IM Output]
Cara ini bekerja lebih baik pada gambar yang benar-benar persegi. Seiring besarnya blur bersudut, pada akhirnya yang dihasilkan adalah tepi mirip vignette yang melingkar. |

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x100 +channel  radial_blur_vignette.png

[IM Output]
Dua artefak mirip anak tangga yang terlihat itu disebabkan oleh dua dimensi ukuran gambarnya. Pada gambar persegi tidak akan ada 'anak tangga' seperti itu. Menambahkan sedikit blur biasa pada contoh terakhir juga bisa memperbaiki masalah anak tangga tersebut.

Sudut membulat dan bentuk lain

Melakukan threshold pada tepi lembut ber-blur (lihat di atas) memang menghasilkan sudut membulat yang cocok untuk transparansi boolean GIF, tetapi tidak menghasilkan sudut 'anti-alias' yang halus. Cara yang benar untuk membuat gambar dengan sudut membulat, atau bentuk apa pun yang lain, adalah benar-benar memotong tiap sudutnya memakai mask berbentuk seperti yang diinginkan. Metode berikut dari Leif Åstrand leif@sitelogic.fi mengalikan sebuah mask gambar utuh untuk memperoleh hasil yang sesuai. |

  magick thumbnail.gif \
     \( +clone  -alpha extract \
        -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
        \( +clone -flip \) -compose Multiply -composite \
        \( +clone -flop \) -compose Multiply -composite \
     \) -alpha off -compose CopyOpacity -composite  rounded_corners.png

[IM Output]
Pada dasarnya perintah ini mengekstrak mask transparansi putih dari gambar aslinya, dengan hanya satu sudut membulat berwarna hitam. Mask itu lalu di-flip dan di-flop untuk menghasilkan mask dengan keempat sudutnya membulat. Akhirnya mask tersebut diterapkan pada gambar aslinya. Untuk gambar yang jauh lebih besar, lebih baik terapkan mask yang jauh lebih kecil pada tiap sudut satu per satu, agar total pemrosesan yang diperlukan berkurang. Langkah pemrosesannya memang lebih banyak, tetapi piksel yang benar-benar diproses secara keseluruhan lebih sedikit. Sebagai contoh, berikut hal yang sama, tetapi dengan memotong bentuk segitiga sederhana yang digambar pada tiap sudut. Cara ini bekerja pada gambar yang jauh lebih besar. |

  magick thumbnail.gif -alpha set  -compose DstOut \
      \( -size 20x15 xc:none -draw "polygon 0,0  0,14 19,0" \
         -write mpr:triangle  +delete \) \
      \( mpr:triangle             \) -gravity northwest -composite \
      \( mpr:triangle -flip       \) -gravity southwest -composite \
      \( mpr:triangle -flop       \) -gravity northeast -composite \
      \( mpr:triangle -rotate 180 \) -gravity southeast -composite \
      corner_cutoff.png

[IM Output]
Kalau yang diinginkan bukan transparansi melainkan warna lain, cara di atas tetap bisa dipakai, lalu transparansinya dihapus. Ini bisa penting untuk gambar JPEG. Namun solusi yang bahkan lebih sederhana (dari segi kerumitan dan pemakaian memori) ditemukan dalam sebuah diskusi forum IM. Cara itu menumpangkan sudut berwarna ('Red' dalam hal ini) alih-alih membuatnya transparan. |

  magick thumbnail.gif \
    \( +clone -crop 16x16+0+0  -fill white -colorize 100% \
       -draw 'fill black circle 15,15 15,0' \
       -background Red  -alpha shape \
       \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
     \) -flatten  rounded_corners_red.png

[IM Output]
Sayangnya metode ini tidak bisa dipakai untuk sekadar 'menghapus' sudut gambar menjadi transparan, karena ada interaksi dengan 'kanvas latar belakang' pada operasi Flatten; operator pelapisan di masa depan mungkin akan mengatasinya. | Contoh terakhir akan gagal pada versi IM sebelum v6.6.6-5, karena operator "-flip" maupun "-flop" tidak menangani offset kanvas virtual dengan benar.
Dengan trik siklus polar, kita bisa menghasilkan mask lingkaran anti-alias yang sempurna untuk thumbnail berukuran apa pun. Tentu saja gambar hasil distorsi itu hanya kita pakai sebagai mask bagi gambar aslinya, supaya hasilnya paling baik. |

  magick thumbnail.gif -alpha set \
    \( +clone -distort DePolar 0 \
       -virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
    -compose Dst_In -composite -trim +repage circle_masked.png

[IM Output]
Gaya pemrosesan gambar ini akan kita lanjutkan di Border dengan sudut membulat di bawah. Di sana kita bukan hanya memotong sudut, tetapi juga menumpangkan gambar frame yang sesuai.

Tepi kertas robek

Leif Åstrand leif@sitelogic.fi menyumbangkan kode IM berikut untuk menghasilkan tepi yang tampak seperti disobek dari kertas berserat (seperti koran)... |

  magick thumbnail.gif \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite torn_paper.png

[IM Output]
Satu perbaikan yang mungkin adalah membuatnya tampak seperti disobek dari sudut sebuah koran. |

  magick thumbnail.gif -bordercolor linen -border 8x8 \
          -background Linen  -gravity SouthEast -splice 10x10+0+0 \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite \
          -gravity SouthEast -chop 10x10   torn_paper_corner.png

[IM Output]
Ini bisa diperbaiki dengan menambahkan border berwarna 'kertas' dan mask berbentuk melengkung, supaya gambarnya tampak seperti disobek kasar dengan tangan. Menambahkan 'bayangan lembut' (lihat berikutnya) juga akan 'mengangkat' gambar hasilnya dari latar belakang, sehingga tampak seperti lembaran tersendiri. Seperti biasa, saran dan sumbangan selalu saya sambut baik.

Menambah bayangan

Operator "-shadow" memudahkan pembuatan bayangan untuk gambar berbentuk apa pun. Sebagai contoh, di sini saya menambahkan bayangan berwarna yang semitransparan pada thumbnail. |

  magick thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x0+4+4 \) +swap \
          -background none -mosaic   shadow_hard.gif

[IM Output]
Tetapi bayangan lembut yang kabur pun sama mudahnya dibuat. |

  magick -page +4+4 thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x4+4+4 \) +swap \
          -background none -mosaic     shadow_soft.png

[IM Output]
Perhatikan bahwa sekali lagi saya memakai gambar format PNG untuk keluaran thumbnail-nya. Alasannya, gambar yang diberi bayangan memuat banyak piksel semitransparan, yang tidak bisa ditangani GIF. (Ya, saya mengulang diri sendiri, tetapi ini penting.) Kalau format GIF atau JPG yang akan dipakai, warna "-background" harus disesuaikan dengan halaman web atau kanvas besar tempat thumbnail itu akan ditampilkan, sebab kedua format itu tidak menangani warna semitransparan. Peringatan: meski cara di atas berhasil untuk thumbnail tunggal, cara itu umumnya gagal ketika beberapa thumbnail hendak dilapiskan satu di atas yang lain. Sebabnya, bayangan tidak menumpuk bersama sebagaimana gambar biasa. Untuk melihat cara menangani bayangan dari beberapa gambar berlapis, lihat layer bayangan.

Menambah ketebalan

Menambahkan ketebalan pada gambar atau bentuk sekilas mirip menambahkan bayangan keras (lihat di atas), tetapi tidak persis sama, dan perlu kerja ekstra agar benar. Sebenarnya ini rumit, karena kita membuat mask berwarna dari gambar itu, lalu menggandakannya beberapa kali dan melapiskannya di bawah gambar asli (memakai komposisi 'DstOver') dengan offset yang makin besar sehingga gambarnya tampak tebal. |

  magick thumbnail.gif -alpha set \
          \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
          \( +clone -repage +1+2 \) \
          \( +clone -repage +1+3 \) \
          \( +clone -repage +2+4 \) \
          \( +clone -repage +2+5 \) \
          \( +clone -repage +3+6 \) \
          -background none -compose DstOver -mosaic  thickness.gif

[IM Output]
Anda pasti sudah menangkap idenya. Tiap baris '\( +clone ... \)' menambahkan satu piksel pada gambar ke arah selatan menyerong ke tenggara. Selain itu, karena tidak ada piksel semitransparan yang terlibat (setidaknya untuk gambar persegi panjang), format gambar GIF bisa dipakai untuk hasilnya. Masalah utama teknik ini adalah sulitnya menyatakan ketebalan sebagai argumen variabel atau pada sudut yang berbeda, kecuali kalau skrip khusus ditulis untuk menambahkan ketebalan itu. Tepi bagian menyerong dari ketebalan itu juga tidak anti-alias, jadi masih banyak ruang untuk perbaikan.

Thumbnail bergaya polaroid

Gambar thumbnail bisa dibuat tampak seperti foto polaroid, diberi bayangan, bahkan diputar sedikit supaya seolah-olah tergeletak di atas meja. |

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate 6 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  none   -flatten \
          poloroid.png

[IM Output]
Versi yang lebih rumit dari cara di atas ditambahkan ke IM v6.3.1-6 sebagai operator transformasi "-polaroid". Sebagai contoh... |

  magick thumbnail.gif -bordercolor snow -background black +polaroid \
          poloroid_operator.png

[IM Output]
Perhatikan bahwa gambarnya bukan hanya mendapat frame polaroid; fotonya juga diberi sedikit 'gulungan' dengan penyesuaian bayangan yang sesuai, sehingga gambar hasilnya terasa lebih berdimensi. Bentuk plus (+) memakai sudut acak, sedangkan bentuk minus (-) yang biasa membiarkan Anda menentukan sendiri sudut putarnya. Terima kasih khusus kepada Timothy Hunter atas gagasan di balik teknik ini. "-caption" pun bisa ditambahkan, warna bayangan disetel sendiri, dan sudut putarnya ditentukan sendiri (atau tidak diputar sama sekali). |

  magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
          -font Ravie -gravity center -bordercolor Lavender \
          -background navy  -polaroid -0     poloroid_caption.png

[IM Output]
Untuk informasi lebih lanjut tentang pemakaian operator ini lihat transformasi polaroid yang rumit. Namun untuk contoh-contoh ini saya akan tetap memakai cara buatan sendiri, sebab saya butuh kendali yang lebih halus atas border dan efek bayangannya untuk memperagakan 'penumpukan' foto yang benar. Mari kita mulai... Dengan membuat beberapa salinan foto itu (atau memakai gambar lain) dan menambahkan border polaroid, salinan-salinan itu lalu bisa diputar secara acak dan ditumpuk sehingga menghasilkan tumpukan foto yang enak dipandang. |

  magick thumbnail.gif \
     -bordercolor white  -border 6 \
     -bordercolor grey60 -border 1 \
     -bordercolor none  -background  none \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     -delete 0  -border 100x80  -gravity center \
     -crop 200x160+0+0  +repage  -flatten  -trim +repage \
     -background black \( +clone -shadow 60x4+4+4 \) +swap \
     -background none  -flatten \
     poloroid_stack.png

[IM Output]
| Perintah tertanam "magick ... " pada contoh di atas menghasilkan bilangan floating point acak dari -15 sampai +15. Untuk informasi lebih lanjut tentang pemakaian IM sebagai kalkulator matematis lihat ekspresi FX. Alternatifnya, tetapkan bilangan acak itu ke variabel shell lalu substitusikan ke perintah di atas.
Tentu saja Anda bisa memasukkan sekumpulan gambar yang berbeda alih-alih mengulang gambar yang sama saat membuat tumpukan itu. Atau pilih sekumpulan sudut putar supaya semuanya cukup berbeda, atau lebih enak dipandang. Kalau Anda sudah mahir, gambar yang diputar itu bahkan bisa digeser sedikit (posisinya digoyang) supaya tumpukannya tidak semua terpusat dengan sempurna. Tetapi idenya sudah jelas. Kalau pemakaian format PNG benar-benar ingin dihindari, karena masalahnya dengan sebagian peramban saat ini, format gambar GIF bisa dipakai. Untuk itu keterbatasan warna harus diterima, dan warna latar belakang tempat gambar akan ditampilkan harus diketahui persis. Dalam hal halaman-halaman ini, warnanya 'LightSteelBlue'. |

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate -9 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  LightSteelBlue  -flatten    poloroid.gif

[IM Output]
Untuk rincian teknik ini (dan lainnya) lihat gambar GIF di atas latar belakang warna polos. Teknik 'tumpukan polaroid' di atas dengan murah hati disediakan oleh Ally dari Ally's Trip dan Stefan Nagtegaal untuk Muziekvereniging Sempre Crescendo, yang keduanya banyak memakai thumbnail bergaya polaroid di situs web mereka. Di Forum Pengguna IM, pengguna grazzman melangkah sedikit lebih jauh dengan menumpangkan gambar ke atas kanvas yang berputar untuk membuat hamparan foto. |

  magick -size 150x150 xc:none -background none \
          -fill white -stroke grey60 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate +10 \
          -trim +repage -background LightSteelBlue -flatten \
          poloroid_spread.gif

[IM Output]
Tentu saja untuk hamparan foto semacam ini sebaiknya dipakai sekumpulan foto yang berbeda, bukan gambar yang sama berulang-ulang seperti yang saya lakukan di sini. Ada beberapa catatan yang perlu dipertimbangkan pada teknik ini.

  • Framing-nya di atas ditulis secara hardcode dan bergantung pada ukuran gambar thumbnail-nya. Pada aplikasi nyata, framing itu sebaiknya dipindahkan ke tahap pembuatan thumbnail, bukan di hamparan foto seperti di atas.
  • Karena "-rotate" juga memperbesar ukuran kanvas, posisi tempat gambar ditambahkan pun berubah, kecuali kalau gambar itu ditempatkan memakai offset dari posisi "-gravity center".
  • Dan terakhir, memutar frame latar belakang terus-menerus bukan gagasan yang baik dari segi mutu. Memutar gambar yang sudah diputar menambah lebih banyak distorsi tingkat piksel pada hasilnya dibanding satu kali putaran untuk tiap gambar sebelum ditumpangkan.

Penumpukan foto acak yang serupa di atas area yang lebih luas dikembangkan untuk Stas Bekman's Photography, tetapi dengan teknik border yang berbeda. Metode yang lebih umum untuk membuat tata letak foto dan gambar yang teratur atau terprogram ditunjukkan dan diuraikan di Contoh pelapisan gambar, dan juga di Foto yang bertumpang tindih.


Teknik framing

Di sini kita akan melihat beberapa teknik framing lanjutan yang memakai pengetahuan yang sangat mendalam tentang cara kerja IM untuk mencapai hasil yang diinginkan.

Self Framing (eksternal)

Self Framing adalah teknik untuk memberi frame pada gambar dengan memakai gambar itu sendiri sebagai sumber warna dan pola frame-nya. Artinya, frame yang ditambahkan tidak tetap, melainkan berubah-ubah supaya kira-kira cocok dengan gambar yang di-frame. Ini bisa dilakukan dengan dua cara. Perluas gambar aslinya sehingga tercipta frame eksternal , atau pakai bagian dari gambar itu sendiri untuk membuat frame internal. Contohnya, kalau gambarnya kita perbesar lalu diredupkan sebelum gambar asli ditumpangkan di atasnya, kita mendapat frame yang tampak sangat bagus. |

  magick thumbnail.gif \
          \( -clone 0 -resize 130% +level 20%x100% \) \
          \( -clone 0 -bordercolor black -border 1x1 \) \
          -delete 0 -gravity center -composite  self_bordered.gif

[IM Output]
| Alih-alih memakai penyesuaian level untuk mencerahkan (atau menggelapkan) gambar frame-nya, cara lain membuat border menjadi lebih terang atau lebih gelap adalah dengan memberi rona warna pada frame itu, misalnya seperti ini...
"-fill white -colorize 30%"

Cara lain memberi rona warna pada gambar untuk menghasilkan frame adalah menyuruh IM menumpangkan Frame yang semitransparan di atas gambar yang telah diperbesar. Namun cara ini menuntut ukuran thumbnail-nya diketahui, supaya gambarnya di-resize persis sebanyak yang diperlukan untuk menampung frame yang dihasilkan. |

  magick thumbnail.gif \
          \( -clone 0 -resize 140x110\! \) \
          \( -clone 0 -bordercolor black -border 1x1 \
                      -mattecolor '#8884' -frame 9x9+0+9 \) \
          -delete 0 -composite  self_framed.gif

[IM Output]
Variasi dari cara di atas memakai kendali viewport khusus dan pengaturan bawaan piksel virtual, Edge untuk memperluas tepi gambar yang telah di-blur sehingga terbentuk frame eksternalnya. |

  magick thumbnail.gif \( +clone \
             -set option:distort:viewport 150x120-15-15 \
             -virtual-pixel Edge    -distort SRT 0  +repage \
             -blur 0x3 +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_edge.gif

[IM Output]
Sekadar peringatan. Cacat tepi yang kecil (misalnya sebatang pohon atau sehelai daun) bisa memberi hasil yang tidak diinginkan pada frame yang dibuat hanya dari tepi gambar. Viewport-nya memang perlu tahu ukuran gambar aslinya untuk memperbesar dan menggeser viewport itu sebanyak yang diperlukan. Namun ekspresi escape FX bisa dipakai untuk menghitung ukuran viewport-nya (lihat contoh di bawah). Alternatifnya, pakai piksel virtual, Dither yang di-blur pada contoh di atas. Ini menyebarkan warnanya lebih jauh dan hasilnya tidak terlalu 'bertepi tajam'. Tetapi kalau blur ditambahkan sebelum dan sesudah perluasan, dither itu bisa dipakai untuk menghasilkan efek mirip kain. |

  magick thumbnail.gif \( +clone  -blur 0x3 \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Dither  -distort SRT 0  +repage \
             -blur 0x0.8  +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_dither.gif

[IM Output]
Blur yang pertama memodulasi warna rata-ratanya, sedangkan yang kedua mengatur seberapa 'berpiksel' atau halus pola dither-nya. Berikut contoh lain, kali ini memakai piksel virtual, Mirror, dengan tepi lembut (yang dihitamkan), yang ternyata bekerja sangat baik untuk gambar yang satu ini. |

  magick thumbnail.gif  \( +clone \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Mirror -distort SRT 0 +repage \
             -alpha set -virtual-pixel transparent \
                 -channel A -blur 0x8 +channel \
             -background Black -flatten \) \
          +swap -gravity center -compose over -composite \
          self_mirror.gif

[IM Output]
Pada semua kasus di atas, frame-nya dihasilkan dari gambar yang sama, yang lalu digabungkan sehingga terbentuk frame berdasarkan warna yang berasal dari gambar aslinya. Karena itu border frame-nya unik dan cocok dengan tiap gambar thumbnail yang di-frame. Fred Weinhaus membuat skrip "imageborder" agar pembuatan gambar self framing lebih mudah, dengan border yang dihasilkan dari pembesaran gambar asli yang di-blur, atau dari suatu bentuk pengaturan piksel virtual yang menentukan isinya.

Self Framing (internal)

Alih-alih memperbesar gambar untuk menambahkan border baru, sebagian gambar itu sendiri bisa kita ubah menjadi border dengan magick. Kita sudah melihat beberapa teknik penambahan frame di dalam gambar itu sendiri. Teknik Tombol timbul dan Tombol gelembung melakukan hal itu dengan operator "-raise". Di sini kita membuat versi gambar asli yang lebih terang dan di-blur, lalu menimpakannya memakai mask yang juga dihasilkan dari gambar asli. Sesudah itu ditambahkan tepi putih untuk memisahkan versi terang yang di-blur tadi dari bagian tengah gambar yang tidak diubah. |

  magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 10x10 \) \
          -composite \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 1x1 \
             -bordercolor black -border 9x9 \) \
          -compose screen -composite \
          self_blurred_border.gif

[IM Output]
Operator frame juga bisa dipakai untuk mendapatkan sesuatu yang sedikit berbeda dari efek tombol yang sudah kita lihat. Kuncinya adalah menerapkan Shave pada gambar asli lebih dulu. Misalnya, di sini saya membuat salinan gambar asli, men-shave lalu memberinya frame transparan, sebelum menimpakannya di atas gambar asli. |

  magick thumbnail.gif \( +clone -shave 10x10 \
            -alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
          \) -composite  inside_frame_trans.gif

[IM Output]
Masalahnya, cara ini selalu 'mencerahkan' atau 'menggelapkan' (mengurangi kontras) bagian datar frame di sekeliling gambar asli. Untuk menghindarinya kita bisa memakai teknik yang sama seperti Tombol gelembung. Kita membuat frame di atas kanvas abu-abu sempurna, lalu memodifikasinya untuk menghasilkan mask komposisi efek pencahayaan yang menyesuaikan warna gambar asli. Misalnya, di sini saya memakai komposisi 'VividLight' dengan gambar mask berframe itu agar warna primer lebih terjaga. |

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 \
          \) -compose VividLight -composite  inside_frame_light.gif

[IM Output]
Seperti pada Tombol gelembung, mask pencahayaan juga bisa di-blur sebelum diterapkan. Di sini saya memakai compose 'HardLight' yang lebih biasa dan tidak menguatkan warna primer, dengan mask pencahayaan frame yang sudah di-blur. |

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
          \) -compose HardLight -composite  inside_frame_blur.gif

[IM Output]
| Sebagian metode komposisi cahaya bisa jadi mengharuskan Anda menukar urutan gambar sebelum mengomposisikannya agar efek pencahayaannya benar.
Untuk membawa efek semacam ini lebih jauh lagi dan menghasilkan sesuatu yang jauh lebih rumit, lihat Teknik mask pencahayaan tingkat lanjut.

Overlay border sederhana

Salah satu bentuk framing yang sederhana adalah membuat frame dekoratif, atau gambar berbentuk khusus, yang di bawahnya gambar Anda bisa diletakkan. Misalnya, di sini kita membuat frame sederhana yang sedikit lebih besar daripada gambar kita, dengan lubang berbentuk dekoratif. Bentuknya diambil dari font 'WebDings' (karakter 'Y'), tetapi ada banyak sumber lain untuk bentuk dekoratif yang bisa dipakai memasang frame pada gambar. |

  magick -size 120x140 -gravity center -font WebDings label:Y \
          -negate -channel A -combine +channel -fill LightCoral -colorize 100% \
          -background none -fill none -stroke firebrick -strokewidth 3 label:Y \
          -flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png

[IM Output]
Untuk cara lain menghasilkan tepi pada gambar berbentuk khusus yang sudah ada, lihat deteksi tepi. Frame itu juga bisa diberi sedikit kedalaman dengan efek bayangan. |

  magick border_heart.png  \( +clone -background black -shadow 60x3+3+3 \) \
          -background none -compose DstOver -flatten   border_overlay.png

[IM Output]
Setelah punya frame overlay sederhana, kita bisa menaruh gambar di tengah, di bawah frame itu, dengan komposisi 'DstOver'. |

  magick border_overlay.png  thumbnail.gif \
          -gravity center -compose DstOver -composite   border_overlaid.jpg

[IM Output]
Dengan begitu Anda bisa menyiapkan pustaka frame siap pakai untuk gambar Anda, seperti gambar dedaunan musim gugur ini.

    magick thumbnail.gif  autumn_leaves.png +swap \
            -gravity center -compose DstOver -composite \
            border_leaves.gif

[IM Text] [IM Text] [IM Text]

Perhatikan bahwa saya menukar urutan gambar dan memakai 'DstOver' untuk menempatkan gambar kedua, yaitu gambar utamanya, 'di bawah' frame. Dengan begitu frame-lah yang menentukan ukuran akhir gambar, bukan gambar aslinya. Namun cara ini juga akan menghilangkan metadata apa pun yang dimiliki gambar utama (karena alasan yang sama). Kalau metadata thumbnail memang ingin dipertahankan (misalnya label dan komentar seperti pesan hak cipta), ide terbaiknya adalah menambah padding pada thumbnail sampai seukuran frame, lalu memakai komposisi 'Over' bawaan untuk menimpakan frame. Dengan begitu thumbnail menjadi gambar 'tujuan' dan metadata gambarnya tetap terjaga.

Contoh overlay badge

Berikut contoh overlay siap pakai yang lebih rumit, kali ini memakai gambar yang ukurannya sudah dibuat pas (extent dipakai sebagai metode crop), dari diskusi forum IM Composite Overlay and Masking.

    magick thumbnail.gif  -gravity center -extent 90x90 \
            badge_overlay.png -composite     badge.png

[IM Text] [IM Text] [IM Text]

Perhatikan bahwa gambarnya sendiri tidak didistorsi, hanya sedikit dicerahkan dan digelapkan, sebuah lingkaran dipotong keluar, dan bayangan ditambahkan, semuanya di dalam satu gambar overlay. Kalau ini badge sungguhan, atau 'gelembung kaca', gambarnya semestinya juga sedikit didistorsi (mungkin dengan distorsi barrel), tetapi tanpa distorsi seperti itu pun hasilnya sudah bagus. Untuk langkah berikutnya dalam contoh 'badge', lihat Badge dengan mask 'n' paint, yang menambahkan transparansi latar belakang di sekeliling badge.

Teknik mask 'n' paint

Dalam banyak kasus kita tidak hanya ingin menimpakan border persegi di sekeliling gambar, tetapi juga ingin memotong tepi gambar menjadi transparan. Untuk itu biasanya diperlukan setidaknya dua gambar. Yang pertama adalah overlay ber-mask yang memuat warna, bayangan, dan highlight yang ingin ditambahkan ke gambar yang sudah ada. Yang kedua memuat bagian-bagian yang ingin dibuang dari gambar asli. Kedua gambar itu bisa diterapkan dengan dua cara berbeda. Anda bisa 'me-mask' lebih dulu untuk membuang bagian yang tidak diinginkan, lalu menimpakan frame-nya, atau menimpakan frame lebih dulu, lalu mengubah bagian yang tidak diinginkan, baik dari gambar asli maupun dari warna yang ditimpakan, menjadi transparan. Pilihan metodenya sangat menentukan, dan gambar yang terlibat memang dirancang untuk satu teknik tertentu. Gambar untuk metode yang satu tidak bisa dipakai dengan urutan yang keliru, karena hasilnya tidak akan benar. Sebagai contoh, mari kita buat border dengan bentuk yang lebih rumit, tetapi kali ini kita tidak usah memusingkan pengaturan latar belakangnya. |

  magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          -strokewidth 3  -draw 'ellipse 60,50 57,47 0,360' \
          -channel RGBA  -blur 2x1    border_ellipse.png

[IM Output]
Border ini sengaja saya buat blur agar komponen tepinya jauh lebih semitransparan. Bahkan tanpa kekaburan tambahan itu, sebuah border tetap memuat banyak piksel anti-aliasing yang semitransparan, yang membuat tepinya tampak lebih halus dan tidak bergerigi. Dalam pemrosesan gambar, piksel semitransparan seperti ini penting sekali diperhitungkan agar tetap terjaga dan diatur dengan benar. Supaya lebih menarik, beri border 'kabur' ini sedikit pewarnaan acak. |

  magick border_ellipse.png \
          \( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
          -compose SrcIn -composite     border_ellipse_red.png

[IM Output]
Oke, border-nya sudah ada, tetapi kita masih perlu cara untuk menentukan mana yang mewakili bagian luar dan bagian dalam border. Pada dasarnya kita butuh sebuah mask untuk mendefinisikan kedua area itu. |

  magick -size 120x100  xc:none -fill black \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          border_ellipse_mask.png

[IM Output]
Warna gambar 'mask' ini tidak penting, yang penting bentuknya, sebab yang ditentukannya adalah bagian mana yang digolongkan sebagai dalam dan mana yang luar. Mask-nya bisa berupa mask grayscale, bisa pula mask bentuk seperti yang ditunjukkan di atas. Yang kedua biasanya lebih berguna, dan bentuknya bahkan boleh berupa bagian yang akan dihapus, atau bagian yang akan dipertahankan (seperti di atas). Dalam kasus ini gambar-gambarnya dirancang untuk teknik "mask 'n' paint ", artinya bagian yang tidak diinginkan dihapus lebih dulu, baru warna border tambahannya ditimpakan (yang juga melibatkan mask transparansi). Misalnya...

  magick thumbnail.gif -alpha set  -gravity center -extent 120x100 \
          border_ellipse_mask.png  -compose DstIn -composite \
          border_ellipse_red.png   -compose Over  -composite \
          border_mask_paint.png

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

Selalu dibutuhkan dua operasi komposisi alpha Duff-Porter. Satu untuk membuat sebagian bagian menjadi transparan, satu lagi untuk menimpakan warna tambahan yang menegaskan garis border atau frame. Dua gambar diperlukan, dan karena itu keduanya harus disimpan terpisah. Beberapa format seperti MIFF dan GIF memang memungkinkan kedua gambar disimpan dalam satu file agar lebih ringkas. Tentu saja kedua gambar itu bisa digabung menjadi satu gambar framing overlay sederhana, tetapi hanya kalau bagian luar hasilnya memang ingin diberi satu warna tetap yang tidak transparan. Misalnya, tetapkan bagian luar sebagai warna DodgerBlue... |

  magick border_ellipse_mask.png -alpha extract -negate \
          -background DodgerBlue -alpha shape \
          border_ellipse_red.png   -compose Over -composite \
          border_ellipse_overlay.png

[IM Output]
Tetapi kalau begitu, cukup taruh warna polos atau gambar latar belakang lain di bawah gambar hasil double mask yang tadi dibuat... |

  magick border_double_masked.png \
          \( -size 120x100 plasma:Green-Green -blur 0x1 \) \
          +swap  -compose Over  -composite     border_background.png

[IM Output]
Intinya, dengan dua gambar, yaitu gambar 'mask' dan 'overlay', Anda jauh lebih leluasa dalam menambahkan border ke gambar. Bahkan beberapa gambar 'mask' sekaligus bisa didefinisikan untuk menentukan 'jendela' yang berbeda-beda pada gambar border yang ditimpakan. Highlight dan bayangan pun bisa ditambahkan secara opsional, alih-alih dipatri langsung ke dalam satu gambar framing overlay. Sekarang satu peringatan penting. Tepi gambar mask tidak boleh berimpit dengan tepi gambar overlay. Kalau keduanya bertemu, warna di sepanjang tepi yang berimpit itu tidak akan ditangani dengan benar, atau muncul efek 'halo' yang aneh. Karena itu pastikan tepi mask jatuh di suatu tempat di dalam wilayah gambar overlay yang sepenuhnya opaque. Kedua operasi masking ini perlu dikerjakan dengan hati-hati dan direncanakan lebih dulu.

Border dengan sudut membulat

Seperti terlihat di atas, Teknik mask 'n' paint bisa dipakai baik untuk menambahkan warna atau 'pernak-pernik' pada gambar maupun untuk membuang bagian tertentu sehingga bentuk gambar akhirnya berubah. Ini memberi kita cara lain untuk menambahkan sudut membulat pada gambar. Operator "-draw" milik IM punya metode 'roundrectangle' yang bisa dipakai untuk membuat frame yang menarik di sekeliling gambar. Namun ukuran yang dipakai metode draw ini harus disesuaikan dengan gambarnya. IM memang menyediakan cara untuk mengambil ukuran gambar dan bahkan menghitungnya secara matematis. Koordinat tempat persegi panjang itu diletakkan mengacu tepat ke 'titik tengah' lebar stroke yang mendefinisikan persegi panjang tersebut (nilainya boleh pecahan). Koordinat itu juga dinyatakan sebagai 'koordinat piksel' (lihat koordinat piksel vs koordinat gambar), artinya nilai 1,1 menunjuk ke piksel kedua dari tepi atas dan kiri, tetapi yang lebih penting, nilai itu menunjuk ke 'pusat' piksel tersebut, yang sebenarnya berjarak 1,5 satuan dari tepi atas dan kiri yang sesungguhnya. Sekarang kita akan memakai lebar stroke (SW) 3, yang membuat gambar bertambah 3 piksel di semua sisi. Berarti persegi panjangnya akan diposisikan SW/2 - 0.5 atau 1,0 piksel dari kiri atas, dan ImageSize + SW*1.5 - 0.5 atau ukuran gambar + 4 piksel di kanan bawah. Di sini kita memakai IM sendiri untuk melakukan perhitungan itu, menghasilkan perintah draw yang persis dibutuhkan lewat escape FX yang canggih. Hasilnya disimpan sebagai file Magick Vector Graphics yang bisa langsung dipakai oleh draw pada perintah-perintah berikutnya.

  magick thumbnail.gif \
          -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
          info: > rounded_corner.mvg

[IM Text]

| Kalau ukuran gambar bisa Anda peroleh dengan cara lain (lewat shell, atau wrapper bahasa API lain), parameter draw yang sesuai boleh langsung disubstitusikan ke contoh-contoh berikutnya, tanpa memakai ekspresi matematis FX. Pada dasarnya cara di atas membuat seluruh proses ini tidak bergantung pada ukuran thumbnail yang sebenarnya. Cara lain, termasuk menuliskan nilainya langsung di dalam kode, juga dapat diterima.
Sekarang ini bisa kita pakai untuk menghasilkan gambar overlay dan gambar mask. Sebagai bagian dari proses itu kita membuat kanvas transparan dari gambar asli (yang lebih dulu diperbesar sebesar lebar stroke) supaya ukurannya pas.

  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill white -stroke none -strokewidth 0 \
          -draw "@rounded_corner.mvg"    rounded_corner_mask.png
  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill none -stroke black -strokewidth 3 \
          -draw "@rounded_corner.mvg"    rounded_corner_overlay.png

[IM Text] [IM Text]

Dan begitulah kita mendapatkan gambar border overlay dan gambar mask transparansi yang dibutuhkan untuk teknik double masking. Perhatikan bahwa mask-nya dibuat untuk gambar yang lebih besar sebesar lebar stroke dibanding gambar asli, dan bahwa mask bentuk penghapus (yang putih) tidak menutupi seluruh area yang diperbesar itu, sebab ada celah 1 piksel di sekelilingnya. Jadi mari kita terapkan dengan teknik double masking... |

  magick thumbnail.gif -alpha set -bordercolor none -border 3  \
          rounded_corner_mask.png -compose DstIn -composite \
          rounded_corner_overlay.png -compose Over -composite \
          rounded_border.png

[IM Output]
Dan jadilah gambar kita dengan border bersudut membulat. Berikut cara mengerjakan semua langkah di atas dalam satu perintah, dengan sedikit tambahan hiasan. Namun perintah serba-satu ini tetap menghasilkan file sementara yang menyimpan perintah draw untuk gambar dengan ukuran tertentu itu. |

  magick thumbnail.gif \
      -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
      -write info:tmp.mvg \
      -alpha set -bordercolor none -border 3 \
      \( +clone -alpha transparent -background none \
         -fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
      -compose DstIn -composite \
      \( +clone -alpha transparent -background none \
         -fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
         -fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
      -compose Over -composite               rounded_border_in_one.png
  rm -f tmp.mvg      # Cleanup of temporary file

[IM Output]
Cara yang lebih baik untuk membuat sudut membulat, terutama pada gambar yang sangat besar, adalah teknik gambar mask sudut yang terpisah, yang akan kita lihat di bawah pada Overlay sudut dekoratif. Dalam banyak hal ini adalah perluasan dari metode di atas, hanya saja masking-nya terpisah untuk tiap sudut gambar sehingga gambar kerjanya tetap kecil.

Badge dengan mask 'n' paint

Berikut contoh "mask 'n' paint" yang jauh lebih rumit, yang dikembangkan dari gambar yang dipakai pada Contoh overlay badge di atas. Pembuatan kedua gambarnya 'diakal-akali', dan pernah dibahas di forum IM Composite Overlay and Masking. Idealnya kedua gambar itu dikembangkan bersama-sama.

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_trans_bg.png

[IM Text] [IM Text] [IM Text] [IM Text]

Perhatikan bahwa di atas saya mengatakan sebaiknya tepi transparansi dan tepi mask jangan diusahakan berimpit. Pada contoh di atas justru itulah yang saya lakukan, sehingga tepi gambar hasilnya tidak sepenuhnya benar. Namun karena pewarnaannya hanya berupa shading yang halus dan bukan tepi yang tegas, pada contoh ini hasilnya tampak baik-baik saja. Meski begitu, tetap berhati-hatilah. Untuk langkah berikutnya dalam contoh 'badge', lihat Badge dengan paint 'n' mask, yang membalik urutan kedua operasi komposisi sehingga memerlukan kumpulan gambar yang berbeda.

Teknik paint 'n' mask

Alih-alih 'Mask lalu Paint ', Anda bisa memakai kumpulan gambar yang berbeda dan menimpakan warna tambahannya lebih dulu, baru kemudian mem-mask latar belakangnya. Artinya, yang dijalankan adalah 'Paint lalu Mask '. Jadi gambar Anda diambil, lalu border ditimpakan di atasnya, dan border itu tidak hanya menentukan seluruh warna border akhir, tetapi juga mem-mask serta mewarnai sebagian atau seluruh bagian di luar gambar asli. Sesudah itu dipakai mask 'luar' atau 'clipping' yang terpisah untuk membuang semua bagian yang tidak diinginkan dari gambar hasil. Perhatikan juga bahwa gambar 'overlay' dan gambar 'masking' sama-sama mendefinisikan tepi dalam secara terpisah dari tepi luar border. Akibatnya satu gambar saja tidak mendefinisikan keseluruhan border, dan itu membuatnya sedikit lebih merepotkan untuk dipakai. Meski begitu, penerapannya bisa lebih sederhana. Misalnya...

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
          -draw 'ellipse 45,45 55,37 0,360' \
          -channel RGBA -negate -blur 0x3  +channel \
          \( granite: -auto-level -blur 0,0.7 \) \
          -compose ATop -composite border_paint.png

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
          -draw 'ellipse 59,45 56,40 0,360' border_mask.png

  magick thumbnail.gif -alpha set \
          border_paint.png -compose Over  -composite \
          border_mask.png  -compose DstIn -composite \
          border_paint_mask.png

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

Perhatikan bagaimana sebagian warna yang ditimpakan justru dibuang. Inilah ciri utama teknik paint 'n' mask: overlay-nya bisa lebih sederhana karena kemudian disesuaikan oleh mask. Metode masking gambar inilah yang dipakai pada rangkaian contoh Sudut page curl berikut, dan nanti pada Overlay sudut dekoratif di bawah.

Sudut page curl

Fred Weinhaus membuat skrip shell khusus bernama PageCurl yang menambahkan efek halaman melengkung sederhana pada gambar yang sudah ada, memakai matematika yang sangat rumit (di dalam shell). Misalnya... |

  pagecurl thumbnail.gif  pagecurl.png

[IM Output]
Di dalamnya skrip itu sebenarnya memakai Teknik paint 'n' mask. Artinya, mula-mula 'curl overlay' yang sedikit kebesaran ditimpakan, lalu sisa gambarnya dihapus (di-mask), termasuk sedikit bagian overlay yang nantinya menjadi sudut transparan. Namun kalau page curl ingin diterapkan ke banyak gambar, memakai skrip lengkap (di atas) tergolong lambat. Bagaimanapun juga skrip itu melakukan pemrosesan matematis dalam jumlah besar (dengan IM sendiri sebagai kalkulator bilangan pecahan) untuk benar-benar menghitung dan menghasilkan gambar overlay serta gambar masking yang sesuai. Untuk menerapkan pagecurl ke banyak gambar, lebih baik skrip itu dijalankan sekali saja demi menghasilkan gambar overlay dan mask transparansinya. Jadi mari kita keluarkan kedua gambar itu untuk gambar berukuran 64x64 piksel yang lebih kecil (memakai opsi khusus '-i "pagecurl" yang ditambahkan ke skrip untuk keperluan ini). |

  magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:

[IM Output] [IM Output]
Perintah di atas membuat dua file gambar: "pagecurl_overlay.png" dan "pagecurl_mask.png" yang ditampilkan di atas. Gambar masukannya sendiri tidak penting, sebab yang kita inginkan adalah gambar masking-nya. Hasil 'halaman melengkung'-nya langsung dibuang dengan format file gambar khusus "null:". |

  magick thumbnail.gif -alpha set -gravity SouthEast \
          -define compose:outside-overlay=false \
          pagecurl_overlay.png -composite \
          pagecurl_mask.png  -compose DstIn -composite \
          pagecurl_thumbnail.png

[IM Output]
Tentu saja ukuran gambar-gambar ini tidak sama dengan thumbnail kita, dan mungkin juga tidak sama dengan gambar mana pun yang hendak Anda beri efek ini, tetapi itu tidak masalah karena ada beberapa opsi tambahan yang memastikan semuanya bekerja seperti yang diharapkan. Khususnya, pengaturan (setting) "-gravity" memastikan kedua gambar overlay diposisikan di sudut kanan bawah. Lalu pengaturan define khusus 'compose:outside-overlay=false' mencegah gambar mask menghapus bagian gambar yang tidak tertutup oleh gambar yang lebih kecil itu. Lihat pengaturan outside-overlay untuk penjelasan lengkapnya. Kalau ini ingin diterapkan ke banyak gambar, "magick mogrify" bisa dipakai dengan teknik khusus yang memanfaatkan "-draw" untuk melakukan komposisi alpha dengan mogrify. Namun metode komposisi ini tidak mengenal pengaturan define khusus tadi, jadi hanya bekerja bila gambar, overlay, dan mask semuanya berukuran sama.

  pagecurl -e 0.5 -i /tmp/pagecurl  {_one image_} null:
  magick mogrify {_magick mogrify -format and -path options_} -alpha set \
          -draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
          -draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
          {_all images to be pagecurled_}...

Overlay sudut dekoratif

Di sini kita menengok lebih dalam pemakaian teknik 'double masking' untuk mengubah gambar dengan cara yang berbeda di area yang berbeda, alih-alih menerapkan satu mask atau frame besar ke seluruh gambar. Dalam hal ini kita hanya akan melakukan double mask pada sudut-sudutnya. Sisa border-nya (agar serasi) ditambahkan terpisah. [IM Output] Gambar sudut yang akan saya pakai dihasilkan dari sumber aslinya (ditampilkan di kanan) yang saya temukan di DIY Frames Section pada Anthony's Icon Library. Masih ada yang lain di bagian itu, jadi silakan lihat-lihat. Kalau Anda menemukan sesuatu di internet, kabari saya, sebab saya senang mengumpulkan sudut dan teknik pembuatan tepi yang menarik. [IM Output] [IM Output] Sebuah gambar overlay warna dan gambar masking dibuat dari gambar awal itu, supaya kita bisa memakai Teknik paint 'n' mask untuk menimpakan sudutnya ke gambar. Perhatikan bahwa gambar-gambar ini sebenarnya tidak memakai piksel semitransparan sama sekali, bahkan tidak memakai gradasi warna. Karena itu border dekoratif ini bisa dipakai untuk menghasilkan thumbnail 'GIF' yang bersih untuk halaman web. Kerumitan memakai mask sudut adalah mask itu hanya mengenai sudut-sudut gambar asli. Karena itu gambar asli harus lebih dulu diberi warna border tambahan yang sesuai. Sesudah itu kedua mask sudut harus dikomposisikan ke setiap sudut gambar yang sudah diperbesar. |

  magick thumbnail.gif   -alpha set  -compose Copy \
          -bordercolor Black  -border 2 \
          -bordercolor Sienna -border 3 \
          -bordercolor Black  -border 1 \
          -bordercolor None   -border 2 \
          -bordercolor Black  -border 2 \
          -bordercolor Peru   -border 3 \
          -bordercolor Black  -border 1 \
          \
          -compose Over \
          \( fancy_add.gif             \) -gravity NorthWest -composite \
          \( fancy_add.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_add.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
          -compose DstOut \
          \( fancy_sub.gif             \) -gravity NorthWest -composite \
          \( fancy_sub.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_sub.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
          fancy_border.gif

[IM Output]
| Perhatikan bahwa untuk mempertahankan border transparan yang sedang ditambahkan, pengaturan "-compose" harus disetel ke 'Copy', bukan ke nilai bawaannya 'Over'. Kalau tidak, transparansinya akan terisi oleh warna border berikutnya yang ditambahkan, dalam hal ini 'Black'. Lihat operator border untuk detailnya.
Kelebihan memakai mask sudut saja adalah gambar berukuran berapa pun bisa diberi frame dengan teknik ini, asalkan cukup besar untuk menampung mask sudut yang ditambahkan. Artinya, Anda tidak dibatasi oleh ukuran gambar framing yang tersedia. Tentu saja keempat gambar sudut dan border-nya sama persis di seluruh keliling gambar, hanya diputar. Artinya, efek bayangan atau ketebalannya semua mengarah 'ke dalam'. Untuk memperbaikinya, potongan sudut yang berbeda harus dibuat untuk setiap sudut, dan penambahan tepi ekstra di sekeliling gambar asli pun harus asimetris. Pada dasarnya semuanya menjadi jauh lebih rumit demi menghasilkan efek bayangan yang sungguhan. Solusi yang lebih baik mungkin adalah membuang efek bayangan dari potongan sudut, menerapkannya seperti tadi, lalu menambahkan efek bayangan secara menyeluruh. Berhati-hatilah.

Badge dengan paint 'n' mask

Pemrosesan gambar badge yang sama seperti yang sudah dilihat pada Contoh overlay badge dan Badge dengan mask 'n' paint juga bisa dikerjakan dengan mem-paint dulu, baru me-mask. Di sini kita mula-mula memulaskan semua warna dan shading-nya, lalu me-mask transparansi akhir gambarnya.

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_paint.png -composite badge_shape.png -compose DstIn -composite \
          badge_paint_mask.png

[IM Text] [IM Text] [IM Text] [IM Text]

Kalau cara ini terasa janggal untuk gambar yang satu ini, Anda benar, memang janggal. Sebabnya, kita tidak hanya perlu memberi shading dan highlight pada gambar asli, tetapi juga perlu mengisi setiap area yang nantinya memuat efek bayangan dengan warna hitam. Tepatnya, setiap bagian yang akan menjadi sepenuhnya transparan (dan hanya piksel yang benar-benar sepenuhnya transparan) harus dipulas hitam. Sebaliknya, piksel semitransparan yang punya efek bayangan akan memiliki efek shading sebagian sekaligus mask transparansi sebagian. Dengan kata lain, bayangan membuat teknik paint dan mask yang semestinya sederhana menjadi janggal dalam pembagian antara efek painting dan efek masking. Inilah sebabnya teknik paint dan mask biasanya tidak dipakai ketika berurusan dengan tambahan semitransparan pada gambar, misalnya saat menambahkan bayangan atau bintang flare. Kalau gambarnya tidak memuat efek transparansi sama sekali, proses paint-nya tidak terlihat semengerikan itu, dan dalam banyak kasus bisa lebih sederhana daripada teknik lain, karena overlay yang sudah dipulas bisa 'dipotong' dengan mask pada akhirnya. Contoh Sudut page curl adalah kasus semacam itu, sebab mask dipakai untuk memangkas overlay page curl agar menjadi satu kesatuan yang mulus. Perhatikan pula celah antara wilayah hitam pekat dan efek shading pada gambar paint. Celah itu mencerminkan peringatan yang sudah saya sebut sebelumnya, yaitu pastikan hasil masking internal mana pun tidak bertumpang tindih dengan tepi mask eksternal paint/overlay. Baru dalam kasus khusus inilah kebutuhan akan celah itu terlihat begitu jelas. Untuk langkah berikutnya dalam contoh 'badge', lihat Badge dengan efek pencahayaan, yang menyatukan kedua gambar masking menjadi satu gambar mask/shading.

Teknik mask pencahayaan

Tombol gelembung kaca

Tingkat kerumitan berikutnya dalam pemrosesan thumbnail adalah penerapan efek pencahayaan yang sangat kompleks. Yang sulit di sini bukan penerapan efek pencahayaannya pada gambar, melainkan pembuatan efek shading yang tepat. Misalnya dengan efek Aqua, sebuah thumbnail bisa diberi efek shading yang sangat rumit sehingga tampak seperti terbungkus 'gelembung' kaca. Cara ini juga lebih berhasil pada thumbnail yang punya sudut membulat. Karena itu mari kita buat mask sudut membulat untuk gambar thumbnail kita, memakai warna abu-abu murni. |

  magick thumbnail.gif -alpha off -fill white -colorize 100% \
     -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
     \( +clone -flip \) -compose Multiply -composite \
     \( +clone -flop \) -compose Multiply -composite \
     -background Gray50 -alpha Shape    thumbnail_mask.png

[IM Output]
Setelah 'mask bentuk' abu-abu murni yang kita inginkan tersedia, saya bisa menerapkan efek Aqua untuk menghasilkan overlay pencahayaan bagi bentuk ini. |

  magick thumbnail_mask.png -bordercolor None -border 1x1 \
          -alpha Extract -blur 0x10  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          +channel +compose -chop 1x1 \
          thumbnail_lighting.png

[IM Output]
Dengan gambar overlay cahaya/bayangan akhir seperti di atas, kita bisa dengan mudah menerapkannya ke thumbnail mana pun yang ukurannya pas. |

  magick thumbnail.gif -alpha Set thumbnail_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          glass_bubble.png

[IM Output]
Ini tidak hanya menambahkan efek shading yang sesuai pada thumbnail mana pun seukuran itu, tetapi gambar pencahayaan yang sama juga mem-mask thumbnail-nya menjadi bentuk yang benar. Penting dicatat bahwa hanya kanal warna yang dipakai untuk menerapkan efek pencahayaan; kanal alpha tidak dipakai dalam proses ini. Begitu pula saat masking, hanya kanal alpha yang dipakai, bukan kanal warna. Tanpa pemisahan kanal untuk efek yang berbeda ini, hasilnya tidak akan benar. Untuk pembahasan tentang mengekstraksi efek pencahayaan dari gambar, lihat topik forum pengguna IM Extracting light layer from two images.
Namun ini bisa dibawa lebih jauh lagi, sebab efek bayangan pun bisa ditambahkan langsung ke mask pencahayaan ini. Warna yang ditambahkan harus hitam murni, dan Anda perlu memastikan komposisi efek pencahayaan yang dipilih akan menghasilkan gambar hitam sempurna bila mask pencahayaannya hitam. Toh begitulah efek bayangan biasanya ditambahkan ke sebuah gambar, jadi bayangan bisa langsung ditambahkan ke "mask efek pencahayaan" itu dan semuanya beres! Hal yang sama berlaku untuk menambahkan 'flare' cahaya, hanya saja overlay flare-nya memakai piksel putih. Pada dasarnya sebuah "gambar efek pencahayaan" sekali lagi bisa menyatukan kembali kedua gambar dari Teknik mask 'n' paint menjadi satu gambar saja. Seperti yang akan Anda lihat pada contoh berikutnya.

Badge dengan efek pencahayaan

Dengan memakai gambar dari teknik Badge dengan mask 'n' paint, saya menerapkannya pada gambar kanvas abu-abu murni untuk dengan cepat menghasilkan gambar "efek pencahayaan ber-mask". Sebenarnya gaya masking yang satu lagi (Badge dengan paint 'n' mask) juga sama mudahnya untuk dipakai. Sesudah itu saya menerapkan satu gambar masking tersebut ke thumbnail dan hasilnya sesuai keinginan.

  # merge "mask 'n' paint" images with a gray image,
  # to create a "lighting mask"
  magick -size 90x90 xc:gray50 -alpha set \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_lighting.png

  # Apply the single "lighting mask"
  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          badge_final.png

[IM Text] [IM Text] [IM Text]

Sebenarnya saya cukup menyukai bentuk masking ini, sebab gambar mask-nya sendiri terlihat nyaris sama dengan gambar yang Anda tuju, hanya warnanya yang hilang. Toh begitulah mask pencahayaan dibuat: terapkan saja efeknya pada gambar abu-abu sempurna, dan Anda mendapatkan gambar "mask pencahayaan". Ingat saja bahwa pada teknik yang satu ini bayangan semitransparannya harus hitam murni agar bekerja dengan benar. Warna abu-abu tidak boleh dipakai untuk piksel mana pun yang tidak memuat setidaknya sebagian gambar asli. Semua area transparan dan semitransparan harus berwarna putih murni atau hitam murni, dengan tingkat transparansi alpha yang sesuai. Mengapa satu gambar saja sudah cukup? Sebelumnya kita butuh dua gambar! Jawabannya, gambar masking di sini dibatasi hanya boleh menambahkan gradasi warna hitam murni atau putih murni. Dengan begitu efek shading (pencahayaan) beserta mask-nya pada dasarnya menyatu ke dalam komponen warna "mask efek pencahayaan ". Akibatnya kanal alpha jadi bebas untuk menampung mask transparansi gambar akhir yang tadinya terpisah. Batasannya, Anda hanya bisa menambahkan gradasi putih dan hitam ke gambar. Warna abu-abu, misalnya, tidak bisa ditambahkan ke gambar yang di-mask. Perlu dicatat, menambahkan sedikit rona warna primer dan sekunder dari suatu ruang warna memang mungkin, tetapi hanya secara terbatas, dan saya belum pernah melihatnya dipakai. Ringkasnya, Anda tidak bisa menambahkan warna tertentu atau border dekoratif ke gambar, hanya gradasi dan bayangan, highlight dan flare, atau teks hitam atau putih sederhana. Namun sebaiknya jangan mencoba mencampur atau menumpuk efek putih dan hitam yang ditambahkan, sebab piksel anti-aliasing abu-abu yang muncul di antara keduanya menghasilkan warna berbayang dari gambar di bawahnya, bukan warna abu-abu yang diharapkan. Itulah kelemahan teknik ini!

Me-mask gambar dengan distorsi...

Yang lebih menakjubkan, karena warna shading-nya hanyalah gambar grayscale, efek pencahayaan itu bisa dipadatkan menjadi satu kanal warna saja ditambah mask kanal alpha. Dengan begitu dua kanal warna gambar bebas dipakai untuk efek pemrosesan gambar yang lain! Artinya, hal-hal lain bisa Anda simpan ke dalam satu 'gambar masking' itu. Tepatnya, efek distorsi bisa ditambahkan ke gambar mask yang sama! Untuk keterangan lebih lanjut lihat Unified Distortion Image yang melakukan persis hal itu! Semacam gambar masking pamungkas.


Framing dengan gambar tepi

[IM Image] Salah satu cara umum menambahkan border yang rumit pada gambar adalah memakai gambar framing yang sudah disiapkan, sehingga menghasilkan frame seperti contoh di samping (kanan). Namun Anda juga perlu berhati-hati saat membuat frame. Kalau contoh tersebut diamati baik-baik, akan terlihat bahwa hasilnya kurang tepat. Shading pada frame yang dihasilkan itu sebenarnya keliru. Tepi frame kiri dan bawah semestinya ditukar agar shading-nya benar untuk sumber cahaya yang lazim berada di kiri atas. Karena itu, bahkan sebelum kita mulai, saya ingin menegaskan pentingnya memakai gambar yang tepat, atau gambar yang dimodifikasi dengan tepat, untuk setiap tepi ketika Anda memasang frame pada thumbnail atau foto. Sangat mudah keliru, jadi periksa ulang hasilnya ketika Anda merasa sudah benar.

Gambar tepi frame

Ada banyak jenis gambar yang bisa dipakai untuk membuat frame gambar. Sebagai contoh, berikut frame 'hitam tipis dengan lis emas' yang dimodifikasi dari gambar yang disediakan oleh Michael Slate .

[IM Image] [IM Image]

Ada dua gambar untuk dua efek pencahayaan yang berbeda, satu untuk tepi atas dan kiri, satu lagi untuk tepi bawah dan kanan. Namun warna di sepanjang gambar itu tidak berubah-ubah. Karena itu frame ini boleh di-tile atau diregangkan untuk mendapatkan panjang yang dibutuhkan. Sekumpulan potongan frame serupa adalah gambar border 'emas berukir tipis' yang bisa di-tile berikut ini.

[IM Image] [IM Image]

Karena gambar-gambar ini punya detail halus, gambarnya tidak bisa begitu saja diregangkan sampai panjang yang diinginkan. Potongan-potongan ini juga tidak bisa sekadar diputar dengan rotasi persegi panjang untuk menghasilkan potongan tepi yang lain, sebab shading detail halusnya akan menjadi keliru. Sebaliknya, distorsi transpose diagonal semestinya memberi shading yang benar untuk tepi-tepi yang lain. Periksalah hasilnya dengan ekstra hati-hati untuk memastikan shading keseluruhan maupun shading detail halusnya benar pada keempat sisi gambar. Terakhir, sebuah gambar framing bisa saja hanya terdiri atas satu gambar yang dipakai untuk menghasilkan semua tepi frame, seperti gambar frame tiling 'bambu' berikut ini.

[IM Image]

Alasan hanya satu gambar yang dibutuhkan adalah frame ini tidak punya sisi 'dalam' atau 'luar' yang khusus. Meski begitu frame ini tetap punya efek pencahayaan, baik secara keseluruhan maupun pada detail halusnya, sehingga sekali lagi Anda harus cermat dalam memutar/mem-flip/men-transpose gambar untuk tepi yang lain. Masalah yang lebih besar pada frame ini adalah, kalau di-tile begitu saja, detail besarnya menjadi sangat teratur, sehingga offset tile-nya mungkin perlu diacak, atau bahkan panjang tiap potongan yang disambung perlu diacak, supaya tampak lebih alami. Soal ini dibahas lagi nanti. Seperti terlihat, gambar framing bisa hadir dalam berbagai gaya, dan penanganan gambar tepi yang dipilih harus dilakukan dengan cara yang benar (terkait gambar pencahayaannya) ketika gambar tepi lain yang belum ada dihasilkan.

Memperpanjang potongan frame

Dalam setiap pemakaian gambar framing ini, kita perlu membuat potongan yang lebih panjang agar menutupi panjang sisi gambar. Pada dasarnya hanya ada dua cara untuk melakukannya. Gambar frame-nya bisa diregangkan begitu saja dengan resize (tanpa mempertahankan rasio aspek) sampai panjangnya pas. Cara ini cocok untuk kumpulan potongan pertama di atas, yang tidak punya detail internal, tetapi tidak cocok untuk gambar framing lain yang ditampilkan di sini. Pada dasarnya cara itu akan mendistorsi detail internalnya dan bisa mengganggu tampilan gambar akhir. Sementara itu cara memperpanjang yang satu lagi, yaitu tiling, bisa dipakai untuk gambar framing mana pun yang punya pola atau detail berulang, dan semua gambar di atas termasuk kategori itu. Kalau Anda membuat potongan framing sendiri, pastikan tile-nya menyambung dengan pas, tepat di batas piksel, supaya warnanya seragam dan perulangan detailnya benar. Kalau tidak, sambungan di antara tile-nya akan tampak artifisial, dan itu jadi kentara karena tile-nya berulang. Di dunia nyata pembuat frame foto pun menghadapi masalah yang sama saat menyambung potongan menjadi potongan yang lebih panjang. Pada dasarnya sangat mudah mendapatkan dua warna kayu yang berbeda, atau pola serat yang sangat berbeda, yang ketika disambung secara 'dove-tail' membuat sambungannya sangat kentara. Jadi Anda memang tidak sendirian menghadapi masalah ini. Gambar framing 'bambu' perlu di-tile. Namun karena detailnya terbatas pada area kecil di gambar, bisa muncul efek tiling acak yang menarik, yang untuk menghilangkannya mungkin perlu pengacakan panjang-pendek potongannya. Saya tidak akan membahasnya di sini, dan meninggalkannya sebagai latihan bagi yang berminat. Untuk contoh-contoh kita, dan karena cara ini berhasil untuk hampir semua gambar framing, saya akan memakai metode tiling konstan sederhana guna menghasilkan panjang tepi yang dibutuhkan.

Append yang terlalu sederhana

Frame 'bambu' sederhana di atas bisa kita perpanjang begitu saja dengan men-tile-nya sampai panjang yang tepat, lalu menyambung gambar-gambarnya. Tiling-nya cukup dilakukan dengan pembangkit gambar kanvas yang di-tile khusus "tile:" yang men-tile gambar saat dibaca. |

  magick thumbnail.gif \
          \( -size 90x14  tile:bamboo.gif -transpose \) \
          \( -size 90x14  tile:bamboo.gif -transpose \) -swap 0,1 +append \
          \( -size 148x14 tile:bamboo.gif \) \
          \( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
          frame_append.gif

[IM Output]
Perhatikan bahwa ukuran yang dipakai pada kedua contoh di atas dihitung berdasarkan lebar gambar framing yang sudah diketahui (10 piksel) dan ukuran gambar yang diberi frame (120x100 piksel). Argumen resize-nya perlu Anda sesuaikan dengan gambar Anda sendiri. Satu masalah pada tiling potongan framing (seperti bambu) adalah semua tepinya terlihat seperti salinan persis satu sama lain! Artinya, framing-nya tampak artifisial. Di dunia nyata frame dipotong dengan offset yang kurang lebih acak dari batang kayu asli yang lebih panjang, atau dalam hal ini bambu. Untuk memperbaikinya, tile semacam itu juga perlu diberi offset tile yang sedikit berbeda untuk tiap tepi gambar. |

  magick thumbnail.gif \
          \( -size 90x14  -tile-offset +50+0 tile:bamboo.gif -transpose \) \
          \( -size 90x14  -tile-offset +0+0  tile:bamboo.gif -transpose \) \
          -swap 0,1 +append \
          \( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
          \( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
          -swap 0,1 -append       frame_tile_offset.gif

[IM Output]
Metode framing ini tidak terlalu buruk untuk jenis gambar tepi yang satu ini, meski untuk jenis frame lain hasilnya bisa terlihat konyol. Pada dasarnya sudut-sudutnya tidak benar, dan untuk sebagian besar frame kita memang ingin gambar tepinya bertemu pada sambungan bersudut 45 derajat, persis seperti pada frame foto sungguhan. Salah satu solusinya adalah menyiapkan gambar sudut yang sesuai secara manual, lalu menimpakannya ke gambar ini agar hasilnya benar. Cara itu berhasil baik untuk gambar framing sederhana yang bisa diregangkan (seperti gambar framing 'hitam tipis'), tetapi gagal cukup parah untuk gambar yang di-tile seperti 'bambu', sebab gambar sudutnya kemungkinan besar tidak akan pas dengan gambar tile-nya. Cara yang lebih baik adalah menghasilkan sambungan sudut langsung dari gambar tepi yang sudah di-tile. Metodenya akan saya tunjukkan nanti.

Framing overlay yang diperluas

Framing tepi semacam ini juga bisa dibuat lebih bagus lagi dengan memanjangkan frame melewati batas gambar asli. Model ini sering terlihat pada hiasan dinding bergaya 'Home-Sweet-Home'. Untuk itu gambar aslinya perlu diperbesar lebih dulu dengan banyak ruang tambahan, tempat potongan frame yang lebih panjang ditimpakan.

  magick thumbnail.gif -alpha set -bordercolor none -border 34 \
          \( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
          -geometry +20+10 -composite \
          \( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
          -geometry +154+0 -composite \
          \( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
          -geometry +0+20 -composite \
          \( -size 178x14 -tile-offset +0+0  tile:bamboo.gif \) \
          -geometry +10+124 -composite \
          frame_overlaid.gif

[IM Output]

Perhatikan bahwa ukuran dan penempatan untuk framing semacam ini tidak sederhana, dan bisa memanfaatkan pengacakan seperti yang saya tuliskan langsung di contoh di atas. Tampilannya juga bisa diperbaiki lagi dengan membulatkan ujung tiap potongan frame, disertai shading tambahan yang sesuai. Cara yang jauh lebih baik untuk memasang frame seperti ini adalah membuat gambar framing-nya sebagai satu kesatuan utuh, lalu tinggal menimpakannya pada gambar berukuran tetap (lihat Overlay border sederhana). Namun dengan begitu panjang dan posisi tiap potongan framing tidak bisa lagi diacak sedikit-sedikit.

Sambungan sudut 45 derajat

Solusi yang lebih baik adalah menambahkan gambar framing di sekeliling thumbnail sedemikian rupa sehingga benar-benar terbentuk sambungan 45 derajat di tiap sudut frame. Ini tidak mudah, dan saya sempat menempuh sejumlah metode penggambaran dan masking sampai saya menemukan kembali sebuah operator ajaib bernama Frame, menambahkan border bergaya 3D. Sesudah itu solusinya jadi sederhana. Baca gambarnya, lalu terapkan "-frame" untuk membuat template area yang akan diberi frame. |

  magick thumbnail.gif -alpha set -bordercolor none \
          -compose Dst_Out -frame 15x15+15  frame_template.gif

[IM Output]
Perhatikan bahwa template ini punya beberapa sifat menarik. Pertama, bagian tengahnya transparan, tempat gambar utamanya nanti ditempatkan. Kedua, template ini punya empat dan hanya empat warna berbeda yang menandai tiap area tempat gambar framing akan kita letakkan. Template itu tidak menghasilkan piksel 'anti-aliasing' dengan warna beragam di sudut-sudutnya. Perlu dicatat, supaya urusannya mudah, lebar area tersebut (15 piksel) sama dengan lebar potongan framing yang akan kita tambahkan ke gambar. Kalau tepi vertikalnya berbeda ketebalan dengan tepi horizontal, teknik ini tidak akan bekerja dengan baik. Sebenarnya sedikit sekali metode yang bekerja baik dalam situasi seperti itu. Gambar ini adalah template framing-nya, dan dengan men-tile tiap potongan framing ke dalam empat area berwarna itu memakai primitif isian warna, kita akan mendapatkan sambungan sudut 45 derajat dengan sangat mudah. Misalnya... |

  magick frame_template.gif \
          -tile blackthin_top.gif -draw 'color 1,0 floodfill' \
          frame_top_filled.gif

[IM Output]
Proses ini bisa diulang untuk tiga tepi lainnya, memakai transpose agar highlight dan bayangan pada detail internalnya tetap benar. |

  magick frame_template.gif \
          -tile blackthin_top.gif   -draw 'color 1,0 floodfill' \
          -tile-offset +0+105 -tile blackthin_btm.gif \
                                       -draw 'color 15,105 floodfill' \
          -transpose \
          -tile blackthin_top.gif      -draw 'color 1,0 floodfill' \
          -tile-offset +0+135 -tile blackthin_btm.gif \
                                       -draw 'color 15,135 floodfill' \
          -transpose \
          -gravity center thumbnail.gif -composite frame_filled.gif

[IM Output]
Dari diskusi forum IM 45 degree frame joints ditemukan solusi yang lebih sederhana, yaitu dengan memutar tepi bawah terlebih dahulu. Berikut contoh lengkapnya, memakai register dalam memori untuk menyimpan gambar antara. |

  magick thumbnail.gif                -write mpr:image    +delete \
          goldthin_top.png             -write mpr:edge_top +delete \
          goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
          \
          mpr:image -alpha set -bordercolor none \
          -compose Dst -frame 25x25+25  -compose over \
          \
          -tile mpr:edge_btm \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          -tile mpr:edge_top \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          \
          mpr:image -gravity center -composite    frame_gold.png

[IM Output]
Seperti terlihat, masih ada masalah: sudut kiri atas dan kanan bawah tampak sangat artifisial karena efek cermin diagonal yang timbul dari tiling. Untuk memperbaikinya kita perlu menambahkan "-tile-offset" yang diacak, supaya efek cermin itu hilang. | Pengaturan offset tile rusak sebelum IM versi 6.3.9-9: offset 'X' dipakai untuk nilai offset 'X' sekaligus 'Y' (nilai 'Y' yang diberikan diabaikan). Artinya contoh di atas kemungkinan akan men-tile tepi bawah dan kanan secara keliru pada rilis IM yang lebih lama.
Versi skripBagian ini perlu ditulis ulang dengan contoh terakhir sebagai template Tentu saja semua hal di atas bisa dikerjakan dalam satu perintah. Namun mari kita lakukan dengan cara skrip. Versi ini memakai sedikit kode sisipan untuk menghasilkan gambar tepi yang sesuai dari gambar dasar yang tersedia, memakai rotasi persegi panjang dan beberapa penggulungan gambar acak agar tampilan keseluruhan gambar yang di-tile lebih baik. Semua itu bisa disesuaikan menurut jenis gambar framing tepi yang tersedia. Gambar tepi yang sudah diproses lalu di-tile dengan teknik tiling dengan gambar yang sudah ada di memori, dan template frame (yang dihasilkan tadi) dipakai untuk mem-mask gambar-gambar itu, seperti yang kita lakukan di atas.

  image=thumbnail.gif
     image_w=`magick $image -format %w info:`
     image_h=`magick $image -format %h info:`

  top=goldthin_top.png
  btm=goldthin_btm.png

     width=`magick $top -format %h info:`
     length=`magick $top -format %w info:`

  # Size of the new image ( using BASH integer maths)
  new_size=$(($image_w+$width*2))x$(($image_h+$width*2))

  # IM options to read a 'randomly rolled' version for the edge pieces
  lft="( $top -roll +$(($RANDOM % $length))+0  -transpose )"
  rht="( $btm -roll +$(($RANDOM % $length))+0  -transpose )"

  # IM options to 'randomly rolled' the top and bottom pieces
  top="( $top -roll +$(($RANDOM % $length))+0 )"
  btm="( $btm -roll +$(($RANDOM % $length))+0 )"

  # Frame the image in a single IM command....
  magick -page +$width+$width  $image  +page -alpha set \
    \( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
       -fill none -draw "matte 0,0 replace" \
          -flip   -draw "matte 0,0 replace"   -flip \) \
    \( $top $btm -append -background none -splice 0x${image_h}+0+$width \
       -write mpr:horz +delete -size $new_size tile:mpr:horz +size \
       -clone 1  -compose DstOut -composite \) \
    \( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
       -write mpr:vert +delete -size $new_size tile:mpr:vert +size \
       -clone 1  -compose DstIn -composite \) \
    -delete 1  -compose Over  -mosaic   framed_script.png

[IM Output]

Dan jadilah gambar dengan frame yang sempurna, bersambungan sudut 45 derajat dan offset tiling yang diacak. Ya, contohnya rumit. Tetapi kerumitan itu memungkinkan pemakaian tiling dengan gambar yang sudah ada di memori, sehingga gambar framing bisa kita praproses semuanya dalam satu perintah. Ini membuatnya lebih rumit sekaligus lebih serbaguna. Kode di atas sudah dijadikan skrip shell yang bisa Anda unduh ("frame_edges.tar.gz" dari direktori skrip contoh IM). File tar itu berisi skrip beserta sekumpulan gambar framing yang bisa diproses dan dipakai oleh skrip tersebut. Skrip itu juga menambahkan border 'kardus' di antara frame dan gambarnya sendiri.

Contoh mendatang

Memakai tepi yang di-tile dengan potongan sudut yang serasi. Gambar tepinya harus cocok dengan potongan sudut yang sudah disiapkan, sekaligus menyambung rapi sepanjang sisi gambar yang panjangnya tetap. Artinya seluruh tepi yang di-tile itu mungkin perlu sedikit diregangkan atau dimampatkan agar tile tepinya sejajar dengan potongan sudutnya. Agar bekerja dengan benar, tile tepi harus berulang setidaknya 3 atau 4 kali di sepanjang sisi gambar yang terpendek. Contoh tepi/sudut yang di-tile semacam ini adalah penerapan border dengan efek 'dedaunan' atau 'fleur'.