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

Contoh penggunaan ImageMagick -- teknik lanjutan

Kata pengantar dan indeks contoh penggunaan ImageMagick | Bullet 3-D dari bentuk | | Memakai skrip untuk menghasilkan gambar dalam jumlah besar
Memberi warna tint dan membentuk gambar shade grayscale 3-D
Membuat logo jadi 3D | Memakai overlay transparan untuk mewarnai gambar berbentuk dasar
Pantulan | Menambahkan pantulan permukaan dari berbagai jenis.
Potongan jigsaw | Memotong dan memperindah potongan berbentuk aneh dari sebuah foto
Efek "Gel" | Mengatur ukuran, kecerlangan, dan ketajaman highlight
Mencerahkan dan menggelapkan dengan compose 'Screen' dan 'Multiply'
Efek "Aqua" | Memakai 'curves' untuk mengatur highlight.
Bintang dan komet yang bisa di-tile | Titik-titik acak.
"Ya Tuhan! Penuh dengan bintang! -- 2001, A Space Odyssey"
Flare radial | Menghasilkan sinar dan cincin acak di sekeliling satu titik pusat.
Halaman ini menyajikan contoh-contoh yang sangat besar, tempat kita memakai beberapa teknik sekaligus untuk menghasilkan efek manipulasi gambar gabungan, di luar operasi gambar dasar IM. Teknik-teknik utamanya dirangkum pada indeks di atas. Banyak teknik memang sudah disajikan di halaman lain, seperti membuat templat font, memberi label gambar secara dekoratif, dan memakai mask, tetapi halaman-halaman ini menunjukkan bagaimana teknik-teknik itu dapat digabungkan untuk menghasilkan efek yang lebih rumit.


Bullet 3-D dari bentuk -- pendekatan berbasis skrip

Ada banyak gambar 'bullet' yang tersedia di web untuk daftar di halaman Anda. Tetapi Anda bisa menghasilkan objek 3d sendiri, sehingga seluruh situs web Anda dapat mengikuti satu gaya tertentu yang mengikatnya menjadi satu kesatuan. Salah satu cara terbaik untuk itu adalah membuat skrip 'generate' yang secara otomatis menghasilkan seluruh rentang tombol dan bentuk bergaya tertentu, dengan warna apa pun yang diperlukan. Berikut salah satu skrip semacam itu, yang sangat sederhana. Di sini kita memakai opsi "-shade" untuk menghasilkan objek yang tampak 3d dari sebuah transparansi berbentuk polos. Bentuk itu hanya punya transparansi on/off yang tegas, dan itu dijaga baik-baik, sehingga hasilnya dapat dipakai sebagai gambar GIF transparan untuk keperluan umum di halaman web. Gambar grayscale hasil 'shade' kemudian diwarnai dengan operator "-tint", untuk mengatur abu-abu nada tengah pada gambar, sementara bayangan hitam dan putih yang lebih ekstrem dibiarkan apa adanya. Setelah itu bentuk asli gambar masukan ditambahkan kembali ke hasil yang sudah berwarna. Sebagai bonus, kalau gambar masukan hanya punya transparansi boolean, hasilnya juga punya transparansi boolean yang cocok untuk gambar berformat GIF.

    magick {_input_image_} -alpha set \
            \( +clone -channel A -separate +channel \
               -bordercolor black -border 5  -blur 0x2 -shade 120x30 \
               -normalize -blur 0x1 -fill {_color_} -tint 100 \) \
            -gravity center -compose Atop -composite \
            {_output_image_}

Perhatikan bahwa gambar masukan hanya dibaca satu kali oleh skrip di atas. Dengan begitu skrip ini juga bisa dipakai di dalam pipeline perintah dengan '-' sebagai nama file masukan dan keluaran (barangkali disertai pengaturan format gambar IM). Hal ini bisa penting saat Anda menulis skrip IM sendiri. Perintah di atas saya tulis ke dalam sebuah skrip shell yang sangat sederhana bernama "create_bullet", lalu perintah-perintah berikut dijalankan untuk menghasilkan berbagai gambar simbol dalam banyak warna berbeda.

    magick +antialias -size 15x15 xc:none -draw 'circle 7,7 3,3'  ball.gif
    create_bullet ball.gif  grey    ball_grey.gif
    create_bullet ball.gif  red     ball_red.gif
    create_bullet ball.gif  green   ball_green.gif
    create_bullet ball.gif  blue    ball_blue.gif
    create_bullet ball.gif  yellow  ball_yellow.gif
    create_bullet ball.gif  maroon  ball_maroon.gif
    create_bullet ball.gif  cyan    ball_cyan.gif

    magick -size 12x12 xc:black   square.gif
    create_bullet square.gif  grey    square_grey.gif
    create_bullet square.gif  red     square_red.gif
    create_bullet square.gif  green   square_green.gif
    create_bullet square.gif  blue    square_blue.gif
    create_bullet square.gif  yellow  square_yellow.gif
    create_bullet square.gif  maroon  square_maroon.gif
    create_bullet square.gif  cyan    square_cyan.gif

    # retrieve asterix symbol from
    # [Anthony's Web Images, Symbols](http://www.cit.griffith.edu.au/images/Symbols/Images.html)
    create_bullet asterix.gif  grey    asterix_grey.gif
    create_bullet asterix.gif  red     asterix_red.gif
    create_bullet asterix.gif  green   asterix_green.gif
    create_bullet asterix.gif  blue    asterix_blue.gif
    create_bullet asterix.gif  yellow  asterix_yellow.gif
    create_bullet asterix.gif  maroon  asterix_maroon.gif
    create_bullet asterix.gif  cyan    asterix_cyan.gif

    # Use a heart symbol from "WebDings" font (22 point => 16x16 pixel image)
    magick -font WebDings -pointsize 22 -background none \
            label:Y -trim +repage    heart.png
    create_bullet heart.png  grey    heart_grey.png
    create_bullet heart.png  red     heart_red.png
    create_bullet heart.png  green   heart_green.png
    create_bullet heart.png  blue    heart_blue.png
    create_bullet heart.png  yellow  heart_yellow.png
    create_bullet heart.png  maroon  heart_maroon.png
    create_bullet heart.png  cyan    heart_cyan.png

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

Hanya bentuk atau transparansi gambar sumber yang dipakai untuk menghasilkan bullet, jadi bentuk apa pun bisa digunakan. Pilihlah bentuk sendiri yang khas bagi situs Anda. Perhatikan juga bahwa GIF maupun PNG bisa dipakai, dengan atau tanpa transparansi yang mendefinisikan bentuknya. Perintah ini tidak membedakannya. Kalau gambar yang dipakai lebih besar daripada yang ditunjukkan di sini, sebaiknya perbesar juga kadar blur yang diterapkan sebelum operasi shade. Kalau tidak, hanya area dekat tepi gambar yang akan tampak membulat. Selain itu, lebih baik mem-blur beberapa kali daripada memakai satu nilai blur yang besar (supaya proses blur lebih cepat). Tentu saja, kalau Anda punya perbaikan atau gagasan lain, beri tahu saya, supaya kita bisa membagikannya kepada orang lain.


Membuat logo jadi 3-D

Pada contoh ini kita punya logo berwarna datar dengan bentuk yang rumit, yang ingin kita proses agar tampak jelas 3-D. Untuk itu kita memakai logo tersebut guna menghasilkan highlight dan bayangan, lalu mengubahnya menjadi transparansi untuk ditimpakan pada gambar aslinya. Efek ini dicapai selangkah demi selangkah dengan banyak teknik berbeda dari seluruh halaman contoh. Contoh ini banyak memakai gambar yang dihasilkan operator shade dan berbagai metode komposisi alpha. Saya sarankan Anda mengakrabi operator gambar ini sebelum melanjutkan, atau membukanya saat ingin lebih memahami apa yang sedang terjadi.


Namun sebelum bisa mulai, kita perlu sebuah logo sederhana untuk menerapkan teknik ini, beserta mask-nya.... Mari kita buat dulu bentuk untuk latar belakang berwarna dari contoh logo ini... |

  magick -size 170x100 xc:black \
          -fill white -draw 'circle    50,50  13,50' \
                      -draw 'circle   120,50 157,50' \
                      -draw 'rectangle 50,13 120,87' \
          -fill black -draw 'circle    50,50  25,50' \
                      -draw 'circle   120,50 145,50' \
                      -draw 'rectangle 50,25 120,75' \
          -fill white -draw 'circle    60,50  40,50' \
                      -draw 'circle   110,50 130,50' \
                      -draw 'rectangle 60,30 110,70' \
          -gaussian 1x1 -alpha off logo_mask.png

[IM Output]
Sekarang kita pakai mask itu untuk memotong warna polos logo kita, lalu menambahkan sedikit teks guna menghasilkan logo berwarna polos yang sederhana. |

  magick logo_mask.png -background red -alpha shape \
          -font Candice  -pointsize 36  -fill white  -stroke black \
          -gravity Center  -annotate 0 "Ant" \
          logo.png

[IM Output]


Sekarang mari kita beri tampilan 3D dengan teknik overlay highlight. |

  magick logo.png  -alpha extract -blur 0x6  -shade 110x30  -normalize \
          logo.png  -compose Overlay -composite \
          logo.png  -alpha on  -compose Dst_In  -composite \
          logo_3D.png

[IM Output]
Menambahkan bayangan juga lebih mudah berkat operator pembuatan bayangan baru yang disediakan IM. |

  magick logo_3D.png \( +clone -background navy -shadow 80x4+6+6 \) +swap \
          -background none  -layers merge +repage logo_3D_shadowed.png

[IM Output]
Sekadar iseng, mari kita tutup dengan menimpakan logo kita pada latar belakang mirip 'kertas kasar'. Kanvas latar belakang lain masih sangat banyak yang bisa dibuat; lihat contoh latar belakang untuk kumpulan contoh semacam itu. |

  magick logo_3D_shadowed.png \
          \( +clone +repage -alpha off -fx 'rand()' -shade 120x30 \
             -fill grey70 -colorize 60 \
             -fill lavender -tint 100 \) \
          +swap -composite logo_3D_bg.jpg

[IM Output]


Pantulan

Pantulan relatif mudah dibuat, tetapi sering kali tidak terasa begitu. Anda harus berurusan dengan hal-hal seperti warna dan tekstur permukaan, juga dengan bagaimana efek semacam itu menguat seiring jarak antara pantulan di permukaan dan objek yang dipantulkan permukaan tersebut. Pada dasarnya, sesuatu yang semestinya cukup sederhana dengan cepat menjadi cukup rumit. [IM Output] Jadi mari kita mulai dengan pantulan sebuah gambar yang relatif sederhana, dalam hal ini gambar tokoh Pokemon, Azumarill (lihat sebelah kanan). Silakan ganti dengan gambar Anda sendiri. Nah, untuk membuat pantulan cermin yang sempurna, cukup salin dan balik objek sumbernya, lalu tambahkan latar belakang di belakangnya supaya ada konteksnya. Sebagai contoh...
|

  magick pokemon.gif \( +clone -flip \) -append \
          -size 100x100 xc:black +swap \
          -gravity North -geometry +0+5 -composite  reflect_perfect.png

[IM Output]

Warna permukaan - pelemahan umum

Yang perlu dicatat pada contoh di atas: karena pantulannya sempurna, hasilnya tidak benar-benar tampak seperti pantulan pada permukaan hitam. Lebih mirip 'tile cermin' dari gambar aslinya, dan itu memang benar. Bahkan cermin kamar mandi biasa pun tidak memantulkan seluruh cahaya yang mengenainya, padahal itu kira-kira cermin terbaik yang bisa Anda dapatkan. Jadi aturan pertama soal pantulan adalah...

Pantulan tidak pernah sempurna.

Tidak ada pantulan yang memantul 100%, sehingga semuanya diwarnai oleh permukaannya (atau oleh lingkungan di sekitarnya). Dunia ini tidak sempurna, dan pantulan menonjolkan sekaligus memperagakan ketidaksempurnaan itu dengan sangat baik. Jadi mari kita coba lagi, kali ini dengan mewarnai pantulannya memakai warna permukaan pemantul. Ada dua cara untuk itu. Metode paling sederhana adalah mewarnai (colorize) pantulan dengan warna yang sama seperti permukaannya. Banyaknya warna yang ditambahkan bergantung pada seberapa baik permukaan itu memantulkan cahaya; untuk permukaan berwarna biasanya buruk, jadi warna yang perlu ditambahkan cukup banyak. "65%" sudah cukup bagus untuk permukaan hitam. |

  magick pokemon.gif \
      \( +clone -flip -fill black -colorize 65% \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_colored.png

[IM Output]
Jauh lebih baik... Sekarang benar-benar terlihat seperti pantulan! Cara lain untuk memperlemah pantulan adalah membuat gambar yang dipantulkan menjadi semitransparan alias tembus cahaya. Misalnya dengan mengalikan nilai alpha gambarnya, sehingga hanya sekitar 35% objek sumber yang terlihat. |

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_alpha.png

[IM Output]
Cara ini sebenarnya lebih disukai, sebab warna permukaannya jadi bisa apa saja, bahkan berupa tekstur atau pola warna. Sebagai contoh, mari kita hasilkan lantai kayu horizontal memakai teknik tiling tak hingga dari melihat cakrawala jauh. |

  magick tile_wood.gif   -set option:distort:viewport 100x100 \
          -virtual-pixel tile     -distort Perspective \
                '0,0 -20,65  96,0 60,40  96,96 120,55  0,96 50,99' \
          wooden_floor.png

[IM Output]
Dan sekarang timpakan gambar kita beserta pantulan semitransparannya ke lantai kayu ini. |

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      wooden_floor.png +swap \
      -gravity North -geometry +0+5 -composite  reflect_wood.png

[IM Output]
Tanpa objek yang dipantulkan, permukaan kayunya tampak kusam dan tak bernyawa, tetapi begitu ada objek yang terpantul di dalamnya, lantai itu tiba-tiba tampak sangat mengilap!

Sumber yang terdistorsi

Oke. Mari kita coba sesuatu yang sedikit lebih bergaya, dan beri gambar itu sedikit kedalaman perspektif 3D. |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      +distort Perspective '0,0 0,0  0,64 0,64  64,0 54,10  64,64 54,54' \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_bad.png

[IM Output]
Yang jelas-jelas salah. Gambarnya memang tampak terdistorsi, tetapi tetap menghadap datar ke arah pengguna. Kenapa? Karena...

Objek yang bersentuhan dengan permukaan juga akan bersentuhan dengan pantulannya.

Kelihatannya sudah jelas, tetapi saya pernah melihat orang keliru di titik ini. Tentu saja kalau objeknya melayang di atas permukaan, keduanya tidak akan bersentuhan. Salah satu cara memperbaikinya adalah mendistorsi gambar sumber dan pantulan gambar itu secara terpisah, lalu menggabungkan hasilnya dengan merge layer. |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( -clone 0 \
         +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \) \
      \( -clone 0  -channel A -evaluate multiply .35 +channel \
         +distort Perspective '0,0,0,128  0,64,0,64  64,0,54,98  64,64,54,54' \
      \) -delete 0 +swap -background none  -layers merge \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_sep.png

[IM Output]
Seperti terlihat dari kumpulan parameter distorsi yang sangat berbeda itu, mendistorsi pantulan bisa jadi sangat sulit. Lebih sulit lagi karena satu perubahan sederhana pada distorsi pertama menuntut perubahan yang terhitung pada distorsi kedua bagi gambar pantulannya. Ada dua aturan lagi yang memberi tahu bagaimana koordinat distorsi pantulan seharusnya dihitung.

Pantulan pada permukaan horizontal selalu lurus ke bawah.

Artinya, pantulan selalu mengarah ke pengguna; karena pengguna berada tepat di depan gambar, pantulan pada permukaan horizontal pasti mengarah ke bawah, lurus ke arah pengguna. Ini hukum fisika, dan itulah satu hal yang tidak boleh dilanggar kalau ingin gambar Anda setidaknya setengah realistis. Terakhir, satu aturan lagi yang perlu diingat.

Permukaan vertikal yang terpantul pada permukaan horizontal punya
pantulan setinggi objek yang dipantulkan

Tidak peduli seberapa 'jauh' objek itu tampak di dalam gambar, tinggi pantulannya pada gambar akhir harus sama dengan tinggi objek yang dipantulkan! Ini tidak kentara, dan sangat mudah keliru.

Ketiga aturan ini berarti nilai X koordinat pantulan tetap sama, tetapi nilai Y dibalik ke bawah terhadap 'titik sentuh permukaan' sejauh jarak titik itu berada di atasnya.

Jadi dengan sedikit kehati-hatian, koordinat distorsi untuk pantulannya bisa dihitung berdasarkan koordinat gambar sumber yang sudah terdistorsi. Aturan-aturan ini juga memberi kita cara untuk menyederhanakan pantulan pada gambar yang terdistorsi. Cukup tempelkan pantulannya ke gambar sumber lebih dulu, lalu distorsi gambar sumber itu seolah-olah tidak ada pantulan yang menempel, dan biarkan pantulannya ikut terdistorsi bersama gambar utamanya... |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_distort.png

[IM Output]
Seperti terlihat, cara ini jauh lebih mudah: hanya ada satu kumpulan distorsi yang perlu diurus untuk objeknya, sehingga perubahan pun jauh lebih sederhana. Cara ini juga memungkinkan pemakaian distorsi yang tanpa cara ini mustahil ditiru untuk membuat pantulan terpisah. Sebagai contoh, membuat busur 3D dari gambar... |

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Barrel '0,0,0,1  0,0,-.35,1.5  32,32' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_3Darc.png

[IM Output]
Satu catatan terakhir sebelum kita lanjut ke bagian berikutnya... Bayangan umumnya menuruti aturan yang sama seperti pantulan, kecuali dua aturan terakhir. Bayangan mungkin tidak jatuh lurus ke bawah, melainkan menjauhi sumber cahaya (sejajar untuk sumber cahaya yang jauh). Bayangan juga tidak berjarak sama dari 'titik sentuh permukaan', tetapi rasio jaraknya tetap sama, hanya saja bukan rasio 1:1 seperti pada pantulan.

Pelemahan gradien

Sejauh ini kita berurusan dengan permukaan pemantul yang mulus sempurna, padahal kebanyakan permukaan tidak dipoles sampai mengilap seperti cermin. Permukaan yang tampak mulus sebenarnya tidak mulus pada skala yang lebih kecil, dan hal itu memengaruhi cahaya yang dipantulkan permukaan semacam itu. Efek tersebut juga menguat seiring jarak yang harus ditempuh cahaya pantul antara objek dan titik pemantulan. Karena itu...

Pantulan makin lemah dan makin terdistorsi,
semakin jauh jaraknya dari gambar sumber.

Cara paling sederhana untuk menciptakan efek jarak adalah membuat pantulan makin lemah semakin jauh dari permukaannya. Untuk ini biasanya bisa diterima kalau pantulannya dibuat sedikit lebih terang di dekat gambar. |

  magick pokemon.gif -alpha on \
      \( +clone -flip \
         -size 64x28 gradient:gray40-black   \
         -alpha off -compose CopyOpacity -composite \
      \) -append \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_attenuated.png

[IM Output]
Cara ini bekerja cukup baik, dan begitu mudah dibuat sampai menjadi metode yang lumayan umum untuk menghasilkan pantulan. Tekniknya berhasil karena sebagian besar cahaya yang dipantulkan bukanlah pantulan sempurna, melainkan lebih merupakan pantulan lingkungan secara keseluruhan. Semakin jauh dari gambar aslinya, semakin sedikit bagian gambar asli yang terpantul.

Pelemahan dengan blur

Komponen yang membentuk pantulan sesungguhnya dari objek sumber tidak sekadar melemah seiring jarak. Pada kenyataannya pantulan menjadi makin kabur, buram, dan terdistorsi seiring jarak, sebab permukaan pemantulnya umumnya tidak terlalu mulus. Ini bukan distorsi makro, melainkan distorsi pada tingkat mikroskopis yang sangat kecil. Efek yang sama itulah yang menghasilkan pantulan cahaya spekular. Artinya, dekat dengan sumber pantulan hasilnya bisa cukup tajam, tetapi semakin jauh dari sumbernya gambar itu semakin kabur. Sebelum IM versi 6.5.5-0, hal ini sangat sulit dicapai (bisa saja, tetapi tidak tanpa banyak akal-akalan). Sekarang pemetaan blur bervariasi bisa dipakai untuk mem-blur pantulan berdasarkan jaraknya dari gambar sumber dengan cukup mudah. Namun supaya ini berhasil, sebaiknya tambahkan border transparan di sekeliling objeknya sebagai ruang untuk blur. Pada contoh-contoh ini saya memperluas gambar akhirnya supaya seluruh pantulan terlihat, sehingga efeknya bisa dinikmati. |

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \
         -size 100x100 gradient:gray5-white \
         -compose Blur -set option:compose:args 10 -composite -compose Over \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blurred.png

[IM Output]
Blur pantulan bisa diperkuat lagi dengan memakai elips blur yang direntangkan secara vertikal. Misalnya dengan argumen blur elips '10x30' alih-alih blur lingkaran sederhana '20'. Kalau "pelemahan dengan blur" itu Anda gabungkan dengan "pelemahan gradien", hasilnya mulai menjadi pantulan yang sangat realistis untuk permukaan yang khas: tidak terlalu dipoles, tetapi mulus. |

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip \
         \( -size 100x64 gradient:'rgba(0,0,0,0.6)-none' \
            -size 100x36 xc:none  -append \
         \) -compose Dst_In -composite \
         \( -size 100x100 gradient:gray5-white \
         \) -compose Blur -set option:compose:args 4x8 -composite \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blur_atten.png

[IM Output]
Sulit rasanya mendapatkan gambar pantulan permukaan datar yang lebih baik daripada ini.

Future: To add examples of...
  Surface Texture effects
    frosted - or non smooth surfaces (small scale randomised distortions)
    rippled - water reflections
        (very little blur or attenuation, just stronger macro distortion)

Potongan jigsaw

Salah satu hal paling menarik yang pernah dimintakan bantuan kepada saya adalah memotong dan memperindah sebuah potongan 'jigsaw' berbentuk aneh dari gambar yang lebih besar. Sebenarnya Theo van Hoesel, yang juga dikenal sebagai "Mr Jigsaw", ingin menghasilkan banyak potongan terpisah dengan bermacam-macam sudut putaran. Yang berikut ini dikembangkan dari diskusi kami untuk satu potongan saja, tetapi dengan kumpulan templat yang tepat, pola potongan apa pun bisa dihasilkan. Di sebelah kanan ada thumbnail yang tertaut ke gambar 800x600 berupa foto Monumen Holocaust di Berlin, Jerman. Foto ini saya ambil dalam perjalanan saya ke Eropa pada April 2006. Sepertinya ini gambar yang bagus sekali untuk dijadikan teka-teki jigsaw yang benar-benar sulit. Di bawahnya ada gambar templat potongan jigsaw yang akan saya ambil dari gambar di atas. Templat itu bagian dari satu set gambar semacam itu. Set potongan jigsaw lengkapnya berisi 192 mask seperti itu, dalam larik 16 kali 12, termasuk bagian tepi dan sudut. Potongan jigsaw yang satu ini adalah mask 100x100 piksel , dan dirancang untuk dipakai pada offset +365+96 di gambar 800x600 piksel. Angka-angka ini hanya penting kalau Anda punya set besar berisi potongan berbeda-beda yang harus saling cocok. Kalau tidak berencana begitu, tentu saja Anda boleh memakai offset apa pun. [photo]
[IM Output]
Saya sendiri sudah mengumpulkan sejumlah set jigsaw semacam itu, yang memungkinkan saya membuat jigsaw dari gambar apa pun. Dan inilah yang sebenarnya dikerjakan Theo van Hoesel di situsnya. Kalau Anda membuat teka-teki jigsaw sungguhan, informasi offset sangat penting, karena itulah yang menandai lokasi dan penempatan potongan tersebut pada gambar asli. Karena itu saya akan berusaha mempertahankan informasi ini. Perhatikan bahwa offset untuk mask dalam beberapa kasus bisa bernilai negatif, akibat padding tambahan di sekeliling bentuknya, jadi perintah gambarnya mungkin perlu diuji dan disesuaikan untuk menangani situasi itu. Padding tambahan itu sendiri memudahkan Anda memutar serta menambahkan efek ketebalan dan bayangan pada gambar akhir, tanpa perlu mengubah ukuran atau offset potongan jigsaw yang dipotong. Tetapi pertama-tama mari kita ubah templat ini menjadi outline.
    magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png

[IM Output]
Selanjutnya outline itu bisa saya timpakan ke gambarnya untuk mendapat gambaran kasar bagian mana yang akan dipotong menjadi potongan jigsaw. |

    magick holocaust_md.jpg \
            \( jigsaw_edge.png -negate \) -geometry +365+96 \
            -compose multiply -composite \
            -crop 100x100+365+96 +repage jigsaw_outline.png

[IM Output]
Biasanya ini tidak dilakukan saat membuat jigsaw, tetapi berguna kalau posisi potongannya tidak penting (karena bukan bagian dari teka-teki yang lebih besar). Kalau begitu, offset-nya bisa disesuaikan untuk memilih isi yang lebih bagus bagi potongan jigsaw itu. | Karena cara kerja "-edge", outline jigsaw yang dihasilkan di atas berada di dalam area ber-mask (putih) pada gambar mask-nya. Hal ini bisa penting kalau Anda ingin memanfaatkan outline tersebut nanti.
Oke, kita sudah punya bentuk jigsaw dan offset untuk potongan yang akan dipotong. Jadi mari kita potong sekalian putar. |

    magick holocaust_md.jpg \
            -crop 100x100+365+96\! -background none -flatten +repage \
            \( jigsaw_tmpl.png -alpha off \) -compose CopyOpacity -composite \
            -rotate -20 -gravity center -crop 100x100+0+0 +repage \
            jigsaw_cutout.png

[IM Output]
Perhatikan bahwa kita memangkas gambar sumber sampai sebatas area yang ditutupi bentuk templat kita. Area di luar mask tidak akan kita perlukan, dan membuangnya lebih awal akan mempercepat pemrosesan gambar. Perhatikan juga pemakaian khusus pemangkasan viewport, yang disusul "-flatten". Metode pemangkasan ini menjamin kita mendapat gambar 100x100 piksel sebagai tempat 'memotong' templatnya, bahkan ketika memakai mask potongan tepi atau sudut, sekaligus menangani offset negatif untuk potongan yang berada di atau dekat tepi atas maupun tepi kiri gambar. Pemutaran juga dilakukan pada tahap ini karena sebagian besar penyempurnaan menambahkan efek berdasarkan arah tertentu. Hasil pemutaran itu lalu dipangkas di tengah, sebab operator ini biasanya memperbesar ukuran gambar hasil bergantung pada sudut putar yang dipakai, dan kita tidak menginginkannya. Penyempurnaan pertama adalah memberi potongan itu highlight yang sedikit ber-bevel atau membulat di sekeliling tepinya. Ini sesuai dengan overlay highlight shade, yang memungkinkan kendali halus (4 faktor terpisah) atas cara highlight itu dihasilkan. |

   magick jigsaw_cutout.png \
           \( +clone -channel A -separate +channel -negate \
              -background black -virtual-pixel background \
              -blur 0x2 -shade 120x21.78 -contrast-stretch 0% \
              +sigmoidal-contrast 7x50%  -fill grey50 -colorize 10% \
              +clone +swap -compose overlay -composite \) \
          -compose In -composite jigsaw_bevel.png

[IM Output]
Pada jigsaw sungguhan, bevel ini muncul akibat mesin pres yang memotong potongan-potongan jigsaw. Bevel juga membuat potongannya sedikit cekung, sehingga saat potongan dipasang kembali bekas potongannya masih terlihat. Sekarang mari kita tambahkan ketebalan pada potongan itu. Ini cara terbaik sekaligus tercepat yang saya temukan, meski saya tidak menganggapnya teknik yang bagus. Kalau Anda menemukan yang lebih baik, tolong beri tahu saya. |

   magick jigsaw_bevel.png \
           \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
           \( +clone -repage +1+2 \)  \( +clone -repage +1+3 \) \
           \( +clone -repage +2+4 \)  \( +clone -repage +2+5 \) \
          -background none -compose DstOver -flatten \
          jigsaw_thickness.png

[IM Output]
Dan terakhir, bagaimana kalau ditambah bayangan. |

    magick jigsaw_thickness.png \
            \( +clone   -background Black -shadow 50x3+4+4 \) \
            -background none -compose DstOver -flatten \
            jigsaw_shadow.png

[IM Output]
Semua perintah di atas mudah disimpan ke dalam satu skrip shell, dan itu sudah saya lakukan untuk keperluan sendiri. Skrip "jigsaw " menerima tiga parameter gambar: foto sumber, templat, dan tujuan, ditambah sejumlah opsi untuk mengaktifkan berbagai penyempurnaan yang ditunjukkan di atas. Skrip ini juga tidak harus memakai bentuk jigsaw. Templat mask apa pun bisa dipakai untuk memotong bagian gambar, dengan efek tambahan yang sesuai. Perbedaan terbesar antara contoh di atas dan versi skrip saya adalah bahwa secara bawaan skrip menjaga gambar akhir sekecil mungkin, sambil melacak offset gambar hasil potongan. Dengan mempertahankan posisi offset itu, cukup pakai "-mosaic" atau "-flatten" sederhana untuk menimpakan kembali banyak potongan menjadi satu dan menghasilkan efek yang menarik (lihat contoh terakhir di bawah). Berikut beberapa contoh pemakaian skrip ini dengan sejumlah cara.

    jigsaw -o +365+96 -m  null: jigsaw_tmpl.png  jigsaw_mask.png
    magick -size 800x600 xc:gray miff:- |\
                 jigsaw -r 30 -l -h -s miff:- jigsaw_mask.png jigsaw_grey.png
    jigsaw -r -60 -h -t 4 -s holocaust_md.jpg jigsaw_mask.png jigsaw_piece.png

    magick jigsaw_cnr.png -resize 50% -flip -flop -repage 120x90 \
            -background black -flatten -flip -flop jigsaw_cnr_tmpl.png
    jigsaw -t 3 -s  -r 15  -d +15+7 \
            holocaust_tn.gif jigsaw_cnr_tmpl.png   holocaust_piece_tn.png
    magick jigsaw_cnr_tmpl.png -negate png:- |\
      jigsaw -t 3 -s holocaust_tn.gif png:-   holocaust_puzzle_tn.png
    magick holocaust_puzzle_tn.png  holocaust_piece_tn.png \
            -background none  -mosaic    holocaust_jigsaw_tn.png

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

Gambar terakhir adalah awal dari kemungkinan gaya thumbnail jigsaw... Gambar itu mengambil potongan jigsaw sudut, lalu dengan sedikit penskalaan dan pelebaran mengubah mask-nya menjadi templat mask seukuran gambar penuh. Templat itu kemudian dipakai bukan hanya untuk memotong potongan sudut dari thumbnail yang ada, tetapi juga dinegasikan untuk menghasilkan sisa gambarnya. Menimpakan kedua gambar itu lalu menghasilkan thumbnail jigsaw yang tampak cukup bergaya. Perhatikan pemakaian '-d +15+7' pada opsi pembuatan potongan. Ini menggeser 'offset halaman' gambar PNG yang dihasilkan sedikit saja relatif terhadap posisi aslinya di dalam gambar, dan menghasilkan apa yang ditunjukkan itu dengan mudah dan sederhana. Lihat skripnya sendiri untuk opsi lain yang tersedia. | _Karena offset halaman yang dihasilkan bisa bernilai negatif, dan bisa memuat efek bayangan lembut yang opsional, disarankan hanya gambar PNG yang dipakai untuk potongan yang diekstrak. Gambar GIF tidak bisa menangani offset halaman negatif maupun efek bayangan, dan juga tidak menghasilkan tepi anti-alias yang tampak halus ketika transparansi terlibat.

Umumnya sebaiknya hindari gambar GIF (dan JPEG) kecuali untuk gambar akhir. Untuk keterangan lebih lanjut, lihat halaman contoh format gambar yang umum._
Anda tidak terbatas pada templat teka-teki jigsaw; mask berbentuk apa pun bisa dipakai dengan gambar apa pun. Beri tahu saya apa yang Anda hasilkan. Pengembangan skrip "jigsaw" belum benar-benar selesai, sebab saya ingin kendali yang lebih baik untuk efek highlight, ketebalan, dan bayangan, serta mungkin sebuah opsi 'negate mask'. Meski begitu, pada dasarnya program ini sudah lengkap dan berfungsi, dan Anda bebas memakainya. Beri saya tautan balik kalau Anda memakainya untuk sebuah halaman web :-) Bagi yang punya keterampilan API PerlMagick, cobalah ambil skrip di atas dan ubah ke PerlMagick demi kecepatan, lalu kirimkan kepada saya supaya semua orang bisa ikut memakainya, sekaligus tahu betapa mahirnya Anda memakai IM. Saran dan gagasan lain selalu diterima.
Kalau Anda hanya ingin memotong semua potongan dari sebuah gambar memakai sekumpulan mask (dengan atau tanpa offset piksel virtual), perintah berikut bisa mengerjakan SEMUANYA dengan sangat cepat.

  magick mask_*.png -set filename:mask %t -alpha shape \
          null: image.jpg -compose In -layers composite \
          pieces_%[filename:mask].png

Setiap gambar "pieces_mask_*.png" yang dihasilkan tidak hanya memuat bagian yang sesuai dari gambar asli pada offset yang benar, tetapi juga mempertahankan offset itu pada gambar akhirnya. Hal ini dikerjakan memakai komposisi multi-layer untuk menggabungkan semua gambar di sebelah kiri gambar penanda khusus "null:" dengan satu gambar di sebelah kanannya. Sebagai bonus, nama file mask yang dipakai akan disisipkan ke dalam nama file gambar potongan (termasuk format file gambar akhirnya), sehingga jauh lebih mudah mengenali tiap potongan. (Lihat escape persen pada nama file untuk rinciannya. Perhatikan bahwa mask-nya tidak harus menutupi seluruh gambar asli, tetapi jangan sampai menyisakan celah atau ruang kosong di antara potongan. Tentu saja, untuk jigsaw yang benar semua mask harus selaras dengan tepat, sehingga menghasilkan satu kesatuan tanpa sambungan, seperti ditunjukkan pada contoh komposisi Dst_Out.


Efek "Gel"

Shading 3-D yang dipakai di atas baru permulaan dari apa yang bisa Anda lakukan dengan efek highlight dan shade. Dengan melakukan berbagai penyesuaian histogram pada keluaran "-shade", rentang kemungkinannya menjadi sangat luas. Salah satu efek yang bisa ditiru dikenal sebagai efek 'Gel', seperti yang sering dijumpai di situs how-to "Photoshop" (cari "Gel Effects Tutorial" di Google). Pertama mari kita buat bentuk yang kita perlukan. Bentuk itu bisa berupa gambar yang sudah disiapkan atau diambil dari font 'Dings', seperti yang kita lakukan pada bullet 3D berbentuk "heart" di atas. Dalam hal ini mari kita pakai bentuk oval sederhana untuk sebuah tombol... |

  magick -size 100x60 xc:none \
          -fill red -draw 'circle    25,30  10,30' \
                    -draw 'circle    75,30  90,30' \
                    -draw 'rectangle 25,15  75,45' \
          gel_shape.png

[IM Output]
Sekarang mari kita tambahkan highlight 'Gel' yang tajam pada bentuk berwarna itu, memakai operasi shade ber-blur yang sudah banyak dimodifikasi... |

    magick gel_shape.png \
            \( +clone -alpha extract  -blur 0x12  -shade 110x0 -normalize \
               -sigmoidal-contrast 16,60% -evaluate multiply .5 \
               -roll +5+10 +clone -compose Screen -composite \) \
            -compose In  -composite  gel_highlight.png

[IM Output]
Kita menerapkan "-shade" pada salinan kanal transparansi (matte) setelah mem-blur-nya supaya membulat. Shade itu memakai sumber cahaya tanpa sudut 'ketinggian' maupun 'azimut', yang pada dasarnya berarti kita mendapat highlight berwarna abu-abu hanya pada satu sisi bentuk yang sudah di-blur, dan hitam untuk selebihnya. Grayscale highlight ini lalu disesuaikan (dipertajam) memakai operator "-sigmoidal-contrast" untuk memperkecil ukuran area yang tersorot (tingkat ambang batas '60%') dan menajamkan tepinya (memakai faktor eksponensial '16' yang sangat tinggi). Dengan nilai eksponensial setinggi itu, operator ini nyaris berperilaku seperti operator "-threshold" yang 'kabur', sehingga menghasilkan area warna datar berdasarkan bentuk gambar aslinya. Untuk keterangan lebih lanjut tentang fungsi kontras/ambang batas yang mulus ini, lihat kontras non-linearitas sigmoid. Terakhir, tingkat highlight-nya disesuaikan memakai "-evaluate" untuk mengalikan semua warna dengan tingkat highlight yang diinginkan, lalu "-roll" dipakai untuk menggeser posisinya ke dalam area berbentuk itu. Nah, karena highlight-nya abu-abu di atas hitam (hitam tetap tidak berubah), komposisi alpha 'Screen' dipakai untuk mencerahkan area non-hitam sesuai tingkat abu-abu tadi. Kini yang tersisa hanyalah menggelapkan sedikit bagian tepinya... |

    magick gel_highlight.png \
          \( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize \
             -blur 0x2  +level 60,100%  -alpha On \) \
          -compose Multiply  -composite  gel_border.png

[IM Output]
Perhatikan bahwa kali ini saya memakai "-shade" yang disinari secara vertikal untuk menggelapkan tepi, sehingga area yang ingin saya pertahankan tetap berwarna putih. Karena itu, setelah menyesuaikan grayscale-nya memakai penyesuaian level terbalik dan memulihkan transparansi yang disimpan lewat metode alpha extract, saya bisa memakai komposisi alpha 'Multiply' untuk menggelapkan tepi yang terkena efek. Mari kita rampungkan tombol 'Gel' oval ini dengan sedikit teks dan efek bayangan... |

    magick gel_border.png \
            -font Candice  -pointsize 24  -fill white  -stroke black \
            -gravity Center  -annotate 0 "Gel"  -trim -repage 0x0+4+4 \
            \( +clone -background navy -shadow 80x4+4+4 \) +swap \
            -background none  -flatten    gel_button.png

[IM Output]


Efek "Aqua" atau "Bubble"

Anda juga bisa menyesuaikan tint "-shade" 3-D penuh (dengan pencahayaan 30 derajat) untuk menghasilkan efek air "Aqua". Namun untuk itu kita perlu melakukan penyesuaian histogram dengan cara yang mirip seperti di program grafis GUI seperti "Gimp" dan "Photoshop". Saya akan mengerjakannya pelan-pelan selangkah demi selangkah lebih dulu supaya Anda bisa melihat langkah-langkah yang saya ikuti. Pertama mari kita buat gambar yang akan dipakai, dalam hal ini huruf A yang melengkung. |

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 72  label:A  -trim +repage \
          -bordercolor None -border 1x1 \
          aqua_shape.png

[IM Output]
Perhatikan bahwa saya menambahkan border transparan setebal satu piksel di sekeliling gambar. Ini membuat langkah pemrosesan berikutnya sedikit lebih mudah. Sekarang kita perlu menghasilkan shade membulat dari gambar berbentuk ini. |

  magick aqua_shape.png \
          -alpha Extract -blur 0x8  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          aqua_shade.png

[IM Output]
Baris aneh yang berurusan dengan alpha background itu bertugas mengembalikan warna tersembunyi pada area transparan menjadi abu-abu nada tengah, supaya tidak memengaruhi normalisasi warna. Ini bisa sangat penting. Sekarang kita ubah shade tadi menjadi 'efek pencahayaan' yang sekilas mirip cara cahaya terdistorsi oleh gelembung air atau kaca. |

  magick aqua_shade.png \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          aqua_lighting.png

[IM Output]
Fungsi polinomial inilah yang dipakai untuk penyesuaian kurva pada gambar. Fungsi inilah yang memberi efek keseluruhannya, dan menentukannya bisa sulit. Untuk itu saya meneruskan titik-titik kendali yang diperlukan bagi 'kurva' ini ke skrip shell pendukung IM bernama "**im_fx_curves**". Skrip itu lalu mengembalikan 'koefisien' bagi persamaan polinomial yang diperlukan untuk 'kurva' yang cocok dengan titik-titik kendali tersebut.

  im_fx_curves -c -p  0,30  100,80  50,50  80,50  > aqua_coeffs.txt

[Gnuplot] | | | [Coeffs]

Penyesuaian terakhir pada efek pencahayaan ini adalah membuat tepi efeknya lebih gelap. |

  magick aqua_lighting.png \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          aqua_light+edge.png

[IM Output]
Dan overlay shading-nya selesai. Yang tersisa hanyalah menerapkannya pada gambar asli, memakai komposisi HardLight. |

  magick aqua_shape.png aqua_light+edge.png \
          -compose Hardlight -composite   aqua_result.png

[IM Output]
Perhatikan bahwa warna keseluruhan gambar hasil akhirnya sebenarnya adalah warna asli bentuk aslinya. Bahkan ini bisa diterapkan pada gambar berwarna-warni tanpa masalah sama sekali. Jadi mari kita ulangi semua langkah di atas, termasuk pembuatan gambar bentuk awalnya, dalam satu perintah saja.

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 96  label:'Aqua Text' -trim +repage \
          \
          \( +clone -bordercolor None -border 1x1 \
             -alpha Extract -blur 0x8  -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 \
          \) \
          -compose Hardlight -composite  aqua_text.png

[IM Output]

Kalau Anda cermati perintah di atas, terlihat bahwa semua langkah yang tadi diuraikan diterapkan untuk menghasilkan gambar pencahayaan, yang kemudian dikomposisikan ke gambar aslinya.


Bintang dan komet yang bisa di-tile

Saya ingin membuat tile berisi medan bintang acak (dengan bintang-bintang beragam intensitas) untuk berbagai keperluan. Berikut hasil dari upaya saya yang pelan-pelan membaik. Sebuah gambar noise acak dipakai untuk menipiskan dirinya sendiri dan menghasilkan pola bintik. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 5% \
          -negate -channel RG -separate +channel \
          -compose multiply -composite   speckles.gif

[IM Output]
Pola ini menjadi dasar efek animasi kilauan, sekaligus titik awal bagi efek lain. Misalnya, untuk membuat bintang kita perlu memodifikasi pola 'bintik' acaknya sedikit lagi supaya hasilnya lebih realistis. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars.gif

[IM Output]
Perhatikan bahwa saya mengalikan bukan hanya mask bintiknya (kanal 'R') melainkan juga gambar intensitas bintang (kanal 'G') dua kali. Ini menghasilkan penurunan kuadratik pada intensitas piksel, sehingga bintang yang redup lebih banyak daripada yang terang, persis seperti langit malam sungguhan. Setelah itu kita memperbesar ukuran bintangnya sesuai intensitas masing-masing dengan blur. Ini menghasilkan efek yang mirip bintang yang terbakar pada pelat foto astronom, sehingga tampak makin realistis. Semakin besar nilai blur-nya, semakin besar pula efeknya. "-contrast-stretch" di akhir mengembalikan hasilnya agar terlihat lagi. Dengan memakai dua gambar noise acak (satu untuk mask, satu lagi untuk warna bintang), kita bisa menghasilkan bintang berwarna acak, bukan sekadar bintang grayscale. |

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( xc: +noise Random \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars_colored.gif

[IM Output]
Namun ini mungkin masih perlu dikerjakan lebih lanjut, sebab kita perlu memangkatkan dua intensitas warnanya secara langsung alih-alih sekadar mengalikannya terhadap distribusi linear. Meski begitu cara ini berhasil, dan memberi titik awal bagi pengembangan selanjutnya. Perhatikan bahwa warnanya tidak harus acak, tetapi bisa saja diambil dari gambar lain untuk bintang-bintangnya. Misalnya, warna bintang itu sendiri bisa bersumber dari gambar yang nanti dipakai sebagai latar belakang akhir. Kini setelah punya pembangkit pemandangan bintang, saya cukup memakai "-motion-blur" untuk membuat hamparan bintang jatuh! |

  magick -size 100x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -motion-blur 0x20+45 -normalize \
          star_fall.gif

[IM Output]
Tentu saja kita ingin bintangnya lebih sedikit dan 'penurunan' intensitasnya tidak sekuat itu. Dengan distorsi polar pada gambarnya, kita bisa membuat komet-komet melesat atau berpilin menuju satu titik! |

  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-90 -normalize \
          +distort Polar 0 +repage  star_inward.gif
  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-60 -normalize \
          +distort Polar 0 +repage   star_spiral.gif

[IM Output]

[IM Output]
Di sini kita mem-blur gerak bintang-bintang ke enam arah (berpasangan) lalu menggabungkannya untuk menciptakan hamparan 'semburan bintang', seperti yang muncul pada lensa kaca. |

  magick -size 100x100 xc: +noise Random -channel R -threshold .2% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile  -blur 0x.3 \
          \( -clone 0  -motion-blur 0x10+15  -motion-blur 0x10+195 \) \
          \( -clone 0  -motion-blur 0x10+75  -motion-blur 0x10+255 \) \
          \( -clone 0  -motion-blur 0x10-45  -motion-blur 0x10+135 \) \
          -compose screen -background black -flatten  -normalize \
          star_field.gif

[IM Output]
Perhatikan bagaimana bintang yang lebih redup hanya menghasilkan titik kecil dan nyaris tidak membentuk 'semburan bintang', sedangkan bintang terang yang lebih besar menghasilkan 'semburan bintang' yang sangat lebar. Nah, kalau saya bisa menemukan cara menambahkan blur bertipe 'sinc()' supaya muncul 'cincin' flare di sekeliling bintang-bintang paling terang juga, kita akan punya pembangkit medan bintang yang hebat. Tambahkan latar belakang plasma dan kita bahkan bisa menghasilkan foto astronomi palsu berupa nebula dan awan gas. Dengan menggabungkan yang di atas dan animasi kilauan plasma, Anda bisa membuat sekumpulan bintang yang tampak seperti hiasan Natal. |

  magick -size 100x100 xc: +noise Random -separate \
          null: \
            \( xc: +noise Random -separate -threshold 50% -negate \) \
            -compose CopyOpacity -layers composite \
          null: \
            plasma:red-firebrick plasma:red-firebrick plasma:red-firebrick \
            -compose Screen -layers composite \
          null:  \
            \( xc: +noise Random -channel R -threshold .08% \
              -negate -channel RG -separate +channel \
              \( +clone \) -compose multiply -flatten \
              -virtual-pixel tile  -blur 0x.4 \
              \( -clone 0  -motion-blur 0x15+90  -motion-blur 0x15-90 \) \
              \( -clone 0  -motion-blur 0x15+30  -motion-blur 0x15-150 \) \
              \( -clone 0  -motion-blur 0x15-30  -motion-blur 0x15+150 \) \
              -compose screen -background black -flatten  -normalize \) \
            -compose multiply -layers composite \
          -set delay 30 -loop 0 -layers Optimize       stars_xmas.gif

[IM Output]
Teknik di atas baru permulaan dari apa yang bisa dicapai. Dengan beberapa teknik animasi sederhana, kilauan dan flare acak dapat dibuat lalu ditambahkan ke gambar. Satu contoh sederhananya disajikan di contoh animasi GIF, memakai skrip shell sederhana "star_field " untuk menghasilkan semburan bintangnya. Apa yang bisa Anda lakukan dengan pembangkit bintang ini? Tantangan:

  • Hasilkan kilauan alih-alih bintang. Hamparan bintik awalnya perlu dibatasi oleh sebuah mask (misalnya dengan perkalian). Kilauan maupun bintang kemudian bisa ditimpakan ke gambar memakai komposisi 'screen'.
  • Pakai 'hamparan bintik' ber-mask untuk menghasilkan semburan bintang yang akan ditimpakan. Dengan mem-mask benihnya alih-alih semburan bintang yang utuh, 'sinar' semburannya bisa keluar dari area ber-mask dan menimpa bagian gambar yang lain. Artinya, sinarnya tidak sekadar 'terpotong'.
  • Buat animasi dari semburan bintang acak. Ini mungkin menuntut Anda menganimasikan satu hamparan semburan bintang (barangkali dengan sinarnya berputar).
  • Dengan membuat beberapa animasi semburan bintang, Anda bisa menggabungkannya menjadi rangkaian semburan bintang yang saling bertindihan dari lokasi berbeda-beda.
  • Temukan satu titik 'benih' pada bagian paling terang gambar dengan peregangan histogram dan ambang batas. Lalu pilih piksel satu per satu sampai ada yang mengenai area ber-mask.
  • Membuat bintang di tepi sebuah bentuk yang di-shade rata.

Kalau Anda berhasil menyelesaikan salah satu tantangan di atas atau memakai pembangkit bintang ini untuk keperluan lain, beri tahu saya dan seluruh komunitas IM.


Flare radial

Percobaan dalam menghasilkan flare radial. Perhatikan bahwa lebar gambar awal sebelum distorsi polar pada dasarnya menentukan jumlah sinar yang akan dihasilkan.

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -scale 100x100\!                                +write flare_1a.png \
          \( -size 100x100 gradient:'gray(100%)' -sigmoidal-contrast 10x50% \) \
          -colorspace sRGB -compose hardlight -composite  +write flare_1b.png \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          flare_1_final.png

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

Perhatikan bagaimana saya memakai "+write" untuk menyimpan gambar antara agar bisa ditampilkan. Ini teknik debugging yang diuraikan di pemrosesan gambar rumit dan debugging. Berikut contoh lain yang memakai beberapa overlay untuk menghasilkan flare yang tampak berbeda. Perhatikan teknik yang dipakai untuk menghasilkan gambar antara bagi debugging sekaligus gambar contoh yang menunjukkan langkah-langkahnya.

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -size 100x99 xc:black -append -motion-blur 0x35-90 \
          \( -size 100x50 gradient:'gray(0)' \
             -evaluate cos .5 -sigmoidal-contrast 3,100% \
             -size 100x50 xc:'gray(0)' -append \) \
          \( -size 1x50 xc:'gray(0)' \
             -size 1x1 xc:'gray(50%)' \
             -size 1x49 xc:'gray(0)' \
             -append -blur 0x2 -scale 100x100\! \) \
          \
          -scene 10 +write flare_2%x.png \
          \
          -background 'gray(0)' -compose screen -flatten +write flare_2f.png \
          \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          -colorspace sRGB flare_2_final.png

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

Masalah utama memakai distorsi polar untuk menghasilkan gambar flare adalah sinarnya melebar seiring jari-jari, padahal sebenarnya kita ingin lebarnya tetap kira-kira sama sambil meredup, atau setidaknya menyempit. Gagasan dan petunjuk sangat diterima Pewarnaan tint juga bisa penting pada jenis gambar seperti ini. Sebagai contoh, di sini saya memberi tint pada warna nada tengah dengan biru. |

  magick flare_2_final.png  -fill SkyBlue  -tint 100%  flare_2_color.png

[IM Output]
Persentase yang dipakai untuk operasi "-tint" juga bisa dipakai untuk mengatur intensitas sinar dan cincin flare-nya, meski tidak banyak mengubah inti putih gambarnya. Contoh-contoh ini dikembangkan lebih jauh dalam diskusi Forum IM Using Radial Flare for a Mask.