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

Contoh penggunaan ImageMagick -- pembuatan kanvas

Kanvas digunakan oleh ImageMagick sebagai gambar awal untuk digambari, sebagai latar belakang untuk menimpakan gambar yang memiliki area transparan, atau bahkan sekadar sebagai bagian dari pemrosesan gambar pada umumnya. Kanvas bisa berupa satu warna polos, rentang warna, atau bahkan tile dari gambar yang lebih kecil. Di sini kita akan melihat sebagian saja dari metode yang dapat dipakai untuk menghasilkan berbagai macam gambar kanvas.


Kanvas warna polos

Pembuatan langsung

Membuat kanvas dengan warna dan ukuran tertentu sangatlah mudah. Cukup tentukan "-size" (bawaannya "1x1" bila ukuran tidak diberikan), lalu gunakan "canvas:" untuk menghasilkan kanvas dengan warna yang diberikan. Jika warna tidak ditentukan, kanvas 'white' yang dihasilkan. Sebagai contoh... di sini saya membuat kanvas berwarna 'khaki'. |

  magick -size 100x100 canvas:khaki  canvas_khaki.gif

[IM Output]
Yang lebih umum adalah format singkatnya (dan yang lebih tradisional), "xc:" (yang dulu berarti "X Constant Image"). Inilah yang biasanya saya pakai. Sebagai contoh, berikut gambar yang menggunakan warna X window 'wheat'. |

  magick -size 100x100 xc:wheat  canvas_wheat.gif

[IM Output]
Dengan sedikit trik pengubah pembacaan gambar kita bahkan bisa menentukan gambar kanvas warna polos sebagai satu argumen tunggal. Teknik ini berarti Anda dapat menentukan gambar kanvas 'xc' dengan ukuran dan warna tertentu sebagai satu argumen 'gambar masukan' bagi banyak skrip ImageMagick. |

  magick 'xc:Salmon[100x100!]'  canvas_salmon.gif

| Tanda '!' diperlukan karena angka tersebut adalah nilai pengubahan ukuran; tanpanya Anda tidak mendapatkan ukuran yang diminta bila ukurannya tidak persegi.
[IM Output]
Jika kanvas sudah telanjur dibuat tetapi dibutuhkan dalam warna lain, warna itu dapat diganti menggunakan operator "-opaque". |

  magick canvas_khaki.gif -fill tomato -opaque khaki canvas_tomato.gif

[IM Output]
Satu piksel dari gambar yang ada bahkan bisa diambil, lalu diperbesar ke ukuran kanvas yang diinginkan. Kita memakai "-scale" untuk pengubahan ukuran satu piksel yang sederhana dan cepat. Di sini kita mengambil warna mawar dari gambar bawaan "rose:". |

  magick rose: -crop 1x1+40+30 +repage -scale 100x100\! canvas_rose_red.gif

[IM Output]

Membuat gambar berukuran sama

Salah satu teknik paling mendasar saat menggunakan ImageMagick adalah membuat kanvas yang berukuran sama dengan suatu gambar yang ada. Ini dapat dilakukan dengan mengonversi gambar yang ada itu menjadi kanvas yang dibutuhkan, sambil mempertahankan ukuran asli gambar. Umumnya bukan hanya ukuran gambar yang perlu dipertahankan, melainkan juga seluruh metadata gambar. Termasuk di dalamnya label, komentar, profil warna, jeda waktu (delay), serta kompresi dan kedalaman penyimpanan. Metadata ini bisa penting jika informasi tersebut hendak dituliskan pada kanvas yang baru dikosongkan, atau jika gambar asli nantinya ditimpakan ke kanvas baru dan informasi itu perlu dipertahankan. Tentu saja IM menyediakan banyak sekali cara untuk melakukannya, biasanya sebagai efek samping penggunaan berbagai operasi gambar. Hanya sedikit yang penggunaannya benar-benar jelas dalam mengosongkan gambar menjadi satu warna polos. Di sebelah kiri adalah gambar uji... Jangan pusingkan bagaimana saya sebenarnya membuat gambar ini; itu tidak penting untuk latihan kita. Saya merancangnya agar berisi beragam warna, transparansi, dan fitur lain, khusus supaya IM benar-benar teruji saat dipakai. Jika Anda memang penasaran dengan perintah yang dipakai untuk membuat gambar ini, lihat skrip khusus "generate_test" yang saya gunakan untuk membuatnya. [IM Output]

Menimpa dengan warna tertentu

Sejak IM v6.4.2-1, "+level-colors" dapat dipakai dengan satu warna tanpa koma untuk menyetel semua warna. |

  magick test.png  -alpha Opaque +level-colors Sienna  color_levelc.gif

[IM Output]
Perhatikan penggunaan operator "-alpha" untuk menyetel transparansi ke keadaan yang berguna sebelum (atau sesudah) warnanya ditambahkan. Sebagai alternatif, "-channel All" dapat dipakai untuk memastikan kanal transparansi ikut disetel oleh operasi penyetelan ulang warna tersebut. Teknik lain yang lebih lama adalah menggunakan "-colorize" untuk menimpakan warna isian dengan nilai yang sepenuhnya buram. Namun sebelum IM v6.7.9 operator ini tidak mengubah kanal alpha gambar aslinya, jadi sebaiknya nonaktifkan dulu kanal alpha dengan "-alpha Off", atau jadikan buram dengan "-alpha Opaque" meskipun tanpa itu pun hasilnya akan sama. |

  magick test.png -alpha off -fill Chocolate -colorize 100%
color_colorize.gif

| Perhatikan bahwa "-alpha Off" (atau padanan lamanya "-alpha off") hanya menonaktifkan kanal alpha. Jika sesudahnya kanal itu dinyalakan kembali dengan On, kanal alpha asli (yang tetap tersimpan) akan dipulihkan. Sebelum IM v6.7.9, alpha tetap dipertahankan saat menggunakan "-colorize".
[IM Output]
Sejak IM v6.4.3-0, operator "-sparse-color" dapat dipakai untuk menyetel suatu titik ke warna yang diinginkan, lalu membiarkannya menyebar menutupi seluruh gambar, dengan hampir semua metode pewarnaan yang disediakannya (lihat Sparse Points of Color di bawah). |

  magick test.png  -alpha Off \
          -sparse-color Voronoi '0,0 Peru' color_sparse.gif

[IM Output]
Cara yang lebih umum adalah menggunakan "-draw" untuk langsung menyetel ulang semua warna pada gambar saat ini menjadi warna "-fill" yang berlaku. |

  magick test.png -fill Tan -draw 'color 0,0 reset' color_reset.gif

[IM Output]
Inilah metode yang direkomendasikan pada ImageMagick versi 5.
Keluhan utama terhadap semua metode 'sederhana' di atas adalah tak satu pun yang sekadar menyetel ulang gambar ke warna "-background" saat ini. Kumpulan metode berikutnya memanfaatkan komposisi alpha untuk memaksa berbagai operator mengganti gambar dengan warna yang diinginkan. Teknik multi-gambar ini bekerja dengan operator yang menggunakan "-compose". Misalnya, gunakan "-flatten" (lihat contoh Meratakan ke latar belakang), yang membuat kanvas menggunakan warna "-background". |

  magick test.png   -background Wheat \
            -compose Dst   -flatten   color_flatten.gif

[IM Output]
Contoh di atas memakai metode compose 'Dst' agar hanya kanvas latar belakang yang dibaca dan warna piksel gambar asli diabaikan. Jika yang Anda inginkan hanyalah mengambil metadata gambar asli (misalnya data komentar atau label) tetapi mengganti gambarnya sendiri dengan kanvas berwarna dan berukuran tertentu, operator "-extent" (lihat Extent, penyesuaian ukuran gambar secara langsung) mungkin solusi terbaik. Sekali lagi metode compose Dst' dipakai agar data piksel gambar asli diabaikan, sehingga hanya warna "-background" yang digunakan. |

  magick test.png   -background LemonChiffon \
            -compose Dst   -extent 100x100   color_extent.gif

[IM Output]
Atau gunakan "-border" (lihat Menambahkan border), dengan "-bordercolor" sebagai sumber warnanya. |

  magick test.png   -bordercolor Khaki \
            -compose Dst   -border 0   color_border.gif

[IM Output]
Metode terakhir ini punya kelebihan tambahan: kanvas gambar juga dapat sedikit diperbesar relatif terhadap ukuran gambar aslinya. | Metode pembuatan kanvas dengan "-border" tidak bekerja pada versi IM sebelum 6.1.4. Sebelum itu, latar belakang yang dihasilkan operator "-border" bukanlah warna polos sederhana, melainkan kanvas hitam yang dikelilingi warna border. Tidak begitu berguna.
Metode pembuatan kanvas yang lebih luwes (tetapi sangat lambat) disediakan oleh operator "FX, operator rakitan sendiri". Kanal transparansi gambar masukan juga perlu dimatikan karena secara bawaan "-fx" tidak menyentuh kanal transparansi. |

  magick test.png -alpha off -fx Gold  color_fx_constant.gif

[IM Output]
Operator "-fx" bahkan memungkinkan sedikit matematika warna. Misalnya, bagaimana kalau warna gold yang 70% lebih gelap... |

  magick test.png -alpha off -fx "Gold*.7"  color_fx_math.gif

[IM Output]
Semua metode di atas tidak hanya dapat mengisi dengan warna yang sepenuhnya buram, tetapi juga dengan warna semitransparan. Meski begitu, sebaiknya pastikan dulu gambarnya memiliki kanal transparansi. Di sini misalnya kita membuat kanvas dengan warna merah semitransparan. Namun ketika ditimpakan pada latar belakang halaman web yang 'kebiruan', kita mendapat warna ungu kemerahjambuan. |

  magick test.png -alpha set -fill '#FF000040' -draw 'color 0,0 reset' \
            color_semitrans.png

[IM Output]
Perhatikan pula bahwa saat menggunakan operator "-fx" dengan transparansi, aturlah "-channel" agar keempat kanal warna 'RGBA' ikut diubah.

Mengosongkan gambar dengan warna yang diambil

Mengosongkan gambar menggunakan warna dari gambar aslinya juga mungkin, meski bisa sedikit rumit. Teknik ini berguna saat Anda ingin memakai piksel tertentu sebagai 'warna latar belakang'. Misalnya piksel 0,0 adalah pilihan yang umum.[IM Output] Pada contoh-contoh berikut saya akan memilih warna dari berbagai piksel gambar mawar bawaan (kiri) sambil mengosongkan gambarnya. Metode yang paling jelas (walau lambat) adalah langsung menggunakan "FX, operator rakitan sendiri" untuk memilih piksel yang warnanya dipakai mengosongkan gambar. |

  magick rose: -fx 'p{0,0}'  color_pick_fx.png

[IM Output]
Namun ini bisa dipercepat dengan memilih pikselnya sekali saja. Caranya, gunakan formula fx sebagai argumen untuk Sparse Color. Kelihatannya memang tidak lebih sederhana, tetapi jauh lebih cepat. |

  magick rose: -sparse-color voronoi '0,0 %[pixel:p{40,30}]'
color_pick_sparse.png

[IM Output]
Metode lain yang lebih kompleks adalah memangkas satu piksel itu lalu men-tile-nya ke seluruh gambar, memakai teknik yang dijelaskan rinci nanti di Tiling dengan gambar yang sudah ada di memori |

  magick rose: \( +clone -crop 1x1+64+22 -write MPR:pixel +delete \) \
          -fill mpr:pixel  -draw 'color 0,0 reset' \
          color_pick_draw.png

[IM Output]
|

  magick rose: -set option:distort:viewport '%wx%h+0+0' \
          -crop 1x1+10+25 +repage     -distort SRT 0 \
          color_pick_distort.png

[IM Output]

Teknik kanvas lainnya

Ada banyak cara lain untuk menghasilkan kanvas dengan warna yang sangat spesifik, tetapi cara-cara itu cukup membingungkan. Tanpa komentar yang memadai, bisa jadi tidak jelas apa yang sebenarnya dilakukan saat skrip IM itu dibaca kembali berbulan-bulan atau bertahun-tahun kemudian. Saya tidak merekomendasikan teknik-teknik ini, tetapi berguna untuk diketahui jika Anda memakai versi IM lama yang kurang luwes. Kanvas hitam. Gunakan "-threshold", lalu matikan kanal transparansinya. Secara tradisional kanvas hitam dapat dibuat dengan cara berikut.

  magick test.png -threshold 100% -alpha off  black_threshold.png

[IM Output]
Memberikan argumen yang sama untuk titik 'black' dan 'white' pada operator "-level" akan memberi efek yang sama.

  magick test.png -level 100%,100% -alpha off  black_level.png

[IM Output]
Operator "-fx" menyediakan cara yang lebih jelas untuk membuat kanvas hitam, yaitu mengosongkan semua piksel ke nol. Namun kanal alpha juga perlu disetel ulang agar sepenuhnya buram.

  magick test.png  -fx 0 -alpha off   black_fx.png

[IM Output]
Namun versi "-evaluate"-nya semestinya lebih cepat, terutama pada gambar besar.

  magick test.png  -evaluate set 0  -alpha off  black_evaluate.png

[IM Output]
Operator "-gamma" juga bisa disalahgunakan untuk membuat gambar menjadi hitam seluruhnya.

  magick test.png  -gamma 0  -alpha off  black_gamma.png

[IM Output]
[IM Output] Cara yang kurang kentara adalah mem-'posterize' gambar dengan jumlah level warna terlalu sedikit, sehingga hanya satu warna yang terpakai: hitam. |

  magick test.png  -posterize 1 -alpha off black_posterize.png

Operator alpha. Pastikan gambar sepenuhnya transparan, lalu 'extract' (ekstrak) mask gambarnya menggunakan operator alpha.

  magick test.png  -alpha transparent -alpha extract  black_alpha.png

[IM Output]
Kanvas putih. Cara tradisionalnya lagi-lagi memakai "-threshold". Namun nilainya harus bilangan negatif, sekadar memastikan semua warna dipetakan ke putih di semua versi IM.

  magick test.png  -threshold -1 -alpha off   white_threshold.png

[IM Output]
Memberikan argumen yang sama untuk titik 'black' dan 'white' pada operator "-level" akan memberi efek yang sama.

  magick test.png -level -1,-1 -alpha off  white_level.png

[IM Output]
Tentu saja nilai piksel juga bisa disetel langsung dengan operator "-fx".

  magick test.png -fx 1.0 -alpha off  white_fx.png

[IM Output]
Namun versi "-evaluate"-nya semestinya lebih cepat, terutama pada gambar besar.

  magick test.png  -evaluate set 100%  -alpha off  white_evaluate.png

[IM Output]
[IM Output] Atau negasikan (negate) salah satu metode pembuatan kanvas hitam. |

  magick test.png -posterize 1 -alpha off -negate  white_posterize.png

Operator alpha. Pastikan gambar sepenuhnya buram (tanpa transparansi), lalu 'extract' (ekstrak) mask gambarnya menggunakan operator alpha.

  magick test.png  -alpha opaque -alpha extract  white_alpha.png

[IM Output]
Kanvas transparan. Kanvas yang mungkin paling penting untuk dibuat dari gambar yang ada adalah kanvas transparan. Anda dapat menggambar dan menambahkan berbagai hal ke kanvas ini, merapikannya sesuai keinginan, lalu menimpakannya ke gambar asli. Cara tercepat dan termudah adalah langsung menyuruh IM mengosongkan gambar menjadi transparan, memakai operator "-alpha transparent" (ditambahkan di IM v6.4.3-7).

  magick test.png  -alpha transparent trans_alpha.png

Namun karena ini tambahan yang sangat baru, kemungkinan belum tersedia luas. [IM Output]
Kanvas 'hitam' yang sepenuhnya transparan dapat kita buat dengan operator komposisi alpha 'Clear', bersama gambar timpaan apa pun (di sini "null:" satu piksel) karena gambar itu akan diabaikan.

  magick test.png  null: -alpha set -compose Clear -composite -compose Over \
          trans_compose.png

[IM Output]
Di sini kita memakai operator "-draw matte" untuk mengganti nilai kanal matte (transparansi) dengan nilai transparansi dari warna "-fill" saat ini. Dalam kasus ini, jadikan sepenuhnya transparan.

  magick test.png -alpha set -fill none  -draw 'matte 0,0 reset'
color_matte.png

[IM Output]
Kita juga bisa melakukannya secara lebih langsung dengan operator "-fx".

  magick test.png -alpha set -channel A -fx 0 +channel  trans_fx.png

[IM Output]
Tentu saja versi "-evaluate"-nya semestinya lebih cepat, terutama pada gambar besar.

  magick test.png  -alpha set -channel A -evaluate set 0 +channel \
          trans_evaluate.png

[IM Output]
Cara lain untuk membuat gambar sepenuhnya transparan adalah memakai "-threshold", tetapi lagi-lagi dengan membatasi efeknya hanya ke kanal transparansi.

  magick test.png -channel A -threshold -1 +channel trans_threshold.png

[IM Output]
Sebenarnya dalam kasus ini kita secara matematis berurusan dengan kanal 'matte', memakai threshold untuk menyetelnya ke nilai maksimum, bukan nol seperti yang kita lakukan pada operator "-fx". Itulah sebabnya '-1' yang dipakai di atas, bukan sesuatu seperti 101%'. Pada banyak hasil gambar di atas, warna RGB asli dari gambar aslinya masih ada; warna itu hanya dibuat transparan. Sebagai contoh, di sini kita membaca salah satu gambar di atas dan meminta IM mematikan kanal matte/alpha pada gambar agar warnanya terlihat kembali. |

  magick trans_fx.png -alpha off  trans_fx_alpha_off.jpg

Namun perhatikan bahwa tidak semua format file gambar, dan sangat sedikit operasi gambar, akan mempertahankan warna RGB semitransparan yang masih tersisa pada gambar hasil. [IM Output]
Seperti disinggung sebelumnya, dan layak diulang, banyak metode di atas mengandalkan gambar yang sudah memiliki kanal alpha. Jika belum ada, tambahkan dengan "-alpha On", tetapi kalau sudah begitu sekalian saja pakai operator "-alpha Transparent". Lihat contoh-contoh di Mengendalikan transparansi gambar. Pewarnaan kanvas lain-lain. Selain memakai warna tertentu, hanya operator "-gamma" yang benar-benar cukup luwes untuk menghasilkan kanvas dengan warna primer/sekunder apa pun. Pada dasarnya gunakan 0 untuk menolkan sebuah kanal, dan -1 untuk memaksimalkan nilai kanal. Sebagai contoh, di sini saya membuat kanvas kuning... |

  magick test.png  -gamma -1,-1,0  -alpha off  yellow_gamma.png

[IM Output]
Sejak IM v6.4.2, operator "+level" juga dapat dipakai untuk menyetel level abu-abu tertentu pada semua kanal warna. |

  magick test.png  +level 40%,40%  -alpha off  grey_level.png

[IM Output]


Gradien warna

Seperti terlihat di atas, kanvas warna polos cukup mudah dibuat. Tetapi kadang Anda ingin sesuatu yang lebih menarik. Salah satu operator pembuatan gambar yang sangat berguna adalah "gradient:". Sebagai contoh... |

  magick -size 100x100 gradient:  gradient.jpg

[IM Output]
Seperti yang terlihat, secara bawaan "gradient:" membuat gambar dengan putih di atas, hitam di bawah, dan gradasi abu-abu yang mulus di sepanjang tinggi gambar. Namun gradiennya tidak harus grayscale saja; Anda juga bisa membuat gradien warna lain dengan menentukan satu warna, atau keduanya.

  magick -size 100x100  gradient:blue              gradient_range1.jpg
  magick -size 100x100  gradient:yellow            gradient_range2.jpg
  magick -size 100x100  gradient:green-yellow      gradient_range3.jpg
  magick -size 100x100  gradient:red-blue          gradient_range4.jpg
  magick -size 100x100  gradient:tomato-steelblue  gradient_range5.jpg

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

Perhatikan bahwa bila hanya satu warna yang diberikan, warna keduanya adalah 'white' atau 'black', mana pun yang menghasilkan jarak warna terbesar dari warna yang diberikan. Karena itu 'blue' menghasilkan gradien 'blue-white', sedangkan 'yellow' menghasilkan gradien 'yellow-black'. Gradien 'red-blue' menunjukkan pita warna ungu yang jauh lebih gelap di tengahnya. Penggelapan ini disebabkan oleh ruang warna sRGB non-linear yang lebih gelap yang dipakai, terutama pada warna primer yang kuat. Lihat Memproses gambar nyata untuk detailnya. | _"gradient:" saat ini hanya memahami representasi warna sRGB ruang warna. Karena itu ia tidak bisa dipakai untuk menghasilkan gradien 'ungu' yang lebih cerah dan lebih benar dari warna 'red-blue' di ruang warna LAB linear.

Itu juga berarti gradien 'pelangi' multi-warna tidak bisa dibuat memakai ruang warna HSV.

Namun gradien semacam itu bisa 'diakali' dengan cukup mudah. Lihat Gradien di ruang warna lain di bawah.
| _Gradien saat ini belum bisa ditentukan pada sudut lain atau melibatkan lebih dari dua warna. Namun karena kemampuan ini adalah bagian integral dari gradien SVG, keadaan ini kemungkinan akan berubah, dengan perbaikan besar pada opsi gradien.

Beberapa gradien yang sangat cantik antara lain... |

  magick -size 10x120  gradient:snow-navy          gradient_ice-sea.jpg
  magick -size 10x120  gradient:gold-firebrick     gradient_burnished.jpg
  magick -size 10x120  gradient:yellow-limegreen   gradient_grassland.jpg
  magick -size 10x120  gradient:khaki-tomato       gradient_sunset.jpg
  magick -size 10x120  gradient:darkcyan-snow      gradient_snow_scape.jpg

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
| _Sejak IM v6.3.1 algoritma pembuatan gradien menghasilkan warna yang seragam secara horizontal, sehingga semua piksel pada tiap baris gambar diberi warna yang sama. Artinya, satu warna per baris.

Sebelum versi itu, operator "gradient:" bekerja dengan mengabaikan lebar gambar dan sekadar memberikan inkremen warna berikutnya, baris demi baris dari pojok kiri atas ke kanan bawah gambar.

Akibatnya gradiennya memang dominan vertikal, seperti sekarang, tetapi tidak sempurna. Biasanya hal ini hanya penting pada kasus khusus seperti gambar uji, dan untuk dipakai pada pemetaan gambar.

_

Perlu dicatat, perilaku gradien dapat dipengaruhi oleh define berikut:

gradient:angle=angle (dalam derajat) Untuk gradien linear, ini menentukan arah gradien dari color1 ke color2 searah jarum jam relatif terhadap utara (atas). Untuk gradien radial, ini menentukan rotasi gradien searah jarum jam dari orientasi X-Y normalnya. Didukung di Imagemagick 6.9.2-5.
gradient:bounding-box=WxH+X+Y Membatasi gradien ke wilayah yang lebih besar atau lebih kecil dari dimensi gambar. Jika wilayah yang didefinisikan bounding box lebih kecil dari gambar, color1 menjadi warna latar belakang. Didukung di Imagemagick 6.9.2-5.
gradient:center=x,y Menentukan koordinat titik pusat gradien radial. Bawaannya pusat gambar. Didukung di Imagemagick 6.9.2-5.
gradient:direction=value Menentukan arah gradien linear menuju atas/bawah/kiri/kanan atau pojok diagonal. Pilihannya: NorthWest, North, Northeast, West, East, SouthWest, South, SouthEast. Didukung di Imagemagick 6.9.2-5.
gradient:extent=value Menentukan bentuk gradien radial yang berpusat di gambar. Pilihannya: Circle, Diagonal, Ellipse, Maximum, Minimum. Circle dan Maximum menggambar gradien radial melingkar bahkan untuk gambar berbentuk persegi panjang, dengan radius sama dengan yang lebih besar antara setengah lebar dan setengah tinggi gambar. Opsi Circle dan Maximum keduanya setara dengan gradien radial bawaan. Opsi Minimum menggambar gradien radial melingkar bahkan untuk gambar berbentuk persegi panjang, dengan radius sama dengan yang lebih kecil antara setengah lebar dan setengah tinggi gambar. Opsi Diagonal menggambar gradien radial melingkar bahkan untuk gambar berbentuk persegi panjang, dengan radius sama dengan setengah diagonal gambar. Opsi Ellipse menggambar gradien radial elips untuk gambar berbentuk persegi panjang, dengan radius sama dengan setengah lebar dan setengah tinggi gambar. Didukung di Imagemagick 6.9.2-5.
gradient:radii=x,y Menentukan radius x dan y gradien. Jika radius x dan radius y sama, bentuk gradien radialnya lingkaran. Jika berbeda, bentuknya elips. Nilai bawaannya adalah maksimum dari setengah lebar dan setengah tinggi gambar. Didukung di Imagemagick 6.9.2-5.
gradient:vector=x1,y1,x2,y2 Menentukan arah gradien linear dari vector1 (x1,y1) ke vector2 (x2,y2). Color1 (fromColor) akan berada di posisi vektor x1,y1 dan color2 (toColor) di posisi vektor x2,y2. Didukung di Imagemagick 6.9.2-5.

Gradien radial

Sejak IM v6.4.4, gambar gradien radial juga dapat dibuat dengan cara serupa. |

  magick -size 100x100 radial-gradient:  rgradient.jpg

[IM Output]
Perhatikan bahwa gradiennya berpusat di tengah gambar yang dihasilkan, dengan diameter yang disetel mengikuti ukuran X atau Y gambar yang lebih besar. Jadi jika ukuran gambarnya tidak persegi, Anda mendapat gradien radial yang 'terpotong'. |

  magick -size 100x60 radial-gradient:  rgradient_clip.jpg

[IM Output]
Ini memudahkan pembuatan gradien radial persegi dari pusat ke pojok, dengan membuat salah satu sisi 1.42 kali (akar kuadrat dari 2) lebih besar, lalu memangkasnya. |

  magick -size 100x142 radial-gradient: \
          -gravity center -crop 100x100+0+0 rgradient_crop.jpg

[IM Output]
Warna gradiennya sendiri mengikuti konvensi yang sama dengan generator gambar linear "gradient:" yang jauh lebih tua.

  magick -size 100x100  radial-gradient:blue              rgradient_range1.jpg
  magick -size 100x100  radial-gradient:yellow            rgradient_range2.jpg
  magick -size 100x100  radial-gradient:green-yellow      rgradient_range3.jpg
  magick -size 100x100  radial-gradient:red-blue          rgradient_range4.jpg
  magick -size 100x100  radial-gradient:tomato-steelblue  rgradient_range5.jpg

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

Gradien dengan transparansi

Sejak IM v6.2.9-8 operator pembuatan gambar "gradient:" (dan belakangan "radial-gradient:") memahami penggunaan warna transparan dan semitransparan. |

  magick -size 100x100 gradient:none-firebrick gradient_transparent.png

[IM Output]
| _Sebelum ImageMagick 6.5.4-7, gradien yang melibatkan transparansi penuh (seperti contoh terakhir) umumnya menghasilkan halo hitam.

Yang terjadi adalah gradien yang dibuat berjalan dari warna yang diberikan ke warna khusus 'none' alias hitam-transparan. Akibatnya warna bergeser menuju hitam semitransparan dulu sebelum menjadi sepenuhnya transparan.

Solusi masalah ini adalah membuat gradien transparansi lalu mewarnainya (Colorize) dengan warna yang diinginkan._
|

  magick -size 100x100 gradient:none-black \
          -fill firebrick -colorize 100% gradient_trans_colorize.png

[IM Output]

Gradien lewat penyesuaian histogram

Gradien non-linear dapat dibuat dengan menerapkan suatu bentuk penyesuaian histogram pada gradien linear. Misalnya, fungsi kontras sigmoidal bisa dipakai untuk membuat gradien yang tampak lebih alami. |

  magick -size 100x100 gradient: -sigmoidal-contrast 6,50% \
            gradient_sigmoidal.jpg

[IM Output]
Gradien jenis ini sangat cocok untuk membuat foto yang tumpang-tindih, karena menghilangkan perubahan gradien yang tajam di awal wilayah tumpang-tindih.

Gradien evaluate/function

Operator Evaluate dan operator Function yang berkerabat juga dapat dipakai untuk memodifikasi gradien linear sederhana. |

  magick -size 100x100 gradient: -evaluate cos 0.5 -negate \
            gradient_cosine.jpg

[IM Output]
Atau melangkah lebih jauh dan membuat puncak parabolik yang mulus di tengah gradien linear. |

  magick -size 100x100 gradient: -function Polynomial -4,4,0 \
            gradient_peak.jpg

[IM Output]
Atau pola pita atau riak... |

  magick -size 100x100 gradient: -function sinusoid 4,-90  \
            gradient_bands.jpg

[IM Output]
Kedua operator yang berkerabat dekat ini memungkinkan Anda memodifikasi gambar dan gradien berdasarkan kurva sinus, polinomial, logaritma, dan fungsi pangkat. Lihat Evaluate, fungsi matematika dan Function, evaluate multi-argumen untuk contoh lainnya.

Gradien terdistorsi

Gradien diputar

Meskipun metode Sparse Color 'Barycentric' (lihat di bawah) menyediakan cara praktis untuk membuat gradien pada sudut berapa pun, jika IM Anda lebih tua dari versi 6.4.3-0, mungkin perlu metode lain untuk membuat gradien diagonal atau diputar. Misalnya, dengan memperbesar gambar gradien (dikalikan akar kuadrat dari 2, atau 1.42), memutarnya 45 derajat, lalu memangkas gambar ke ukuran akhirnya, gradien diagonal bisa dibuat. |

  magick -size 142x142 gradient: -rotate -45 \
          -gravity center -crop 100x100+0+0 +repage \
          gradient_diagonal.jpg

[IM Output]
Sejak IM v6.3.5 ada cara yang jauh lebih cepat dan sederhana untuk membuat gradien yang diputar, yaitu memakai distorsi SRT. Misalnya, ini gradien 100 piksel yang diputar 60 derajat dalam gambar 100x100 piksel. |

  magick -size 100x100 gradient: -distort SRT 60 gradient_srt.jpg

[IM Output]
Ini memakai pengaturan bawaan Virtual Pixel, Edge untuk memastikan seluruh gambar tertutup oleh gradien yang diminta. Pengaturan tingkat lanjut Distort Viewport juga bisa dipakai untuk memetakan gradien ke gambar yang lebih besar, misalnya untuk dipakai pada foto yang tumpang-tindih.

Melengkungkan gradien

Namun metode distorsi yang sama bisa dipakai untuk jauh lebih banyak hal daripada sekadar rotasi. Gradien juga bisa dipelintir... |

  magick -size 100x100 gradient: -swirl 180 gradient_swirl.jpg

[IM Output]
Anda bisa memetakan ulang gradien menjadi bentuk trapesium. |

  magick -size 100x100 gradient: -rotate -90 \
          -distort Perspective '0,0 40,0  99,0 59,0  0,99 -10,99 99,99 109,99' \
          gradient_trapezoid.jpg

[IM Output]
Atau melengkungkan gradien menjadi busur dan lingkaran menggunakan operator distorsi umum... |

  magick -size 100x100 gradient: -distort Arc '180 0 50 0' \
          gradient_arc.jpg

[IM Output]
|

  magick -size 100x100 gradient: -distort Arc '360 0 50 0' \
          gradient_circle.jpg

[IM Output]
Meski begitu, "radial-gradient:" yang baru mungkin cara yang lebih sederhana untuk membuat gradien-gradien tadi. Gradien yang sangat berguna tetapi lebih sulit dibuat adalah gradien sudut polar. Bentuk persis gradien ini bergantung pada apakah gradiennya harus berpusat di gambar berukuran genap atau berukuran ganjil. Misalnya, distorsi Arc dapat dipakai untuk membuat gambar dengan dimensi piksel genap, dalam hal ini 76 piksel. |

  magick -size 1x1000 gradient: -rotate 90 \
          -distort Arc '360 -90 50 0' +repage \
          -gravity center -crop 76x76+0+0 +repage  gradient_angle_even.png

[IM Output]
Nilai '-90' di atas menentukan sudut 'diskontinuitas', tempat 'nol' dan 'maksimum' bertemu pada nilai yang sama. Nilai '50' harus lebih dari 1/2 ukuran gambar akhir hasil pangkasan. Perhatikan bagaimana saya memakai gradien yang jauh lebih panjang untuk membuat gambar yang lebih kecil. Ini memperbaiki ketepatan hasil secara keseluruhan, terutama saat gambarnya makin besar. Distorsi Polar yang berkerabat dekat juga bisa membuat gradien semacam ini, tetapi karena ia punya kendali atas posisi persis 'pusat' distorsi, Anda bisa memastikan ia membuat gambar gradien polar berukuran piksel ganjil dengan benar. Dalam hal ini gambar 75 piksel (radius = '36.5' ) |

  magick -size 1x1000 gradient: -rotate 90 \
          +distort Polar '36.5,0,.5,.5' +repage \
          -transverse  gradient_angle_odd.png

[IM Output]
Dua gambar terakhir mungkin tampak sangat mirip kecuali ukurannya, tetapi penanganan piksel paling tengahnya sedikit berbeda. Jika diperhatikan dari dekat, contoh terakhir memiliki satu piksel pusat abu-abu yang sempurna, sedangkan contoh sebelumnya tidak punya satu piksel pusat, melainkan empat. Ukuran akhir gambar ditentukan oleh nilai '36.5', yaitu setengah dari '75' piksel yang diinginkan. Offset '.5' adalah aspek penting untuk penanganan pusat polar yang benar. Perhatikan bahwa secara bawaan distorsi menempatkan diskontinuitas di bagian atas gambar; karena itu Transverse Warp mengoreksi sudut dan lokasi diskontinuitas agar cocok dengan hasil distorsi Arc. Berikut varian yang sedikit berbeda yang membuat gradien angular tetapi dengan mask lingkaran transparan. |

  magick -size 50x1000 gradient: -rotate 90 -alpha set \
          -virtual-pixel Transparent +distort Polar 49 +repage \
          -transverse  gradient_angle_masked.png

[IM Output]
Nilai '49' adalah radius dikurangi 1 karena secara bawaan distort menambahkan penyangga anti-aliasing 1 piksel di sekeliling gambar hasil. Dengan demikian gambar akhirnya 100x100 piksel.
Bentuk dan gradien melingkar dapat dilengkungkan untuk menghasilkan gradien non-linear yang menarik. Misalnya, melengkungkannya dengan distorsi Wave dapat menghasilkan gradien berbentuk kurang lebih segitiga. |

  magick -size 100x100 radial-gradient: \
          -background black -wave -28x200 -crop 100x100+0+0 +repage \
          gradient_triangle.jpg

[IM Output]
Atau bentuk aneh mirip burung, dihasilkan oleh distorsi polar di sepanjang tepi atas bentuk lingkaran. |

  magick -size 100x100 radial-gradient: \
          +distort Polar '49' +repage \
          gradient_bird.jpg

[IM Output]

Gradien lewat komposisi

Gradien juga dapat dimodifikasi dengan menggabungkannya lewat berbagai metode komposisi. Misalnya, metode compose Modulus_Add bisa dipakai untuk membuat gradien bergaya kerai (venetian blind). |

  magick -size 100x100 gradient: \( +clone +clone \) \
          -background gray50 -compose ModulusAdd -flatten \
          gradient_venetian.jpg

[IM Output]
Bahkan bisa juga secara diagonal. |

  magick -size 100x100 gradient: \( gradient: -rotate -90 \) \
          \( -clone 0--1 -clone 0--1 \) \
          -background gray50 -compose ModulusAdd -flatten \
          gradient_vent_diag.jpg

[IM Output]
Atau, dengan memadukan dua gradien warna polos memakai metode komposisi penyalinan kanal atau pencampuran matematis, Anda bisa membuat gradien colormap 2 dimensi yang penuh warna. |

  magick -size 100x100 gradient:yellow-blue \
          \( gradient:black-lime -rotate -90 \) \
          -compose CopyGreen -composite  gradient_colormap.jpg

[IM Output]

Gradien di ruang warna lain

Meskipun generator "gradient:" saat ini belum bisa membuat gradien langsung di ruang warna lain (hanya gambar gradien sRGB non-linear yang dibuat), gradien dapat dipindahkan ke ruang warna berbeda untuk menghasilkan efek menarik. Sebagai contoh...

  magick -size 30x600 xc:red -colorspace HSB \
          gradient: -compose CopyRed -composite \
          -colorspace RGB -rotate 90  gradient_rainbow.jpg

[IM Output]

Ini mula-mula mengonversi warna dengan saturasi tinggi ('red') ke ruang warna HSL; warna tersaturasi apa pun bisa dipakai. Ini menyetel kanal saturasi dan kecerlangan gambar ke nilai yang sesuai dengan benar. Setelah itu sebuah gradien dibuat dan disalin ke kanal 'Hue' (setara kanal 'red') dari gambar ruang warna HSL ini. Dan simsalabim, ketika kita meng-magick gambar HSL itu kembali ke RGB, kita mendapat gradien pelangi penuh berisi warna-warna tersaturasi penuh. Metode lain adalah membuat gradien dengan nilai yang pas untuk salah satu ruang warna ini, lalu mengubah ruang warna gambarnya (memakai "-set"). Ini mengubah ruang warna tanpa mengubah nilai warna yang kita buat di gambar. Kini saat dikonversi kembali ke RGB kita mendapat pelangi nilai yang sama.

  magick -size 30x600 gradient:'#FFF-#0FF' -rotate 90 \
          -set colorspace HSB -colorspace RGB \
          gradient_rainbow_2.jpg

[IM Output]

Hasilnya sebenarnya persis sama dengan metode sebelumnya, hanya sedikit lebih langsung: kita membuat nilai yang tepat untuk ruang warna yang dituju, lalu menyetel ruang warna tempat nilai-nilai itu berlaku. Di sini kita mengambil gradien angular ber-mask (lihat di atas) dan memetakannya ulang ke ruang warna HSB untuk membuat lingkaran rona warna. Merah (hue=0) diputar ke arah kanan, tempat ia biasa diletakkan (sudut 0 koordinat polar). |

  magick -size 100x300 gradient:'#FFF-#0FF' -rotate 90 \
          -alpha set -virtual-pixel Transparent +distort Polar 49 +repage \
          -rotate 90 -set colorspace HSB -colorspace RGB \
          gradient_hue_polar.png

[IM Output]
Contoh serupa dengan di atas adalah roda warna, yang dibuat lewat penggabungan gambar kanal dengan gradien Hue dan gradien Lightness sekaligus.

Gradien hasil pengubahan ukuran (resize)

Satu trik yang pernah diangkat oleh Glenn Randers-Pehrson adalah membuat gambar yang sangat kecil, dua piksel, lalu memperbesarnya ke ukuran gambar yang dibutuhkan memakai "-resize". Operator Resize berusaha menghaluskan gambar yang diperbesar agar tampak lebih baik pada skala yang lebih besar. Penghalusan inilah yang kita manfaatkan untuk membuat gradien non-linear. Sebagai contoh, di sini kita membuat gambar kecilnya memakai gambar 'portable bitmap' (format PBM) dan mengumpankannya ke IM untuk diperbesar. |

  echo "P1 1 2   0  1 " | \
  magick - -resize 100x100\!   gradient_resize.jpg

[IM Output]
| Sebagian shell seperti 'csh' dan variannya tidak bisa menangani karakter '!' pada pengaturan geometry resize di atas dengan baik -- bahkan di dalam tanda kutip. Karena itu karakter backslash '\' mungkin diperlukan. Harap berhati-hati.
Gradien yang dihasilkan tidak linear, dengan awal dan akhir yang halus menuju warna yang diberikan, sehingga warna-warna itu jauh lebih menonjol daripada pada gradien biasa. Fungsi persis yang diikuti gradien ini bergantung pada (dan mendekati) filter resampling persis yang dipakai resize. Cara sederhana membuat gambar dua piksel awal itu justru dengan gradient sendiri! Ini memungkinkan warnanya ditentukan langsung. Tentu itu membatasi Anda pada gradien vertikal, kecuali hasilnya ikut diputar. |

  magick -size 1x2  gradient:khaki-tomato \
          -resize 100x100\!   gradient_resize2.jpg

[IM Output]
Tentu saja Anda tidak terbatas pada satu dimensi dengan teknik ini. Di sini saya memakai 'portable greymap' empat piksel (format gambar PGM) untuk membuat gradien 2 dimensi. |

  echo "P2 2 2 2   2 1 1 0 " | \
  magick - -resize 100x100\!   gradient_resize3.jpg

[IM Output]
Seperti yang terlihat, gradien diagonal ini tidak begitu linear dibandingkan gradien diputar di atas. | Format gambar Network Portable Bitmap sangat serbaguna untuk membuat gambar dari skrip. Format ini layak dikenal sebagai sarana membuat atau memanipulasi data gambar.
Jika diamati saksama, terlihat pula bahwa gradiennya mulai dari pusat piksel yang diperbesar, dan tidak menutupi seluruh gambar dari tepi ke tepi. Ini menjadi lebih jelas jika kita memakai filter resize Triangle. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -filter triangle -resize 100x100\!   gradient_resize4.jpg

[IM Output]
Operator Resize menghaluskan warna di antara piksel-piksel ini sesuai pengaturan "filter resampling". Dengan menyetel filternya, gradien resize bisa dibuat memberi efek yang lebih tepi-ke-tepi. |

  magick -size 1x2  gradient: \
          -filter Cubic  -resize 100x100\!    gradient_resize5.jpg

[IM Output]
Berikut "gradien pelangi" kasar yang dibuat dengan teknik 'resize'.

  magick xc:black xc:red xc:yellow xc:green1 xc:cyan xc:blue xc:black \
          +append -filter Cubic -resize 600x30\! gradient_rs_rainbow.jpg

[IM Output]

Dengan metode ini, kombinasi dan urutan warna apa pun bisa dipakai untuk pembuatan gradiennya. Ini membuatnya sangat cocok untuk membuat tabel lookup warna.

Gradien lookup terinterpolasi

Untuk informasi lebih lanjut tentang pengaturan "-interpolate", lihat pengaturan interpolasi. Metode lain untuk membuat gradien adalah memakai pengaturan interpolasi yang khusus ini. Pengaturan ini menentukan warna piksel yang dikembalikan ketika lookup piksel bukan bilangan bulat sehingga tidak persis jatuh pada piksel tertentu. Interpolasi lalu menentukan warnanya berdasarkan piksel-piksel di sekitar titik lookup. Pengaturan bawaan 'bilinear', misalnya, menentukan warna secara linear untuk lookup yang jatuh di antara dua piksel.

  magick -size 600x30 xc:   \( +size xc:gold xc:firebrick +append \)  \
          -fx 'v.p{i/(w-1),0}'    gradient_interpolated.jpg

[IM Output]

Di sini posisi X lookup 'i/(w-1)' berjalan dari '0.0' hingga '1.0' di atas gambar dua piksel yang kedua. Bilangan pecahannya menghasilkan gradien linear sempurna, mirip seperti yang dilakukan "gradient:". Contoh di atas sebenarnya hampir setara (lihat gradien sempurna untuk bedanya) dengan memakai pewarnaan ulang gambar dengan Clut" untuk mewarnai ulang gambar gradien, memakai lookup terinterpolasi dari gambar dua warna itu.

  magick -size 30x600 gradient: -rotate 90 \
          \( +size xc:gold xc:firebrick +append \) -clut \
          gradient_clut_recolored.jpg

[IM Output]

Metode ini juga memungkinkan pembuatan gradien multi-warna.

  magick -size 30x600 gradient: -rotate 90  -interpolate Bicubic \
          \( +size xc:black xc:tomato xc:wheat +append \) -clut \
          gradient_clut.jpg

[IM Output]

Keterbatasannya, warna hanya bisa didefinisikan dengan jarak yang sama rata. Anda tidak bisa begitu saja menggeser posisi warna tengah, kecuali dengan memodifikasi kasar gradien masukan ke bentuk non-linear tertentu demi menggeser pusat itu. Untuk lebih dari tiga warna keadaannya makin buruk. Cara di atas juga teknik yang bagus untuk mewarnai gambar grayscale memakai Duotone, dengan jaminan warna nada-tengah terdefinisi secara persis (tidak seperti memakai operator Tint).
Gradien lookup terinterpolasi juga bisa diperluas ke 2 dimensi, dan menghasilkan gradien linear persegi (interpolasi bilinear) sama mudahnya dengan gradien satu dimensi murni. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap  -fx 'v.p{i/(w-1),j/(h-1)}' \
          gradient_bilinear.jpg

[IM Output]
Berikut contoh yang sama tetapi memakai interpolasi Catrom, dan dibuat dengan operator Distort alih-alih operator FX yang sangat lambat. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -filter point -interpolate catrom \
          -define distort:viewport=100x100 \
          -distort Affine '.5,.5 .5,.5   1.5,1.5 99.5,99.5' \
          gradient_catrom.jpg

[IM Output]
Kunci memahami contoh di atas adalah bahwa kita memperbesar gambar kecil itu berdasarkan pusat piksel-pikselnya. Lihat koordinat gambar vs koordinat piksel untuk detailnya. Perhatikan bahwa kebanyakan metode interpolasi punya padanan filter resize terinterpolasi. Namun penggunaan viewport dan koordinat piksel menghilangkan efek tepi yang tampak pada gradien resize sebelumnya, yang disebabkan pembesaran ekstrem dari gambar yang sangat kecil.
Pengaturan interpolasi Mesh, bagaimanapun, tidak tersedia sebagai filter resize. Ia adalah interpolasi 2 dimensi khusus yang membagi area intra-piksel menjadi dua segitiga linear datar, berengsel di sepanjang diagonal yang menghubungkan pojok-pojok dengan perbedaan warna terkecil. Jadi dengan membuat dua warna menjadi sama, dan memakai "-interpolate mesh", Anda bisa membuat gradien 2D yang sangat berbeda. |

  magick \( xc:red xc:gold +append \) \
          \( xc:gold xc:green +append \) -append \
          -filter point -interpolate mesh \
          -define distort:viewport=100x100 \
          -distort Affine '.5,.5 .5,.5   1.5,1.5 99.5,99.5' \
          gradient_mesh.jpg

[IM Output]
Karena dua pojok kuning yang berseberangan secara diagonal itu sama, diagonal kuning dipakai untuk menghubungkan keduanya. Warna-warna lain dipetakan secara linear ke segitiga-segitiga itu. Jika kedua warna diagonalnya tidak sama, Anda mungkin mendapat pembagian diagonal yang berbeda.

Meracik gradien sendiri

Operator FX rakitan sendiri memungkinkan kita mendefinisikan gradien sendiri atau pembuatan gambar lainnya, berdasarkan posisi piksel saat ini. Karena operator ini membutuhkan gambar untuk bekerja, gradien atau gambar lain bisa dibuat pas dengan gambar tersebut. Artinya, ukuran gambar tidak perlu diketahui lebih dulu untuk membuatkan gradiennya! Misalnya, Anda bisa dengan mudah membuat gradien linear yang ukurannya pas untuk gambar yang sedang dikerjakan. |

  magick rose: -channel G -fx 'i/w' -separate   gradient_fx_linear.gif

[IM Output]
| Saat membuat gradien grayscale, operator -fx bisa dibuat 3 kali lebih cepat, cukup dengan memintanya membuat satu kanal warna saja, misalnya kanal 'G' alias hijau pada contoh di atas. Kanal ini lalu dapat dipisahkan menjadi gambar grayscale yang dibutuhkan. Ini bisa berarti percepatan yang sangat besar, terutama saat memakai formula "-fx" yang sangat kompleks.
Anda bahkan bisa membuat gradien non-linear yang menawan. |

  magick rose: -channel G -fx '(i/w)^4' -separate   gradient_fx_x4.gif

[IM Output]
|

  magick rose: -channel G -fx 'cos(pi*(i/w-.5))' \
           -separate   gradient_fx_cos.gif

[IM Output]
Bagaimana dengan gradien radial linear melingkar 2 dimensi (sebuah kerucut). |

  magick -size 100x100 xc: -channel G \
          -fx 'rr=hypot(i/w-.5, j/h-.5); 1-rr*1.42' \
          -separate gradient_fx_radial.gif

[IM Output]
| Fungsi "-fx" 'rr=hypot(xx,yy)' ditambahkan di IM v6.3.6 untuk mempercepat ekspresi yang sangat sering dipakai 'rr=sqrt(xx*xx+yy*yy)'. Ini juga berarti kita tidak lagi perlu membuat penugasan tambahan seperti 'xx=i/w-.5' saat membuat gradien radial.
Nilai '1.42' (atau sqrt(2)) di atas mengontrol ukuran keseluruhan gradien relatif terhadap dimensi gambar. Dengan begitu radius gradien (seberapa jauh hitam dari pusat) adalah jarak diagonal ke pojok. Anda bahkan bisa membuang 'sqrt()' (yang terpasang di dalam fungsi 'hypot()') dari ekspresinya untuk membuat gradien sferis yang lebih menarik, yang berguna untuk efek shading 3D. |

  magick -size 100x100 xc: -channel G \
          -fx 'xx=i/w-.5; yy=j/h-.5; rr=xx*xx+yy*yy; 1-rr*4' \
          -separate gradient_fx_spherical.gif

[IM Output]
Perhatikan bagaimana saya memakai beberapa ekspresi penugasan untuk menyederhanakan perhitungan jarak dari pusat gambar, lalu mengubahnya menjadi gradien. Fitur ini ditambahkan di IM v6.3.0. Dengan fungsi berpangkat tinggi, Anda bisa memberi foto efek pudar di sekitar tepi persegi panjang gambar. Setel nilai pangkat '4' untuk mengontrol besarnya pemudaran. |

  magick -size 100x100 xc: -channel G \
          -fx '(1-(2*i/w-1)^4)*(1-(2*j/h-1)^4)' \
          -separate  gradient_fx_quad2.gif

[IM Output]
Berikut gradien angular, dibuat dengan matematika langsung. |

  magick -size 100x100 xc:  -channel G \
          -fx '.5 - atan2(j-h/2,w/2-i)/pi/2' \
          -separate  gradient_fx_angular.gif

[IM Output]
Perhatikan bahwa fungsi 'atan2(y,x)' mengembalikan sudut dalam radian dari -PI sampai +PI (lihat manpage-nya), sehingga keluarannya perlu diskalakan dan digeser agar pas ke rentang warna 0.0 sampai 1.0. Itulah sebabnya contoh di atas tampak jauh lebih rumit daripada kenyataannya. Contoh terakhir ini bisa dibuat lebih cepat dengan mendistorsi gradien.

Gradien rakitan sendiri yang lebih kompleks

CATATAN SAMPING: Bagian ini dibuat sebelum penambahan Sparse Points of Color, dan berpengaruh langsung pada penciptaannya. Tentu saja fungsi FX dapat membuat gradien warna. Misalnya, berikut gradien berdasarkan rasio jarak, memakai ekspresi FX yang luar biasa kompleks. |

  magick -size 100x100 xc: +size xc:red xc:yellow -colorspace RGB \
          -fx 'ar=hypot( i/w-.8, j/h-.3 )*4;
               br=hypot( i/w-.3, j/h-.7 )*4;
               u[1]*br/(ar+br) + u[2]*ar/(ar+br)' \
          -colorspace RGB gradient_dist_ratio.gif

[IM Output]
| Pemrosesan gambar dilakukan di ruang warna linear (RGB) untuk menghindari 'penggelapan sRGB' saat pencampuran warna primer sekuat itu. Lihat Memproses gambar nyata untuk detailnya.
Saat beralih dari dua titik ke tiga titik, rasio seberapa banyak warna yang disumbangkan tiap 'titik kontrol' menjadi sedikit lebih kompleks, dan memakai teknik bernama interpolasi Inverse Distance Weighted (IDW). Matematika lebih rinci tentang ini bisa dilihat di Wikipedia, IDW Berikut contoh inverse distance untuk tiga titik. |

  magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
          -fx 'ar=1/max(1, hypot(i-50,j-10)  );
               br=1/max(1, hypot(i-10,j-70)  );
               cr=1/max(1, hypot(i-90,j-90)  );
               ( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
          -colorspace sRGB gradient_inverse.gif

[IM Output]
Dan di sini saya memakai kuadrat kebalikan jarak, metode yang lebih lazim untuk interpolasi IDW. Ini juga dikenal sebagai metode interpolasi Shepard. |

  magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
          -fx 'ar=1/max(1,  (i-50)*(i-50)+(j-10)*(j-10)  );
               br=1/max(1,  (i-10)*(i-10)+(j-70)*(j-70)  );
               cr=1/max(1,  (i-90)*(i-90)+(j-90)*(j-90)  );
               ( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
          -colorspace sRGB gradient_shepards.gif

[IM Output]
Perhatikan bahwa fungsi 'hypot()' tidak dipakai di atas karena tidak perlu menghitung akar kuadrat dari jaraknya. Cara di atas kini sudah diimplementasikan lewat metode Sparse Color 'Inverse' dan 'Shepard's'. Dengan demikian hal di atas kini bisa dilakukan jauh lebih sederhana memakai...

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Inverse '50,10 red  10,70 yellow  90,90 lime' \
          -colorspace sRGB  gradient_inverse_alt.gif
  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Shepards '50,10 red  10,70 yellow  90,90 lime' \
          -colorspace sRGB  gradient_shepards_alt.gif

[IM Output] [IM Output]

Masalah memakai 'Inverse Distance' maupun 'Shepard's Method' (kuadrat kebalikan jarak) adalah semua 'titik kontrol' berefek global ke seluruh gambar. Akibatnya Anda mendapat semacam 'warna rata-rata' yang mendasari di antara titik-titik, dan terutama pada jarak yang jauh dari semua titik kontrol. Ini, pada gilirannya, menghasilkan 'bercak-bercak' warna alih-alih gradien warna yang mulus.

Gradien rakitan sendiri dan rona -- (rona itu sulit ditangani)

CATATAN SAMPING: Ini semacam percobaan gagal untuk membuat efek pelangi yang menarik. Percobaannya gagal, tetapi saya belajar banyak dari kegagalan itu, dan saya sajikan di sini. Cara di atas bekerja baik, tetapi saya ingin mencoba berbuat lebih baik. Saya pikir mungkin saya bisa membuat gradien pelangi warna yang cerah di antara titik-titik, alih-alih bercak yang melebur menjadi warna rata-rata. Jadi untuk membuat gradien rona, saya mencoba melakukan interpolasi Inverse Distance Weighted di ruang warna HSB, walau saya mengganti kuning menjadi biru agar jarak warnanya lebih merata di sekeliling rona, dan mudah-mudahan memberi cara lain untuk membuat roda warna (lihat Gradien di ruang warna lain di atas). |

  magick -size 100x100 xc: +size xc:red xc:blue xc:lime -colorspace HSB \
          -fx 'ar=1/max(1,  (i-50)*(i-50)+(j-10)*(j-10)  );
               br=1/max(1,  (i-10)*(i-10)+(j-70)*(j-70)  );
               cr=1/max(1,  (i-90)*(i-90)+(j-90)*(j-90)  );
               ( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
          -colorspace sRGB   gradient_shepards_HSB.gif

[IM Output]
Seperti terlihat, semua warnanya bagus dan cerah karena kita hanya membuat gradien rona. Namun hasilnya juga tampak sangat aneh, yang disebabkan oleh sifat 'siklis' kanal warna 'Hue'. Akibatnya area antara biru dan merah menempuh jalan memutar yang jauh lewat rona hijau, alih-alih jalur 'modulus' yang lebih pendek lewat rona ungu. Setelah banyak riset, akhirnya saya menemukan cara melakukan matematika modulus yang diperlukan agar hal di atas benar, yaitu memakai rata-rata sirkular untuk rata-rata berbobot jaraknya. Ini melibatkan pengubahan Hue sebagai sudut polar menjadi koordinat persegi X dan Y. Itu memungkinkan matematika linear, sehingga kita bisa melakukan pembobotan linear atas nilai-nilainya dengan tepat. Hasilnya lalu dikonversi kembali menjadi Hue angular. |

  magick -size 100x100 xc: +size xc:red xc:blue xc:lime \
          -colorspace HSB -channel R \
          -fx 'aa=u[1]*2*pi; ba=u[2]*2*pi; ca=u[3]*2*pi;
               ar=1/max(1, hypot(i-50,j-10) );
               br=1/max(1, hypot(i-10,j-70) );
               cr=1/max(1, hypot(i-90,j-90) );
               nr=ar+br+cr;
               mod(atan2( ( sin(aa)*ar + sin(ba)*br + sin(ca)*cr )/nr,
                         ( cos(aa)*ar + cos(ba)*br + cos(ca)*cr )/nr
                       )/(2*pi)+1, 1)' \
          -separate -background white -combine +channel \
          -set colorspace HSB -colorspace sRGB  gradient_circular_mean_hue.gif

[IM Output]
CATATAN: Cara di atas hanya melakukan operasinya pada kanal rona saja. Untuk gambar sungguhan, kita tetap perlu mengoperasikan (seperti biasa) kanal saturasi dan kecerlangan. Seperti terlihat, kini kita mendapat gradien yang benar antara merah dan biru, meskipun metode ini, saat diterapkan hanya pada warna primer yang terpisah sudut sangat lebar, cenderung menghasilkan perubahan gradien yang sangat mendadak di tengah. Artinya, walau hasilnya benar, variasi rona angularnya tidak linear untuk perubahan rona yang sangat besar. Cara ini akan bekerja baik untuk merata-ratakan banyak rona yang berdekatan, tetapi tidak untuk warna primer yang berjauhan seperti ini. Saya bahkan beralih memakai 'Inverse Weighting' yang lebih kuat alih-alih 'Inverse Squared' atau metode 'Shepard's' yang lebih biasa (lihat di atas), dan walau itu memperbaiki keadaan, perubahan ronanya tetap termampatkan di tengah akibat efek non-linear. Karena warna masukannya konstan, mengonversinya lebih dulu ke koordinat hue-x dan hue-y, melakukan pembobotan shepard pada kanal-kanal itu, lalu mengonversinya kembali justru akan membuat prosesnya lebih cepat lagi. Yaitu, mengonversi warna dari ruang warna HSB ke ruang warna Hx,Hy,S,B untuk menerapkan tekniknya. Jika ini dilakukan, titik pusat dan bahkan gradien di antara titik-titik akan memudar ke putih (titik pusat ruang warna HSB). Jika dilakukan di ruang warna HSL, area itu memudar ke abu-abu nada tengah.
Konversi dari Hue polar ke koordinat X-Y ini dalam beberapa hal mirip dengan sekadar melakukan perhitungannya di ruang RGB non-polar, yang menunjukkan efek pudar-ke-abu-abu yang sama (lihat contoh sebelumnya). Jadi jika dengan memakai rata-rata sirkular kita sebenarnya cuma mengonversi ruang warna HSB menjadi varian RGB yang sangat terdistorsi, kenapa tidak kerjakan saja tugasnya di ruang warna RGB linear, lalu saturasikan warnanya untuk menghasilkan rona!

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Inverse '50,10 red  10,70 blue  90,90 lime' \
           -colorspace sRGB gradient_inverse_RGB.png
  magick gradient_inverse_RGB.png -colorspace HSB \
          -channel GB -evaluate set 100% +channel \
          -colorspace sRGB gradient_inverse_RGB_Hue.gif

[IM Output] [IM Output]

| Pemrosesan gambar dilakukan di ruang warna linear (RGB) untuk menghindari 'penggelapan sRGB' saat pencampuran warna primer sekuat itu. Lihat Memproses gambar nyata untuk detailnya.
Seperti terlihat, kita mendapat hasil yang praktis persis sama dengan sebelumnya, tetapi dengan semua 'matematika modulus' yang rumit itu hilang. Namun saya tetap tidak lebih dekat pada sebaran rona yang lebih linear di antara titik-titik warna awal. Pelajaran dari semua ini: bekerja dengan rona itu sulit, bukan hanya karena 'diskontinuitas merah', tetapi juga karena efek non-linear yang terjadi saat warna-warnanya terpisah sangat jauh. Dan pada akhirnya hasilnya sama saja seandainya saya mengerjakan tugas itu langsung di ruang RGB linear lalu menyaturasikan warnanya. Intinya, walau ruang warna HSB dan HSL itu menyenangkan, keduanya bukan ruang warna yang linear, realistis, atau praktis untuk diajak bekerja. Ini mungkin juga sebabnya sangat sedikit operasi yang benar-benar bekerja langsung dengan rona.

Membuat gradien yang sempurna (secara matematis)

Membuat gradien matematis sempurna, misalnya untuk transformasi Fourier (yang siklis), pemetaan gambar, atau bahkan matematika gradien, membutuhkan gradien khusus yang berbeda dari gradien yang sudah kita lihat sejauh ini. Apa maksud saya? Nah, berikut gambar "gradient:" kecil 1x5 piksel yang telah saya besarkan dengan scale supaya warna masing-masing pikselnya terlihat. |

  magick -size 1x5 gradient:  -scale 2000% gradient.png

[IM Output]
Gambar ini membuat gradien yang berjalan dari warna 'white' persis di baris paling atas, ke warna 'black' persis di baris paling bawah. Ini gradien yang 'diidealkan', dan biasanya persis yang diinginkan pengguna, karena memang berisi warna-warna aktual yang pengguna tentukan. Namun walau inilah yang pengguna harapkan, ini bukan gradien yang benar secara matematis. Seperti dibahas di koordinat gambar vs koordinat piksel, piksel sebenarnya punya luas, sehingga piksel putih di bagian atas gambar mewakili pusat piksel itu, dan hitam mewakili pusat piksel paling bawah. Artinya, bukan tepi gambar, melainkan 1/2 piksel dari tepi. Secara matematis gambar dimulai di tepinya. Maka untuk membuat gradien matematis yang sempurna, Anda perlu menentukan lokasi warnanya di tepi gambar, dalam koordinat piksel. Dengan demikian, dalam koordinat gambar posisinya tergeser 1/2 piksel, dan ukuran gambarnya adalah persis jumlah piksel dalam gambar (sebuah jarak), bukan lokasi yang 1 piksel lebih kecil dari ukuran gambar. Salah satu cara membuat gradien matematis sempurna adalah memakai Barycentric Sparse Color (dibahas rinci di bagian berikutnya) untuk membuat gradien tepi-ke-tepi yang sempurna... |

  magick -size 1x5 xc: \
          -sparse-color Barycentric '0,-0.5 white  0,%[fx:h-.5] black' \
          -scale 2000%  gradient_math.png

[IM Output]
Perhatikan bahwa koordinat yang dipakai berjalan dari -0.5 sampai tinggi gambar dikurangi 0.5, yaitu koordinat piksel dari tepi gambar yang sebenarnya. Dan jika hasilnya diamati dari dekat, piksel paling atas dan paling bawah tidak berwarna putih atau hitam. Piksel itu berwarna sesuai gradien di pusat pikselnya. Karena gradien ini benar secara matematis, ia akan menyambung dengan benar saat dipakai dalam situasi 'tiling' atau 'siklis' khusus. Gambar gradien yang sebelumnya tidak akan menyambung dengan benar. Anda mendapat piksel putih murni bersebelahan dengan piksel hitam murni, sehingga muncul celah satu piksel atau 'disjungsi' dalam siklus matematisnya, dalam situasi di mana putih murni dan hitam murni biasanya dianggap nilai yang setara. Cara yang lebih sederhana adalah membuat gambar "gradient:" yang satu piksel lebih panjang, lalu memenggal (chop) satu piksel dari salah satu ujungnya (mengikuti pengaturan "-gravity" saat ini). Misalnya, di sini saya memenggal piksel putih paling atas, karena memiliki piksel hitam (atau nilai nol) sering lebih diinginkan pada hasil akhir. |

  magick -size 1x6 gradient: -chop 0x1 -scale 2000%  gradient_chopped.png

[IM Output]
Gambar gradien hasilnya lalu bisa diputar sesuai kebutuhan, untuk menghasilkan gambar yang diperlukan bagi pemrosesan gambar selanjutnya. Namun walau gradien ini akan 'bersiklus' dengan benar, posisi warnanya sendiri tidak persis benar. Tetapi dalam banyak kasus ini sudah cukup baik. Jika Anda butuh 'gradien sempurna', saya sarankan memakai gradien sparse color. Ringkasnya... Sedikit berpikir tentang apa persisnya yang Anda inginkan dari gradien bisa membuat perbedaan besar pada akurasi hasil akhir. Tetapi kalau memang tidak penting, ya jangan dipusingkan; pakai saja yang paling sederhana untuk tugas yang ada.


Sparse points of color (titik warna tersebar)

Operator "-sparse-color " ditambahkan di IM v6.4.3-0; ia mengambil sebuah gambar dan menyetel warna yang diberikan pada tiap koordinat pecahan 'x,y' yang diberikan. Yaitu, dalam bentuk...

-sparse-color {method}  'x,y color   x,y color   x,y color ...'

Piksel selebihnya (dibatasi menurut pengaturan "-channel") lalu akan dipetakan menurut hubungannya dengan titik-titik warna terisolasi ini, sehingga warna di antara titik-titik itu menjadi mulus. Method-nya mendefinisikan seperti apa hubungan itu. Tentu ada banyak cara mendefinisikan warna perantaranya, dan metode mana yang Anda pilih benar-benar bergantung pada apa yang ingin dicapai. Ini sebenarnya juga bisa digolongkan sebagai versi bebas-bentuk dari interpolasi 2 dimensi (lihat Interpolation, Wikipedia). Pembesaran gambar, alias Resize, sebenarnya adalah sub-himpunan khusus dari ini, tetapi yang dimulai dari grid piksel tetap yang lengkap untuk diperbesar. Sayangnya hanya sedikit dari filter resize atau metode interpolasi, yang memang dirancang untuk menangani grid titik, yang bisa diterjemahkan langsung ke himpunan bebas-bentuk berisi titik-titik warna yang terpisah jarang. Boleh dibilang, resize dengan grid tak lengkap memang tidak jalan. Ini juga berkaitan dengan metode "Geographical Information System (GIS)", di mana bentang alam diukur memakai titik-titik ketinggian yang terpisah jarang (dan jarang membentuk grid ketat), lalu sisa bentang alamnya ditentukan dari titik-titik terisolasi itu. Dalam situasi serupa, meteorologi sering punya titik-titik terisolasi berisi tekanan udara dan suhu, yang lalu perlu diinterpolasi. Biasanya setelah interpolasi, peta diproses lebih lanjut untuk menghasilkan 'iso-line' yang menunjukkan titik-titik bernilai sama (ketinggian, tekanan, suhu), menghasilkan berbagai peta cuaca yang hampir semua orang kenal. Dalam hal ini gambar yang dihasilkan bisa dibayangkan sebagai 'peta ketinggian' grayscale sederhana dari data masukan, atau bahkan ketiga variabel sekaligus, masing-masing ke 'kanal' gambar terpisah.

Barycentric (gradien segitiga)

Metode "Barycentric" memetakan tiga titik, dan hanya tiga titik, menjadi segitiga warna linear. Warna di luar segitiga ini berlanjut seperti sebelumnya. Saya menandai titik-titik masukan dengan lingkaran kecil, sehingga warna yang Anda lihat semuanya adalah nilai interpolasi yang dihasilkan operator Sparse Color. |

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Barycentric '30,10 red   10,80 blue   90,90 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 30,10 30,12  circle 10,80 10,82  circle 90,90 90,92' \
          sparse_barycentric.png

[IM Output]
| Pemrosesan gambar dilakukan di ruang warna linear (RGB) untuk menghindari 'penggelapan sRGB' saat pencampuran warna primer sekuat itu. Lihat Memproses gambar nyata untuk detailnya.
Jika empat titik atau lebih diberikan, dilakukan 'kecocokan terbaik' (best fit) atas semua titik yang diberikan, dan akibatnya titik-titik itu sendiri mungkin tidak mendapat warna persis seperti yang ditentukan. Namun berhati-hatilah: gradiennya tidak sekadar 'berhenti', melainkan terus berubah melewati titik-titik itu. Secara tradisional gradien barycentric dibatasi hanya di dalam segitiga pelingkup dari titik-titik yang dipakai membuatnya. Sebagai contoh.. |

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color Barycentric '30,10 red   10,80 blue   90,90 lime' \
          -colorspace sRGB  -fill white -stroke black \
          \( -size 100x100 xc:black -draw 'polygon 30,10  10,80  90,90' \) \
          -alpha off -compose CopyOpacity -composite \
          -draw 'circle 30,10 30,12  circle 10,80 10,82  circle 90,90 90,92' \
          sparse_bary_triangle.png

[IM Output]
|

  magick -size 100x100 xc:none -draw "polygon 30,10  10,80  90,90" \
          -colorspace RGB -channel rgb \
          -sparse-color Barycentric '30,10 red   10,80 blue   90,90 lime' \
          -colorspace sRGB  sparse_bary_triangle_2.png

[IM Output]
| Mask segitiga yang dipakai di atas kebesaran 1/2 piksel akibat cara draw menggambar garis ekstra di sekeliling bentuknya. Lihat Draw Fill Bounds untuk detailnya. Ini bisa jadi masalah saat membuat mesh segitiga berisi gradien.
Metode 'barycentric' sebenarnya adalah pemetaan persamaan affine linear ke masing-masing dari ketiga kanal warna secara terpisah. Karena itu, jika saya pisahkan tiap kanal warna dari contoh tiga titik di atas, Anda mendapat tiga gradien linear sederhana di tiap kanal warna.

  magick sparse_barycentric.png -separate sparse_bary_%d.gif

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

Hanya karena warna primer yang dipakailah gradien-gradien di atas semuanya terpetakan sejajar dengan salah satu sisi segitiga. Biasanya tidak begitu. Tetapi Anda akan selalu mendapat gradien linear sederhana di tiap kanal terpisah dari gambar, dan bidang datar nilai dalam ruang warna 3D.

Barycentric dan gradien dua warna

Efek sejajar dari gradien barycentric segitiga ini sebenarnya sangat berguna. Jika dua titik disetel ke warna yang sama, kedua titik itu akan menentukan 'sudut' gradien antara mereka dan titik berwarna lainnya. Misalnya, dengan membuat dua titik 'red', gradiennya akan dibuat sejajar dengan kedua titik 'red' itu... |

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Barycentric '30,10 red   10,80 red   90,90 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 30,10 30,12  circle 10,80 10,82  circle 90,90 90,92' \
          sparse_bary_gradient.png

[IM Output]
Berikut contoh yang sama tetapi dengan salah satu titik kontrol sudut dipindah, untuk menunjukkan bagaimana ia menyetel sudut gradien. |

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color  Barycentric '50,70 red   10,80 red   90,90 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 50,70 50,72  circle 10,80 10,82  circle 90,90 90,92' \
          sparse_bary_gradient_2.png

[IM Output]

Gradien diagonal

Ini memberi cara sederhana untuk membuat gradien diagonal linear apa pun hanya dengan dua warna. Misalnya, berikut cara yang sangat rapi untuk membuat gradien diagonal, dari satu pojok ke pojok lain, untuk gambar masukan berukuran APA PUN.

  magick -size 600x60 xc: -colorspace RGB \
          -sparse-color barycentric '0,0 skyblue  -%w,%h skyblue  %w,%h black' \
          -colorspace sRGB diagonal_gradient.jpg

[IM Output]

Dan untuk menyelaraskan dengan dua pojok yang lain...

  magick -size 600x60 xc: -colorspace RGB \
          -sparse-color barycentric '0,%h black  -%w,0 black  %w,0 skyblue' \
          -colorspace sRGB diagonal_gradient_2.jpg

[IM Output]

'Gradien diagonal' ini menghasilkan gradien yang tampak alami bahkan pada gambar panjang seperti di atas. Cermati lokasi ketiga titik warnanya, terutama dua titik berwarna sama yang menentukan sudut gradien antara kedua pojok. Perhatikan bahwa pada kedua kasus salah satu titik itu bahkan tidak berada di dalam gambarnya! Perhatikan juga penggunaan persen escape agar posisinya menyesuaikan otomatis dengan ukuran gambar tempat gradien digambar.

Gradien dua titik

Jika hanya dua titik warna yang diberikan, IM akan membuatkan titik ketiganya untuk Anda, sehingga sudutnya tegak lurus di antara kedua titik asal. Hasilnya adalah gradien linear sederhana yang sangat bisa dikendalikan. |

  magick -size 100x100 xc:  -colorspace RGB \
          -sparse-color  Barycentric '30,10 red  90,90 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 30,10 30,12  circle 90,90 90,92' \
          sparse_bary_two_point.png

[IM Output]
Namun gradien dua titik tidak bekerja terlalu baik saat diterapkan pada pojok-pojok gambar yang sangat 'lebar' atau 'tinggi' (rasio aspek tinggi). Pada dasarnya gradiennya tidak sejajar diagonal, tidak seperti gradien tiga titik di atas. Miring memang, hanya saja tidak cukup miring untuk membuatnya 'menarik'.

  magick -size 600x60 xc: -colorspace RGB \
          -sparse-color barycentric '0,0 skyblue  %w,%h black' \
          -colorspace sRGB  sparse_bary_two_point_wide.jpg

[IM Output]

Bilinear (gradien 4 titik)

Metode ini mencocokkan sebuah persamaan ke 4 titik, pada ketiga kanal warna, untuk menghasilkan gradien warna yang seragam di antara titik-titik itu, dan melampauinya. |

  magick -size 100x100 xc:  -colorspace RGB \
    -sparse-color Bilinear '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_bilinear.png

[IM Output]
'Kecocokan 4 titik' ini bisa Anda lihat dengan mengambil gambar di atas dan memisahkan gradien tiap kanal warnanya.

  magick sparse_bilinear.png -separate sparse_bilin_%d.gif

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

Perhatikan bagaimana persamaannya menghasilkan kurva (tepatnya kurva kuadratik). Namun jika keempat titik membentuk garis-garis sejajar, gradien yang dihasilkan menjadi linear. Metode ini sebenarnya setara dengan metode interpolasi bilinear (lihat gradien lookup terinterpolasi di bawah) ketika keempat titiknya selaras dengan grid ortogonal (persegi panjang). Jika titik yang diberikan kurang dari 4, fungsi di atas diganti dengan metode 3 titik 'Barycentric' (lihat di atas). Jika lebih dari empat titik diberikan, ia melakukan best fit atas semua titik, sehingga bisa jadi tidak persis cocok dengan warna yang diberikan pada titik yang ditentukan. Ini tidak disarankan.

Voronoi (warna terdekat)

Metode "Voronoi" sekadar memetakan tiap piksel ke titik warna terdekat yang Anda berikan. Ini pada dasarnya membagi gambar menjadi sekumpulan 'sel' poligonal di sekeliling tiap titik. Sebagai contoh.. |

  magick -size 100x100 xc:  -colorspace RGB \
    -sparse-color  Voronoi '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_voronoi.gif

[IM Output]
Seperti terlihat, tidak ada upaya anti-aliasing pada 'sel-sel' berwarna di sekeliling tiap titik. Tepi tiap sel sebenarnya jatuh tepat di tengah antara tetangga terdekat tiap titik. Ini misalnya bisa dipakai untuk membuat mask guna memotong-motong gambar dengan berbagai cara. Cukup jadikan satu titik putih dan semua sisanya hitam untuk mengekstrak satu 'sel' tunggal dari gambar. Jika Anda ingin menghaluskan (anti-alias) hasilnya, salah satu caranya adalah memakai suatu bentuk super sampling untuk menghaluskan gambar. Misalnya buat yang 4 kali lebih besar, lalu "-scale"-kan kembali ke ukuran yang diinginkan. |

  magick -size 400x400 xc: -colorspace RGB \
    -sparse-color Voronoi '120,40 red 40,320 blue 270,240 lime 320,80 yellow'
\
    -scale 25%  -colorspace sRGB -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_voronoi_ssampled.png

[IM Output]
| Semua pemrosesan gambar dilakukan di ruang warna linear (RGB) untuk menghindari 'penggelapan sRGB' saat pencampuran warna primer sekuat itu. Lihat Memproses gambar nyata untuk detailnya.
Cara yang lebih sederhana (meski kurang bagus) adalah sekadar mem-blur gambarnya sangat sedikit... |

  magick -size 100x100 xc: -colorspace RGB \
    -sparse-color Voronoi '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -blur 1x0.7  -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_voronoi_smoothed.png

[IM Output]
Dengan mem-blur gambar hasil dalam jumlah besar, Anda bisa membentuk gradien non-linear di antara 'sel-sel' yang dihasilkan. |

  magick -size 100x100 xc:  -colorspace RGB \
    -sparse-color  Voronoi '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -blur 0x15  -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_voronoi_blur.png

[IM Output]
Makin besar "-blur"-nya, makin besar gradien di antara berbagai 'sel'. Namun berhati-hatilah: ini mungkin tidak mempertahankan sel berwarna yang kecil, atau tidak menjamin titik aslinya tetap berwarna seperti yang diberikan, jika ia dekat dengan tepi (dan titik lain) yang berbeda warna. Dengan teknik 'blur linear' khusus yang dikembangkan Fred Weinhaus, Anda bisa menghasilkan gradien linear berlebar tetap di antara sel-sel. |

  magick -size 100x100 xc: -colorspace RGB \
    -sparse-color  Voronoi '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -blur 10x65535  -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_voronoi_gradient.png

[IM Output]
Keluaran yang belum di-blur juga bisa dilewatkan ke berbagai teknik deteksi tepi untuk menghasilkan beragam tepi berbatas. Anda bisa memetakan ulang gambarnya lewat konvertor raster ke vektor untuk menghasilkan garis vektor. Namun saya mendapati pengaturan bawaan 'autotrace' mungkin perlu disetel dengan "-corner-threshold 120" agar pojok-pojok terdeteksi lebih baik.

Shepards (bercak warna)

Metode "Shepards" memakai rasio kuadrat kebalikan jarak ke tiap titik yang diberikan untuk menentukan warna kanvas di tiap titik. Lihat Gradien rakitan sendiri yang lebih kompleks di atas untuk contoh bagaimana matematikanya dikerjakan. Ini agak mirip memiliki lampu sorot warna di tiap titik yang saling berinteraksi, dengan cahayanya menyebar menjadi rata-rata seragam dari semua warna yang diberikan di tak-hingga. |

  magick -size 100x100 xc: -colorspace RGB \
    -sparse-color  Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
    -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_shepards.png

[IM Output]
| Pemrosesan gambar dilakukan di ruang warna linear (RGB) untuk menghindari 'penggelapan sRGB' saat pencampuran warna primer sekuat itu. Lihat Memproses gambar nyata untuk detailnya.
Dengan mengelilingi area tertentu dengan warna serupa, Anda bisa membuat dataran tinggi berisi warna itu, meskipun batas di antara titik-titik tepinya bisa 'bocor', dan pusat 'dataran' itu bisa melesak membentuk cekungan dangkal (tergantung jarak ke titik warna lain). Metode ini juga yang dipakai untuk membuat medan perpindahan (displacement field), seperti yang dipakai pada distorsi gambar Shepards. Dalam kasus itu yang dipetakan adalah vektor perpindahan X dan Y, bukan nilai warna R,G,B.

Inverse (titik warna tajam)

Metode "Inverse" praktis identik dengan "Shepards", kecuali bahwa ia memakai pembobotan kebalikan jarak yang lebih langsung atas titik-titik yang diberikan. Lihat Gradien rakitan sendiri yang lebih kompleks di atas untuk contoh bagaimana matematikanya dikerjakan. Ini tambahan yang jauh lebih belakangan, di ImageMagick versi 6.6.9-7. Sebagai contoh... |

  magick -size 100x100 xc: -colorspace RGB \
    -sparse-color  Inverse '30,10 red  10,80 blue  70,60 lime  80,20 yellow' \
    -colorspace sRGB  -fill white -stroke black \
    -draw 'circle 30,10 30,12  circle 10,80 10,82' \
    -draw 'circle 70,60 70,62  circle 80,20 80,22' \
    sparse_inverse.png

[IM Output]
Seperti terlihat, ia menghasilkan titik-titik warna tajam yang cepat melebur ke 'warna rata-rata' latar. Bandingkan dengan metode Shepards yang menghasilkan bercak membulat, dengan warna 'datar' di sekitar titik warna. Namun metode ini bekerja lebih baik saat membuat gradien linear di mana semua titik kontrol membentuk garis. Yaitu, untuk membuat gradien 1 dimensi di sepanjang garis tertentu pada gambar. Tetapi masih ada satu hal lagi. Seberapa cepat titik-titik warna ini turun ke tingkat mendekati 'rata-rata' dikendalikan oleh seberapa dekat mereka. Tempatkan dua titik sumber berdekatan, dan mereka turun dengan cepat; makin berjauhan, makin besar pengaruh warna masing-masing.

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color Inverse '45,45 red  55,55 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 45,45 45,47  circle 55,55 55,57' \
          sparse_inverse_near.png
  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color Inverse '30,30 red  70,70 lime' \
          -colorspace sRGB  -fill white -stroke black \
          -draw 'circle 30,30 30,32  circle 70,70 70,72' \
          sparse_inverse_far.png

[IM Output] [IM Output]

Selain itu, jika Anda 'menggandakan' titik tertentu (persis di titik yang sama, atau berdekatan) dengan warna yang sama atau serupa, titik warna itu menjadi dua kali lebih kuat. |

  magick -size 100x100 xc: -colorspace RGB \
          -sparse-color Inverse '30,30 red  75,65 lime  65,75 lime' \
          -colorspace sRGB -fill white -stroke black \
          -draw 'circle 30,30 30,32  circle 75,65 75,67  circle 65,75 65,77 '
\
          sparse_inverse_stronger.png

[IM Output]
Efek-efek ini juga berlaku untuk metode 'Shepards'!

Faktor pangkat Shepards

Metode sparse color Shepards dan Inverse sebenarnya sama, hanya dengan 'tingkat pangkat' berbeda yang diterapkan pada bobot kebalikan jaraknya (masing-masing 2.0 dan 1.0). Sejak IM v6.8.0-10, tingkat pangkat ini bisa disetel lewat define operasional 'shepards:power', yang akan dipakai oleh metode 'Shepards'. Sebagai contoh

  magick -size 100x100 xc: -colorspace RGB -define shepards:power=0.5 \
     -sparse-color Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
     -colorspace sRGB -fill white -stroke black \
     -draw 'circle 30,10 30,12  circle 10,80 10,82' \
     -draw 'circle 70,60 70,62  circle 80,20 80,22' \
     sparse_shepards_pow0.5.png
  magick -size 100x100 xc: -colorspace RGB -define shepards:power=1 \
     -sparse-color Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
     -colorspace sRGB -fill white -stroke black \
     -draw 'circle 30,10 30,12  circle 10,80 10,82' \
     -draw 'circle 70,60 70,62  circle 80,20 80,22' \
     sparse_shepards_pow1.png
  magick -size 100x100 xc: -colorspace RGB -define shepards:power=2 \
     -sparse-color Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
     -colorspace sRGB -fill white -stroke black \
     -draw 'circle 30,10 30,12  circle 10,80 10,82' \
     -draw 'circle 70,60 70,62  circle 80,20 80,22' \
     sparse_shepards_pow2.png
  magick -size 100x100 xc: -colorspace RGB -define shepards:power=3 \
     -sparse-color Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
     -colorspace sRGB -fill white -stroke black \
     -draw 'circle 30,10 30,12  circle 10,80 10,82' \
     -draw 'circle 70,60 70,62  circle 80,20 80,22' \
     sparse_shepards_pow3.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=8 \
     -sparse-color Shepards '30,10 red  10,80 blue  70,60 lime  80,20 yellow'
\
     -colorspace sRGB -fill white -stroke black \
     -draw 'circle 30,10 30,12  circle 10,80 10,82' \
     -draw 'circle 70,60 70,62  circle 80,20 80,22' \
     sparse_shepards_pow8.png

[IM Output]
pangkat 0.5 | [IM Output]
pangkat 1.0
(inverse) | [IM Output]
pangkat 2.0
(shepards) | [IM Output]
pangkat 3.0 | [IM Output]
pangkat 8.0

Seperti terlihat, 'bercak warna' itu mengembang dari titik yang sangat tajam, menjadi bercak membulat, lalu menjadi area warna yang luas. Pada tingkat pangkat yang sangat tinggi, ia akhirnya mereproduksi pola yang sama dengan metode sparse color Voronoi. -define ini tidak hanya memengaruhi Shepards Sparse Color, tetapi juga berefek serupa pada metode distorsi Shepards, yang didasarkan pada peta perpindahan terhitung yang dihasilkan metode sparse color. Namun ia tidak memengaruhi metode sparse color Inverse, yang selalu memakai tingkat pangkat 1.0.

Ringkasan metode sparse color

Berikut tayangan ulang berbagai gambar "-sparse-color" 4 titik, sebagai perbandingan. [IM Output]
Voronoi | [IM Output]
Voronoi (dengan blur) | [IM Output]
Shepards | [IM Output]
Inverse | [IM Output]
Bilinear
Dan berikut ringkasan berbagai metode 3 titik. [IM Output]
Voronoi | [IM Output]
Voronoi (dengan blur) | [IM Output]
Shepards | [IM Output]
Inverse | [IM Output]
Barycentric
Saat ini hanya metode 'Voronoi', 'Shepards', dan 'Inverse' yang cocok untuk lebih dari empat titik. Metode "-sparse-color" lainnya sedang direncanakan. Jika Anda punya ide, kirimkan lewat email kepada saya.

Kanal dan sparse color

Operator "-sparse-color" dipengaruhi oleh pengaturan "-channel", artinya pengaturan itu bisa dipakai untuk membatasi efeknya ke satu kanal saja, atau memperluasnya ke kanal transparansi. Pengaturan "-channel" juga bisa dipakai untuk mempercepat pemrosesan gambar grayscale dengan hanya beroperasi pada satu kanal, lalu meng-"-separate" kanal itu (lihat penanganan kanal untuk detailnya). Sebagai contoh.. |

  magick -size 100x100 xc: -channel G -sparse-color Shepards \
              '30,10 gray70  10,80 black  70,60 white  80,20 gray(33.3333%)' \
          -separate +channel    -fill white -stroke black \
          -draw 'circle 30,10 30,12  circle 10,80 10,82' \
          -draw 'circle 70,60 70,62  circle 80,20 80,22' \
          sparse_shepards_gray.gif

[IM Output]
Sejak IM v6.6.8-5 kanal yang tidak diubah dipertahankan, sehingga kini Sparse Color bisa dipakai dengan pengaturan "-channel" untuk menambahkan gradien transparan ke gambar apa pun, dengan cepat dan mudah. Misalnya, di sini saya menambahkan gradien diagonal transparan, yang diselaraskan sehingga transparansi 50% berada di sepanjang diagonal gambar bawaan "rose:. |

  magick rose: -alpha set -channel A \
          -sparse-color Barycentric \
                 '0,0 opaque   %w,-%h opaque    %w,%h transparent' \
          rose_alpha_gradient.png

[IM Output]
| Warna 'Opaque' hanyalah nama lain untuk 'Black'. Pada dasarnya ia dipakai saat Anda sebenarnya hanya ingin menentukan warna yang sepenuhnya buram, sedangkan warnanya sendiri tidak penting. Demikian pula dengan warna 'Transparent'. Saya bisa saja dengan sama mudahnya memakai 'White' dan 'None'.
| Sebelum IM v6.6.8-5, kanal apa pun yang tidak dipilih oleh pengaturan "-channel" disetel ulang ke nilai nol (hitam). Ini sangat membatasi kegunaan efektifnya.
Sparse Color juga menerima nilai pecahan ternormalisasi sebagai pengganti nama warna. Berapa banyak nilai yang harus diberikan untuk menggantikan nama warna bergantung pada pengaturan "-channel" saat ini, dan apakah kanal itu 'aktif' pada gambar yang diproses. Cara termudah adalah membatasi pemrosesan ke satu kanal saja. Perhatikan juga bahwa saat memakai angka mentah alih-alih nama warna, nilai transparansi adalah nilai 'matte' (0=buram), bukan nilai 'alpha' (1=buram) (untuk IMv7). Jadi pada contoh di atas saya bisa saja memakai angka alih-alih nama warna...

  -channel A  -sparse-color Bilinear '0,0 1.0   -%w,%h 1.0    %w,%h 0.0'

Ini mungkin lebih mudah ditangani dalam skrip terprogram dan dalam API, yang mungkin tidak punya akses ke penerjemah 'nama warna'.

Sparse color sebagai operator pengisi

Salah satu alasan awal penciptaan operator Sparse Color adalah agar Anda bisa memberikan gambar yang hanya berisi sedikit titik warna tetap, lalu dari sana 'mengisi' warna-warna lain yang belum terdefinisi. Misalnya, di sini saya menggambar sejumlah kecil piksel. Pengaturan "+antialias" sengaja dimatikan supaya tidak ada warna semitransparan atau campuran yang tergambar, sehingga gambarnya hanya berisi empat warna persis yang ditentukan dan tidak ada yang lain. |

  magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
          -stroke Gold        -draw "path 'M 20,70  A 1,1 0 0,1 80,50'" \
          -stroke DodgerBlue  -draw "line 30,10  50,80" \
          -stroke Red         -draw "circle 80,60  82,60" \
          sparse_source.gif

[IM Output]
Sekarang kita bisa mengekstrak beberapa piksel tak-transparan yang ada di gambar ini, lalu mengisi semua warna lainnya memakai metode sparse color multi-titik 'Shepards'. |

  magick sparse_source.gif sparse-color:- |\
      magick sparse_source.gif -alpha off \
              -sparse-color shepards '@-' sparse_fill.png

[IM Output]
Perintah "sed" di atas mengambil format file teks terenumerasi, menghapus baris header pertama dan semua baris yang mengandung transparansi, lalu memformatnya ulang menjadi daftar koordinat piksel dan warna. Daftar itu lalu 'disalurkan' (pipeline) ke operator Sparse Color lewat argumen khusus "@-". Ya, cara di atas memang sangat rumit, tetapi jalan. Setidaknya untuk jumlah titik yang sangat kecil. Namun makin banyak titik yang diberikan, makin lambat operasinya. Ini karena pemrosesan Sparse Color berorientasi 'titik', bukan berorientasi gambar atau morfologi. Suatu saat saya berharap bisa menyediakan sekumpulan metode 'pengisi lubang' berorientasi morfologi, yang cukup diberi gambar di atas apa adanya dan area transparannya terisi otomatis. Teknik ekstraksi titik ini bisa digabungkan dengan metode morfologi EdgeIn untuk mengekstrak piksel di sekitar tepi objek atau lubang, sehingga Anda bisa 'mengisi' latar belakang atau lubang yang hilang (seperti ditunjukkan di morfologi dan kanal). Sebagai contoh...

  magick figure.gif -channel A -morphology EdgeIn Diamond
shape_edge_pixels.gif
  magick shape_edge_pixels.gif txt:- |\
    sed '1d; / 0) /d; s/:.* /,/;' | \
     magick shape_edge_pixels.gif -alpha off \
             -sparse-color shepards '@-' shape_edge_in_lights.png
  magick shape_edge_in_lights.png figure.gif -composite shape_in_lights.png

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

Perhatikan bahwa gambar hasilnya persis sama dengan masukan, tetapi dengan latar belakang transparan diganti oleh 'warna tepi' yang di-blur berdasarkan jarak. Inilah sebabnya tepi-tepi gambar menjadi tidak tegas. Gambar ini khusus dikembangkan untuk mencoba menghasilkan teknik 'feathering tepi' yang lebih baik. Lihat Blur Feathering dan Distance Feathering untuk teknik feathering lainnya.

Sparse color Shepards, alternatif blur

Salah satu alternatif untuk "-sparse-color" adalah mengambil gambar berisi piksel di atas latar belakang transparan, lalu mem-Blur-nya. Setelah itu transparansinya dibuang.

  magick sparse_source.gif   -channel RGBA -blur 0x15 \
          -alpha off  sparse_blur_simple.png

[IM Output] [IM Output]

Masalahnya, warna aslinya tidak dipertahankan, dan Anda juga menghadapi masalah nilai 'sigma ' persisnya yang harus dipakai. Ia juga tidak memperhitungkan seberapa 'dekat' tiap warna, sehingga dua piksel berwarna yang berdekatan (kurang dari nilai 'sigma ') akan saling membanjiri dan melebur ter-blur bersama.
Metode yang lebih baik adalah membuat beberapa lapis gambar blur dengan nilai 'sigma ' yang makin kecil, dan gambar asli tanpa blur di paling atas.

  for sigma in  64 32 16 8 4 2 1 0;  do
    magick sparse_source.gif -depth 16 \
            -channel RGBA -blur 0x$sigma miff:-
  done |
    magick - -background none -flatten -alpha off sparse_blur_layered.png

[IM Output] [IM Output]

Teknik blur berlapis ini setara dengan hasil metode 'Shepards' pada gambar yang sama; walau tidak sepersis itu, hasilnya sangat dekat. Namun ia kemungkinan jauh lebih cepat saat piksel masukannya banyak, karena berorientasi gambar (morfologi), bukan menghitung per titik. Metode blur berlapis lainnya adalah memakai Resize untuk membuat 'piramida' gambar blur. Teknik ini dirinci di blur besar memakai resize. |

  magick sparse_source.gif \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          \( +clone -resize 50% \) \
          -layers RemoveDups -filter Gaussian -resize 100x100\! -reverse \
          -background None -flatten -alpha off    sparse_blur_pyramid.png

[IM Output]
Ini bekerja sangat cepat pada gambar sangat besar tanpa membutuhkan nilai 'sigma ' yang besar (dan karenanya sangat lambat) untuk tiap langkah blur. Intinya ia memakai teknik pengubahan ukuran gambar yang lebih cepat untuk menghasilkan lapisan-lapisan blur dari contoh sebelumnya. Hasilnya tidak sepersis itu, tetapi merupakan aproksimasi yang baik dari hasil yang benar. Namun ia bekerja paling baik untuk gambar persegi yang ukurannya pangkat dua; selain itu akurasinya berkurang. Operator khusus "-layers RemoveDups" di atas akan membuang gambar 'piksel rata-rata tunggal' ekstra yang dihasilkan oleh operasi 'clone-resize' berulang. Gambar-gambar lalu di-resize kembali ke ukuran asli memakai filter resize Gaussian (padanan blur). Urutan gambar lalu dibalik agar yang asli berada di atas dan lapisan yang lebih blur di bawah, sebelum diratakan bersama seperti sebelumnya. Kelebihannya, gambar hanya perlu dibaca sekali, dengan semua pekerjaan selesai dalam satu perintah. Ia juga bekerja sangat cepat bahkan untuk gambar besar, apalagi karena resize hanya membagi dua gambar di tiap langkah, sehingga menghindari blur yang lambat dengan sigma sangat besar. Satu-satunya kekurangan metode ini adalah Anda perlu tahu kira-kira ukuran asli gambar untuk memulihkan gambar-gambar 'blur'-nya, dan perlu perkiraan kasar berapa banyak clone resize yang dibuat (log2 dari dimensi terbesar, tambah 1). Namun kelebihan jumlah clone resize bukan pukulan besar bagi kinerja, karena resize menjadi 'no-op' begitu gambar masukan sudah diperkecil sampai gambar minimal 1 piksel. 'Lapisan gambar resize' ekstra yang tak berguna lalu ditangani otomatis oleh "-layers RemoveDups". Satu-satunya masalah nyata adalah kemungkinan gambar-gambar resize menjadi 'tidak sinkron' saat menangani gambar yang ukurannya bukan pangkat dua. Seberapa parah masalah ini belum diketahui, tetapi mestinya tidak terlalu besar, karena gambar-gambar itu juga yang paling blur. Tentu saja ia masih punya masalah 'kebocoran' dari metode 'Shepards', jadi mari kita lihat masalah ini lebih rinci.

'Kebocoran' metode Shepards

Metode 'Shepards' sama sekali tidak memahami 'batas', sehingga warna di sisi jauh dari suatu 'garis warna' akan bocor, atau 'merembes' melewati garis itu. Pada akhirnya, di jarak yang jauh Anda mendapat warna rata-rata murni dari semua piksel. Ini tidak selalu hasil yang diinginkan (walau dalam beberapa kasus justru diinginkan). Pada contoh ini, makin dekat kurva 'Red' ke garis 'White', makin banyak warna yang 'bocor' menembus kedua garis ke sisi jauh, menghasilkan warna merah muda. |

  magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
          -stroke Red    -draw "path 'M 26,0  A 55,61 0 0,1 26,100'" \
          -stroke White  -draw "line 50,0  50,100" \
          sparse_lines_near_source.gif

[IM Output]
|

  magick sparse_lines_near_source.gif txt:- |\
    sed '1d; / 0) /d; s/:.* /,/;' |\
      magick -size 100x100 xc: -sparse-color shepards '@-' \
              sparse_lines_near.png

[IM Output]
Kebocoran warna ini adalah masalah utama penggunaan metode Shepards untuk 'pengisian lubang', terutama saat ada banyak lubang, karena warna yang terlibat pada satu lubang bisa dan akan bocor ke dalam serta memengaruhi warna di lubang yang sama sekali lain. Begitu pula sebaliknya. Pemahaman tentang batas inilah yang membedakan metode Shepards dari bentuk 'pengisian lubang' warna lain yang dikenal sebagai 'difusi warna '. Pada dasarnya, dengan 'difusi warna ', warna tidak bisa melewati garis berisi warna lain yang terdefinisi. Ini dicapai dengan membatasi efeknya hanya pada warna yang berada dalam 'garis pandang', atau pada warna yang bocor mengitari sisi luar sebuah tepi. Ini membutuhkan penggunaan jarak ke warna terdekat untuk membatasi warna mana yang memengaruhi sebuah piksel. Salah satu kegunaan utama 'difusi warna ' disajikan di situs web Diffusion Curves. Situs itu tidak hanya memakai difusi warna secara intensif, tetapi juga memuat informasi teknik untuk menghasilkan difusi dengan sangat cepat. Saya berharap suatu saat bisa mengimplementasikan ini ke ImageMagick.


Gambar plasma

Gradien plasma

Kalau gradien memberi rentang warna yang mulus, operator pembuatan gambar lain, "plasma:", memberi gradien jenis lain. Jenis yang sangat cocok untuk membuat latar warna acak bagi gambar Anda. Pertama-tama perlu saya tegaskan bahwa "plasma:" adalah gambar acak. Karena itu ia bisa dan akan menghasilkan gambar yang berbeda setiap kali dijalankan. Misalnya, di sini kita membuat tiga gambar plasma 'standar' terpisah, dan tiap gambar berbeda satu sama lain, meskipun perintah yang dipakai untuk membuatnya sama.

  magick -size 100x100  plasma:  plasma1.jpg
  magick -size 100x100  plasma:  plasma2.jpg
  magick -size 100x100  plasma:  plasma3.jpg

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

Terlihat juga bahwa gambar plasma merupakan sejenis gradien warna acak, dan seperti "gradient:", dimulai dengan putih di atas dan hitam di bawah. Yang kurang terdokumentasi adalah warna untuk gradien plasma bisa ditentukan dengan cara yang persis sama seperti untuk gradien linear di atas.

  magick -size 100x100  plasma:blue              plasma_range1.jpg
  magick -size 100x100  plasma:yellow            plasma_range2.jpg
  magick -size 100x100  plasma:green-yellow      plasma_range3.jpg
  magick -size 100x100  plasma:red-blue          plasma_range4.jpg
  magick -size 100x100  plasma:tomato-steelblue  plasma_range5.jpg

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

Terlihat juga bahwa warna nada tengah seperti 'tomato' dan 'steelblue' cenderung bekerja lebih baik daripada warna murni seperti 'red' dan 'blue'. Dengan memakai warna yang sama dua kali pada plasma, Anda bisa menghasilkan latar belakang yang didominasi warna itu, tetapi dengan cipratan acak warna-warna yang dekat dengan warna aslinya.

  magick -size 100x100  plasma:black-black          plasma_black.jpg
  magick -size 100x100  plasma:grey-grey            plasma_grey.jpg
  magick -size 100x100  plasma:white-white          plasma_white.jpg
  magick -size 100x100  plasma:yellow-yellow        plasma_yellow.jpg
  magick -size 100x100  plasma:tomato-tomato        plasma_tomato.jpg
  magick -size 100x100  plasma:steelblue-steelblue  plasma_steelblue.jpg

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

Sekali lagi seperti terlihat, warna nada tengah menghasilkan lebih banyak variasi warna pada gambar hasil daripada warna ekstrem seperti hitam, putih, atau kuning. Plasma 'grey' di atas terlihat sangat bagus, memberi efek warna-warni seperti 'indung mutiara', pada dasarnya karena abu-abu memberi kebebasan penuh atas warna yang akan dihasilkan "plasma:". Menormalkan plasma abu-abu 50% yang sempurna akan menghasilkan gambar plasma multi-warna yang sangat seragam, mencakup seluruh rentang warna, termasuk putih dan hitam. |

  magick -size 100x100  plasma:grey50-grey50 -auto-level plasma_grey_norm.jpg

[IM Output]
Sebagai alternatif, Anda bisa sekadar merentangkan kontras warnanya agar lebih tegas, tanpa berlebihan. |

  magick -size 100x100  plasma:grey50-grey50 \
                       -sigmoidal-contrast 8x50%   plasma_grey_contrast.jpg

[IM Output]
Bandingkan gambar ini dengan gambar 'plasma fraktal' di bawah.

Plasma fraktal

Generator plasma juga punya mode fraktal khusus, yang menghasilkan efek sangat berwarna. Warna yang dihasilkan diperkuat untuk menghasilkan perubahan warna yang lebih berlebihan.

  magick -size 100x100  plasma:fractal  plasma_fractal1.jpg
  magick -size 100x100  plasma:fractal  plasma_fractal2.jpg
  magick -size 100x100  plasma:fractal  plasma_fractal3.jpg

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

Sebenarnya ini sangat mirip dengan gambar plasma warna konstan yang sudah kita lihat; keduanya memang dibuat dengan cara yang sama, hanya dengan perubahan warna yang lebih menonjol.
Saya sering mendapati gambar plasma agak 'berisik' (noisy). Karena itu biasanya ia diuntungkan oleh sedikit penghalusan memakai "-blur". Di sini saya menghaluskan noise dari gambar plasma yang di tengah di atas. |

  magick plasma_fractal2.jpg  -blur 0x2  plasma_smooth.jpg

[IM Output]
Gunakan "-paint" untuk membuat bercak-bercak warna acak. |

  magick plasma_fractal2.jpg  -blur 0x1 -paint 8  plasma_paint.jpg

[IM Output]
Atau buat warnanya lebih menonjol dan membulat memakai operator gambar "-emboss", setelah memakai "-blur" untuk menghilangkan noise tingkat rendah. |

  magick plasma_fractal2.jpg  -blur 0x5 -emboss 2 plasma_emboss.jpg

[IM Output]
Dengan "-blur" yang diikuti "-sharpen", Anda bisa menghasilkan pola warna yang lebih pastel daripada yang kita hasilkan dengan "-emboss". |

  magick plasma_fractal2.jpg  -blur 0x5 -sharpen 0x15 plasma_sharp.jpg

[IM Output]
Saya sendiri mendapati gradien plasma yang dipelintir (swirl) sangat bagus sebagai pola latar belakang. |

  magick -size 160x140  plasma:fractal \
          -blur 0x2  -swirl 180  -shave 20x20  plasma_swirl.jpg

[IM Output]

Plasma grayscale

Nah, generator plasma akan selalu menghasilkan warna, bahkan pada warna polos hitam murni. Namun sering kali berguna untuk membuat plasma yang murni grayscale. Ada dua cara sederhana untuk melakukannya. Cara paling sederhana adalah mengambil gambar plasmanya lalu mengonversinya ke grayscale. |

  magick -size 100x100 plasma:fractal -blur 0x2 \
          -colorspace Gray   plasma_greyscale.jpg

[IM Output]
Cara lain adalah menyalin salah satu kanal warna ke dua kanal lainnya, untuk efek lapisan tunggal yang lebih kuat. |

  magick -size 100x100 plasma:fractal -blur 0x2 \
          -channel G -separate   plasma_grey_copy.jpg

[IM Output]
Teknik terakhir adalah memakai "-shade" pada plasmanya. |

  magick -size 100x100 plasma:fractal -blur 0x5 \
          -shade 120x45  -auto-level  plasma_grey_shade.jpg

[IM Output]
Anda mungkin mengira akan mendapat banyak efek cahaya dan bayangan, tetapi plasma mentah begitu acak sehingga "-shade" tampaknya hanya menghasilkan efek 'plasma belang'. Alih-alih memakai plasma fraktal dengan perubahan warnanya yang sangat berlebihan, plasma grayscale bisa dibuat memakai metode plasma warna konstan. Sebagai efek samping, metode ini juga memungkinkan kecerahan keseluruhan gambar plasma grayscale yang dihasilkan ikut dikontrol.

  magick -size 100x100 plasma:black-black \
           -blur 0x2 -colorspace Gray plasma_grey0.jpg
  magick -size 100x100 plasma:grey25-grey25 \
           -blur 0x2 -colorspace Gray plasma_grey1.jpg
  magick -size 100x100 plasma:grey50-grey50 \
           -blur 0x2 -colorspace Gray plasma_grey2.jpg
  magick -size 100x100 plasma:grey75-grey75 \
           -blur 0x2 -colorspace Gray plasma_grey3.jpg
  magick -size 100x100 plasma:white-white   \
           -blur 0x2 -colorspace Gray plasma_grey4.jpg

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

Jika ini kurang tegas, pakai metode salin kanal untuk meng-grayscale-kan gambar plasmanya.

  magick -size 100x100 plasma:black-black   \
          -blur 0x2  -channel G  -separate   plasma_grey5.jpg
  magick -size 100x100 plasma:grey25-grey25 \
          -blur 0x2  -channel G  -separate   plasma_grey6.jpg
  magick -size 100x100 plasma:grey50-grey50 \
          -blur 0x2  -channel G  -separate   plasma_grey7.jpg
  magick -size 100x100 plasma:grey75-grey75 \
          -blur 0x2  -channel G  -separate   plasma_grey8.jpg
  magick -size 100x100 plasma:white-white   \
          -blur 0x2  -channel G  -separate   plasma_grey9.jpg

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

Gambar-gambar plasma grayscale ini sangat berguna untuk pemrosesan lanjutan, memungkinkan Anda menghasilkan efek gambar lain. Misalnya, lihat halaman gambar latar belakang untuk sangat banyak contoh di mana plasma fraktal dipakai menghasilkan berbagai efek menarik.

Menyemai (seed) atau mengulang gambar plasma

Ingat, "plasma:" bisa menghasilkan area yang nyaris hitam murni atau putih murni, atau warna lain apa pun (walau kemungkinan besar tidak murni). Dan meskipun kecil kemungkinan Anda mendapat gambar yang seluruhnya satu warna, itu juga hasil yang mungkin. Jadi saat mendapat hasil yang bagus, Anda mungkin ingin menyimpannya untuk dipakai lagi nanti. Karena itu, skrip yang memakai gambar plasma sebaiknya menyertakan opsi untuk membuat dan memakai ulang gambar acak semacam itu. Yaitu, pembuatan gambar plasma sebaiknya dipisahkan dari bagian lain yang memakai gambar itu, agar bisa dipakai ulang. Namun teknik yang lebih sederhana adalah 'menyemai' (seed) alias menginisialisasi pembangkit bilangan acak IM sehingga 'plasma:' menghasilkan gambar 'acak' yang sama. Dengan begitu skrip atau program bisa ditala untuk menghasilkan pewarnaan atau efek yang bagus atau menarik, berulang-ulang. |

  magick -size 100x100 -seed 4321  plasma:    plasma_seeded.jpg

[IM Output]
Gambar di atas tidak akan pernah berubah; jadi selama saya tidak mengganti angka "-seed", akan selalu ada area 'merah' di pojok kanan bawah. Menariknya, memakai seed yang sama dengan gradien warna awal yang berbeda bisa menghasilkan serangkaian gambar yang, walau acak, mirip pola internalnya.

  magick -size 100x100 -seed 4321 plasma:grey-grey         plasma_rnd1.jpg
  magick -size 100x100 -seed 4321 plasma:white-blue        plasma_rnd2.jpg
  magick -size 100x100 -seed 4321 plasma:green-yellow      plasma_rnd3.jpg
  magick -size 100x100 -seed 4321 plasma:red-blue          plasma_rnd4.jpg
  magick -size 100x100 -seed 4321 plasma:tomato-steelblue  plasma_rnd5.jpg

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

Seperti terlihat, pola warna yang sama hadir di semua gambar di atas, walau dasar warna di baliknya bisa menonjolkan atau menyamarkan bagian dari pola bersama itu. Satu peringatan terakhir. Operator IM lain juga bisa memakai pembangkit bilangan acak, misalnya fungsi 'rand()' pada "-fx", pengaturan 'random' pada "-virtual-pixel", operator dither "-random-threshold", dan operator "-noise". Karena itu sebaiknya semai pembangkitnya tepat sebelum penggunaan spesifik pembangkit bilangan acak. Sejak IM v6.3.4-3, pembangkitnya juga bisa diacak ulang memakai "+seed". Jadi menempatkan pengaturan ini setelah 'plasma ber-seed' Anda memastikan operator selanjutnya menghasilkan hasil acak dengan benar bila diinginkan. Secara bawaan seed diacak saat IM dimulai, jadi biasanya Anda tidak perlu mengacaknya sendiri dengan "+seed" untuk mendapat hasil acak.

Masalah dalam memakai plasma

Satu masalah yang sebaiknya Anda hindari pada gambar "plasma:" adalah membuatnya dengan rasio aspek tinggi. Itu cenderung mendistorsi efek warna plasma yang normal, menarik warna-warnanya menjadi coretan seperti jarum.

  magick -size 200x50 plasma:  plasma_high_aspect.jpg

[IM Output]

Tidak ada solusi sederhana untuk ini, jadi kecuali memang ini yang Anda inginkan, berhati-hatilah. Ada pula lengkungan diagonal yang nyata dari kiri atas ke kanan bawah pada gambar plasma yang semestinya tidak ada. Artinya, ada semacam cacat 'bias spasial' dalam algoritmanya. Misalnya, seperti ditunjukkan Thomas Maus , jika Anda mencerminkan dan menyambung gambar plasma yang sama, akan selalu tampak huruf 'V' yang jelas pada gambar hasilnya...

  magick -size 60x60 plasma: \( +clone -flop \) +append plasma_flaw.jpg

[IM Output]

Ini semestinya tidak terjadi. Tetapi masalahnya tampak terlalu dalam untuk bisa diperbaiki tanpa pada dasarnya menulis ulang seluruh fungsi pembangkit plasma.


Gambar acak

Noise acak mentah

Sejak IM v6.3.5, gambar yang murni acak bisa dibuat dari gambar yang ada memakai pembangkit noise, yaitu "+noise" dengan metode 'Random'. |

  magick -size 100x100 xc:   +noise Random   random.png

[IM Output]
Jika IM Anda lebih tua dari itu, gambar noise acak murni tetap bisa dibuat memakai operator FX rakitan sendiri, "-fx", yang lebih lambat. |

  magick -size 100x100 xc: -fx 'rand()'   random_fx.png

[IM Output]
Atau, demi kecepatan, pakailah operator "-spread" untuk mengacak sebuah gradien (secara terpisah untuk ketiga kanal warna) atau memakai gambar lain. |

  magick -size 100x100 gradient: -separate \
          -virtual-pixel tile   -spread 200   -combine  random_spread.png

[IM Output]
Hasilnya mungkin tampak sangat acak, tetapi ia menghasilkan rentang warna (atau sekadar nilai warna) yang lebih terkendali.

Bintik acak (debu piksel)

Membuat gambar berisi piksel acak yang tersebar juga bisa sangat berguna. Ingat saja bahwa masing-masing dari ketiga kanal warna sebuah gambar acak bisa dianggap sebagai gambar grayscale acak terpisah, dan kanal-kanal ini bisa digabungkan dengan berbagai cara. Misalnya, Anda bisa membuat mask berisi titik-titik acak dengan lebih dulu menerapkan threshold pada satu kanal warna ('G' alias kanal hijau), lalu memisahkannya sebagai gambar grayscale. |

  magick random.png  -channel G -threshold 5% -separate \
          +channel -negate    random_mask.png

[IM Output]
Karena tiap warna adalah nilai acak yang linear, persentase threshold yang dipakai di atas langsung menentukan kepadatan piksel yang terpilih. Anda bisa melangkah lebih jauh dan memakai satu kanal warna ('G' alias kanal hijau) untuk memilih nilai acak dari kanal warna lain ('R' alias kanal merah), lewat berbagai metode komposisi gambar.

  magick random.png   -channel G -threshold 5% -negate \
          -channel RG -separate +channel \
          -compose Multiply    -composite   random_black.png
  magick random.png   -channel G -threshold 5% \
          -channel RG -separate +channel \
          -compose Screen      -composite   random_white.png
  magick random.png   -channel G -threshold 5% -negate \
          -channel RG -separate +channel \
          -compose CopyOpacity -composite   random_trans.png

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

Gambar jenis ini bisa langsung dipakai untuk membuat animasi gemerlap. Namun pemrosesan lanjutan, terutama pada versi berlatar hitam, memungkinkan titik-titiknya diperbesar berdasarkan intensitas grayscale-nya, atau membuat coretan dan/atau kilau bintang dari titik-titik itu. Contohnya lihat pembangkit bintang. Seperti pada gambar plasma ber-seed, Anda juga bisa memakai pengaturan "-seed" untuk menginisialisasi lebih dulu pembangkit bilangan acaknya. Ini memungkinkan gambar acak yang sama dihasilkan berulang kali pada mesin tertentu, sama seperti pada gambar plasma.

Gambar acak di-blur (gumpalan acak)

Nah, meskipun gambar acak bisa langsung dipakai untuk efek berbintik, gambar yang murni acak umumnya tidak terlalu berguna. Tetapi dengan mem-blur gambar yang murni acak, Anda memasukkan semacam keteraturan 'lingkungan', sehingga piksel-piksel berdekatan menjadi saling terkait. Misalnya, di sini saya mem-blur satu gambar acak saja, membuat nilai-nilai acaknya menghasilkan 'gumpalan' yang lebih besar alias warna belang.

  magick random.png -virtual-pixel tile  -blur 0x1  -auto-level  random_1.png
  magick random.png -virtual-pixel tile  -blur 0x3  -auto-level  random_3.png
  magick random.png -virtual-pixel tile  -blur 0x5  -auto-level  random_5.png
  magick random.png -virtual-pixel tile  -blur 0x10 -auto-level
random_10.png
  magick random.png -virtual-pixel tile  -blur 0x20 -auto-level
random_20.png

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

Namun perhatikan, tanpa pengaturan virtual pixel, operator "-blur" punya efek tepi yang kuat, yang sebaiknya dihindari. Sebagai bonus, dengan mengubah pengaturan "-virtual-pixel" menjadi 'tile', gambar teracak itu tetap bisa di-tile, dengan warna yang menyambung melewati batas gambar. Kemampuan tiling ini adalah sesuatu yang saat ini tidak mungkin pada gambar plasma acak, dan merupakan akibat bawaan dari gambar acak murni yang memang sudah sangat acak sejak awal. Rona acak di-blur Satu konversi gambar noise acak ter-blur yang menurut saya sangat menyenangkan adalah memetakan nilainya menjadi rona warna HSB. |

  magick random_10.png -set colorspace HSB \
          -channel GB -evaluate set 100% +channel \
          -colorspace RGB random_hues_cyan.png

[IM Output]
Masalah cara di atas adalah blur cenderung menciptakan bercak merah-kuning (nilai rendah) dan merah-magenta (nilai tinggi), dengan pita hijau, sian, dan biru di antaranya. Ini semata akibat cara nilai rona di-blur dan di-level. Solusi idealnya adalah semacam blur-modulus, yang memperhitungkan sifat siklis nilai Hue. Namun operator semacam itu saat ini tidak tersedia, dan mungkin tidak akan pernah ada. Solusi terbaik yang saya tahu adalah sekadar menjumlahkan ketiga kanal acak pada gambar (memakai komposisi Modulus-Add) untuk memperluas rentang nilainya. Ini juga punya efek samping membuat bercak blur lebih kecil, tetapi setidaknya kini Anda mendapat warna pelangi dengan rentang yang lebih dinamis. Ada yang punya ide lebih baik? |

  magick random_10.png -separate -background white \
          -compose ModulusAdd -flatten -channel R -combine +channel \
          -set colorspace HSB -colorspace RGB random_hues.png

[IM Output]
Untuk metode lain memproses gambar acak, lihat gambar plasma di atas, juga membuat latar belakang. Abu-abu acak di-blur Seperti terlihat di atas, Anda mendapat gambar berisi berbagai gumpalan warna primer. Itu karena tiap kanal diproses sepenuhnya terpisah satu sama lain sebagai gambar grayscale. Mari kita ekstrak satu kanal dari tiap gambar di atas supaya struktur gambar ter-blur-nya terlihat...

  magick random.png     -channel G  -separate   random_0_gray.png
  magick random_1.png   -channel G  -separate   random_1_gray.png
  magick random_3.png   -channel G  -separate   random_3_gray.png
  magick random_5.png   -channel G  -separate   random_5_gray.png
  magick random_10.png  -channel G  -separate   random_10_gray.png
  magick random_20.png  -channel G  -separate   random_20_gray.png

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

Hal pertama yang mestinya Anda perhatikan: gambar itu umumnya (tapi tidak selalu) berisi area hitam dan putih dalam jumlah kurang lebih sama. Ini terlihat jika kita men-threshold gambar-gambar acak itu pada 50%

  magick random_0_gray.png   -threshold 50%   random_0_thres.png
  magick random_1_gray.png   -threshold 50%   random_1_thres.png
  magick random_3_gray.png   -threshold 50%   random_3_thres.png
  magick random_5_gray.png   -threshold 50%   random_5_thres.png
  magick random_10_gray.png  -threshold 50%   random_10_thres.png
  magick random_20_gray.png  -threshold 50%   random_20_thres.png

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

Seperti terlihat, Anda mendapat kira-kira 50% area putih dan 50% area hitam, dipisahkan oleh garis berkelok. Kelok garis ini juga berubah mengikuti nilai 'sigma ' yang dipakai untuk mem-blur gambar acak murninya. Dari piksel-piksel individual yang menghasilkan 'salju' hitam-putih, sampai pemisahan gambar yang sangat seragam (walau tetap acak) menjadi dua area hitam dan putih. Untuk contoh lain penggunaan gambar acak, lihat gambar latar belakang, atau untuk melihat pembuatan kanvas teracak, lihat bercak acak warna polos.

Granularitas acak (keteraturan dalam kekacauan)

Ingat, semua gambar acak ter-blur tadi dibuat dari gambar acak awal yang sama, sehingga semuanya berkerabat. Tetapi setiap gambar acak baru yang dibuat akan punya pola yang sama sekali berbeda, walau strukturnya kurang lebih tampak mirip. Tapi pertama, mari beri contoh lengkap pembuatan 'gambar acak ter-blur' dari nol... |

  magick -size 100x100 xc:  -channel G +noise Random \
         -virtual-pixel Tile -blur 0x5 -auto-level \
          -separate +channel   random_5_gray.png

[IM Output]
Pemakaian intensif pengaturan "-channel" untuk membatasi operasi ke kanal 'Green' gambar itu penting, karena mempercepat keseluruhan pembuatan gambar 3 kali lipat. Pemisahan kanal lalu memastikan kita mendapat hasil grayscale murni. Kalau mau, Anda bisa membuang kedua pengaturan "-channel"-nya, yang akan menghasilkan 3 'gambar acak ter-blur' yang sepenuhnya terpisah dan berbeda. Gambar ini punya beberapa karakteristik penting, yang lebih jelas terlihat jika kita membagi gambarnya menjadi tiga kelompok warna yang sama besar (memakai teknik bernama posterisasi); terlihat bahwa di dalam tiap zona hitam dan putih ada lebih banyak gumpalan bundar alias 'granula'. Sebagai contoh... |

  magick random_5_gray.png  -ordered-dither threshold,3  random_5_blobs.png

[IM Output]
Pertama saya ingin menunjukkan bagaimana kita mendapat area terang dan gelap dalam jumlah kurang lebih sama di dalam gambar, tetapi area-area itu saling terhubung oleh warna 'tengah' abu-abu dari gradien yang terbentuk antara area terang dan gelap. Gumpalan alias 'granula' individualnya bervariasi dari satu area ke area lain di seluruh gambar, tetapi semuanya rata-rata berdiameter sekitar tiga sampai empat kali nilai yang dipakai untuk mem-blur gambar acak awal. Nilai blur ini dikenal sebagai 'granularitas ' gambar dan merupakan nilai yang sangat penting, karena pada dasarnya mewakili ukuran rata-rata struktur bundar yang dihasilkan gambar acak itu. Kadang ia disebut 'kelengkungan' (curviness) gambar. Makin besar nilainya, makin besar dan makin lambat kelok-kelok di dalam gambar. Ini faktor terpenting yang menggambarkan sebuah gambar acak ter-blur, jadi mari kita buat segamblang mungkin...

'Granularitas ' sebuah gambar acak (alias faktor blur)
menentukan ukuran struktur bundar di dalamnya

Tentu makin kecil 'faktor blur' alias 'granularitas'-nya, makin kecil atau makin rapat keloknya, sampai Anda mencapai nilai '0'; pada titik itu semua penggumpalan alias 'gumpalan' dalam gambar lenyap, dan yang tersisa hanyalah efek 'noise', 'salju', atau 'debu piksel' yang murni acak.
CATATAN SAMPING: Sebenarnya ukuran 'granula' itu sendiri bisa berubah tergantung faktor threshold yang dipakai untuk membuatnya. Yang benar-benar digambarkan faktor ini adalah jarak rata-rata antara pusat-pusat area putih dan hitam. Makin besar nilainya, makin besar jaraknya, dan makin besar serta makin menyebar bercak-bercaknya untuk menampung jarak yang bertambah itu. Ini menjadi lebih jelas saat kita mulai melihat riak acak di bawah.
Anda juga bisa mencoba operasi Solarize 50% dengan sedikit penyesuaian level tambahan untuk mengekstrak granula hitam dan putih yang terpisah rapi dari gambar. Misalnya, berikut contoh lengkap dengan granularitas '8' dan threshold gumpalan '25%' yang menghasilkan bercak putih dari bagian hitam maupun putih gambar. |

  magick -size 100x100 xc: -channel G +noise random \
          -virtual-pixel tile -blur 0x8 -auto-level  \
          -solarize 50% -separate +channel \
          -threshold 25% -negate   random_granules.png

[IM Output]
Berhati-hatilah: makin besar nilainya, waktu untuk membuat gambar acak ter-blur juga makin lama sekali. Selain itu, saat nilainya mencapai sekitar setengah dimensi gambar terkecil, efeknya berhenti membesar karena gambar acaknya mengendap menjadi satu bercak putih dan satu bercak hitam. Nilai besar tidak disarankan. [IM Output] Sebagai penutup, di kiri ditampilkan animasi siklus patroli hasil memvariasikan 'granularitas' (blur acak) dari satu gambar acak. Animasinya dibuat memakai skrip shell "animate_granularity", yang bisa Anda unduh, pelajari, dan mainkan. Perhatikan bahwa karena gambar acak yang sama dipakai sebagai sumber, 'granula' alias bercaknya tidak benar-benar bergerak, melainkan seperti tumbuh menyatu atau memudar, sehingga menghasilkan 'granula' yang lebih besar seiring granularitas bertambah. Ingat juga: walau jumlah warna dalam animasinya saya kurangi, struktur gambar acak penuhnya sebenarnya adalah gradien mulus antara dua himpunan granula putih dan hitam. Gradien inilah yang membuat gambar ini berguna dalam teknik-teknik lain.

Fluks acak (siklus animasi)

Seperti terlihat di atas, granula atau bercaknya sebenarnya tidak banyak bergerak. Tetapi untuk efek animasi Anda ingin pola yang bergerak mulus dalam waktu. Pola itu juga jangan cuma bolak-balik. Dan terakhir, pola gerakannya jangan sampai tiba-tiba melompat atau tersentak saat animasinya mengulang. Jadi yang kita butuhkan adalah cara membuat pola acak yang berulang secara mulus. Permintaan yang berat. Dan karena harus mulus, semua polanya perlu dibuat dari satu gambar acak yang sama. Berikut sebuah ide untuk membuat pola acak semacam itu. Alih-alih menganggap tiap nilai piksel acak sebagai intensitas acak, kita menganggap nilai itu sebagai nilai 'waktu' yang menentukan kapan piksel itu berada pada intensitas maksimum atau minimumnya. Yaitu, kita mengubah nilai itu menjadi posisi pada sebuah 'gelombang'. Dengan demikian tiap piksel mewakili suatu 'fase' dari kurva sinus. Kedengarannya rumit, tetapi sebenarnya tidak. Kita cukup memakai gambar acak sebagai gambar sumber untuk fungsi Sinusoid. Lalu untuk tiap gambar dalam urutan waktu, kita menyetel 'fase ' waktu untuk titik tertentu itu dalam siklus waktunya.

  magick random.png   -function Sinusoid 1,_{time}_ \
          ... do granular blurring,  and other processing ...

Di mana '_{time}_' berjalan dari '0' sampai '360' sepanjang satu siklus animasi penuh. Hasilnya, alih-alih tiap piksel punya nilai acak yang 'statis', kini nilainya bersiklus dalam lingkaran antara hitam dan putih selama suatu periode waktu. Tiap piksel mengikuti siklus yang sama ini, tetapi karena tiap piksel punya 'fase' yang sama sekali berbeda, ia bersiklus terlepas dari semua piksel lain. Artinya, gambarnya tetap acak, tetapi berubah mulus mengikuti nilai 'waktu' yang diberikan. Bagi yang berjiwa ilmiah, ini sedikit mirip mengamati 'fluks kuantum' yang ada di tingkat sub-atomik, di mana ruang jauh dari keadaan 'statis' yang kita lihat pada skala normal. Karena itulah namanya 'fluks acak '. Misalnya, mari kita buat urutan waktu 12 gambar...

  for i in `seq 0 30 359`; do
    magick random.png  -channel G  -function Sinusoid 1,${i} \
            -virtual-pixel tile -blur 0x8 -auto-level \
            -separate flux_${i}.png
  done

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

Dan satu gambar acak Anda kini bisa menghasilkan seluruh rangkaian gambar yang membentuk siklus. Perhatikan bahwa ekstraksi 'waktu' harus terjadi sebelum pemrosesan lain seperti blur, yang mungkin bagian paling lambat dari seluruh proses pembuatan. Hal lain yang perlu diperhatikan: pada fase '180' (kanan bawah), yang muncul justru negatif persis dari gambar pertama (kiri atas). Yaitu granula 'putih' menjadi granula 'hitam', dan sebaliknya. Bahkan seluruh paruh kedua animasi sebenarnya adalah negatif dari paruh pertama. Ini bisa dipakai untuk memangkas waktu pembuatan animasi 'fluks acak' sederhana. Karena gambarnya menjadi negatif pada fase 180 derajat, tiap granula 'putih' akan perlahan bergerak bertukar tempat dengan granula 'hitam' tetangganya. Tetapi karena seluruh paruh kedua adalah negatif paruh pertama, ia tidak bisa sekadar bergeser bolak-balik, melainkan harus terus bergerak maju untuk kembali ke gambar asal, atau berputar dalam lingkaran, atau sekadar memudar lalu muncul kembali pada saat yang pas. Dengan kata lain, granula putih dan hitam bergerak dalam siklus yang jauh lebih kompleks. [IM Output] Di kanan adalah animasi dari frame-frame di atas... Pola yang berfluktuasi itu sepenuhnya acak, tetapi berubah mulus dari frame ke frame, juga saat animasinya mengulang. Awal maupun akhirnya tidak terlihat pada hasilnya. Kadang muncul gerakan berpusar, kadang tampak seperti semua gumpalan mirip 'gas' tersedot ke sebuah zona gelap, atau sekadar muncul lalu memudar lagi. Ada pula periode gerakan sangat cepat maupun sangat lambat. Benar-benar acak. Ringkasnya: Sifat-sifat yang ada pada gambar acak ter-blur juga ada pada animasi ini. Gambarnya tetap terbagi kurang lebih sama antara segmen putih dan hitam, dan membentuk gumpalan sekitar tiga kali ukuran blur alias granularitas gambar. Tetapi di atas itu, semua bagian gambar dijamin membentuk siklus antara warna lebih terang dan lebih gelap, karena separuh siklusnya adalah negatif dari separuh lainnya. Satu hal yang mungkin belum Anda sadari: akibat konversi nilai linear acak menjadi bentuk gelombang sinusoid, pemisahan warna putih-hitamnya menjadi lebih tajam (kontras). Karena itu sisi pengurang-kontras dari operator kontras sigmoidal mungkin perlu dipakai untuk membuat hasilnya tidak terlalu 'menggumpal', dan menonjolkan gradien di antara granula, bukan granulanya sendiri. Nah, ini baru titik awal dari apa yang bisa dilakukan dengan animasi acak siklis. Semua yang bisa Anda lakukan dengan gambar acak, seperti dijelaskan di membuat latar belakang, juga bisa diterapkan pada 'animasi fluks acak ' Misalnya, mari tampilkan gerakan granula 'putih'-nya saja... |

  magick flux_anim.gif -threshold 70% flux_thres_anim.gif

[IM Output]
Atau membuat filamen listrik yang berubah-ubah dan perlahan mengalir di atas gambar. |

  magick flux_anim.gif  \
          -sigmoidal-contrast 30x50% -solarize 50% -auto-level \
          -set delay 20 filaments_anim.gif

[IM Output]
Perhatikan: karena separuh siklus adalah negasi dari paruh pertama, dan kita memakai Solarize untuk melipat warna putih dan hitam menjadi satu, siklusnya sebenarnya berulang dua kali dalam satu siklus animasi. Sebenarnya perlu jauh lebih banyak frame untuk menghilangkan sebagian perubahan sangat cepat yang terjadi.
Agar gerakannya lebih sulit ditebak untuk urutan siklis yang lebih panjang, Matematika gradien juga bisa dipakai untuk menggabungkan beberapa siklus sinusoid, dari beberapa gambar acak, atau bahkan cukup memakai kanal warna lain dari gambar acak yang sama.

FUTURE: Create even less predictable, long time 'harmonic' cycles.

Riak acak

Dengan menambahkan satu variasi lagi pada gambar acak ter-blur, kita bisa menambah satu tingkat kompleksitas yang membuat gambar-gambar ini jauh lebih berguna, dan memberi kita satu variabel kendali lagi di samping granularitas-nya. Tapi pertama perlu diingat bahwa gambar acak tidak hanya terdiri dari area terang dan gelap, tetapi juga mengandung lereng di antara area-area itu. Dengan memakai lereng itu sebagai masukan bagi fungsi Sinusoid, Anda bisa membuat riak-riak di antara bercak-bercak dalam gambar. Perhatikan perbedaan kunci penggunaan fungsi Sinusoid di sini dibanding contoh fluks acak sebelumnya: kali ini fungsinya diterapkan pada gambar SETELAH dihaluskan dengan blur, bukan sebelumnya. Juga dalam hal ini nilai 'frekuensi '-lah, bukan nilai 'fase ' yang kedua, yang lebih penting. Sebagai contoh...

  magick random_10_gray.png  -function Sinusoid 1,90   ripples_1.png
  magick random_10_gray.png  -function Sinusoid 2,90   ripples_2.png
  magick random_10_gray.png  -function Sinusoid 3,90   ripples_3.png
  magick random_10_gray.png  -function Sinusoid 4,90   ripples_4.png

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

Seperti terlihat, makin besar 'frekuensi ' fungsi Sinusoid, makin banyak riak yang ditambahkan ke gradien di antara 'granula'. 'Frekuensi ' '1' pada dasarnya mengubah gumpalan terang maupun gelap pada gambar sumber menjadi putih, dan menyisakan celah gelap di antaranya. 'Frekuensi ' '2' menyelipkan satu 'punggungan' alias 'riak' ekstra di celah gelap itu. Seiring frekuensinya naik, makin banyak 'riak' yang muncul antara area paling terang dan paling gelap dari gambar asal, membuatnya makin kompleks. Seiring jumlah punggungan bertambah, Anda bisa kehilangan jejak 'gumpalan' alias 'granula' asal dalam gambar. Ini bisa diperbaiki dengan memodifikasi gradiennya sebelum riaknya ditambahkan: entah 'memotong' gradien memakai penyesuaian level, atau memampatkan nada tengah memakai kontras sigmoidal. Ini memberi 'granula' sedikit massa alias luas, menyediakan area 'tenang' di antara riak-riak.

  magick random_10_gray.png        -level 25%            random_enhanced.png
  magick random_enhanced.png  -function Sinusoid 4,90    ripples_4e.png
  magick random_10_gray.png   -sigmoidal-contrast 10,50% random_sigmoidal.png
  magick random_sigmoidal.png -function Sinusoid 4,90    ripples_4s.png

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

Kedua metode punya kelebihan dan kekurangan, tetapi intinya keduanya memperbesar granula, walau tidak memperbesar jarak antara himpunan granula putih dan hitam. Efek sampingnya tentu saja pemampatan riak di antara kedua himpunan granula.
Nilai kedua '90' yang dipakai pada contoh di atas adalah 'fase ' dari fungsi Sinusoid. Ia menentukan warna yang akan diambil granula 'hitam' pada gambar sumber di gambar 'beriak' hasilnya.

  magick random_enhanced.png  -function Sinusoid 3,0     ripples_3e000.png
  magick random_enhanced.png  -function Sinusoid 3,90    ripples_3e090.png
  magick random_enhanced.png  -function Sinusoid 3,180   ripples_3e180.png
  magick random_enhanced.png  -function Sinusoid 3,270   ripples_3e270.png

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

Warna granula 'putih' bergantung pada 'fase ' sekaligus pecahan 'frekuensi ' yang diterapkan. Nilai 'frekuensi ' bulat membuat granula putih dan hitam berubah warna bersama-sama (mengikuti 'fase '-nya), sehingga dengan fase '90' keduanya menjadi putih. Namun jika Anda menerapkan nilai 'frekuensi ' pecahan, katakanlah '0.5', granula 'sumber putih' menjadi negatif dari granula 'sumber hitam' (sebagaimana ditentukan 'fase '-nya). |

  magick random_enhanced.png  -function Sinusoid 3.5,90    ripples_3.5e.png

[IM Output]
Perhatikan bahwa untuk sudut 'fase yang 'abu-abu', salah satu granula dikelilingi cincin putih, sedangkan yang lain dikelilingi cincin hitam. Jika nilai 'frekuensi ' berpecahan '0.5' dipakai, riak pertama di sekeliling tiap bercak akan seluruhnya putih atau seluruhnya hitam, tergantung 'fase ' yang dipakai. | _'Frekuensi' selain bilangan bulat atau '0.5' tidak disarankan, karena kedua himpunan granulanya tidak akan tersinkron dengan cara apa pun.

Demikian pula fase selain kelipatan 90 derajat tidak disarankan, kecuali saat membuat 'animasi riak' (lihat di bawah).

Nilai fase '0' disarankan saat membuat 'peta dispersi' (lihat di bawah), karena meminimalkan distorsi di dalam area 'granula' yang dipertegas.
Seperti sebelumnya pada fluks acak, Anda bisa mengubah '_fase
' seiring waktu untuk membuat animasi riak yang bergerak dari satu himpunan granula ke himpunan lainnya. Ini bekerja sangat baik tanpa peningkatan kontras apa pun. |

  for i in `seq 0 30 359`; do
    magick random_10_gray.png -function Sinusoid 3.5,${i} miff:-
  done |
    magick miff:- -set delay 15 -loop 0 ripples_anim.gif

[IM Output]
CATATAN SAMPING: teknik yang dipakai di atas dikenal sebagai "MIFF: ter-pipeline" dan hal itu dimungkinkan karena format file MIFF:" bisa begitu saja 'menyambung' gambar-gambar untuk membentuk file multi-gambar. Satu catatan: animasinya tampak berubah jauh lebih lambat daripada animasi fluks yang kita buat di atas. Itu karena dalam satu siklus animasi sebuah riak hanya menempuh jarak pendek, sedangkan pada animasi 'fluks' perubahannya menempuh jarak dari granula putih besar ke granula hitam hanya dalam setengah siklus, lalu kembali. Nah, Anda bisa menggabungkan animasi riak di atas dengan animasi 'fluks' di baliknya dari sumber gambar acak yang sama untuk menghasilkan bentuk yang jauh lebih dinamis dan mengalir, tetapi waspadai perbedaan kecepatan animasi itu. Misalnya, di sini saya cukup mengambil animasi fluks yang dibuat di atas, lalu menambahkan riak padanya. Riaknya dalam hal ini bergerak hanya karena gradien pada animasi fluksnya bergerak. |

  magick flux_anim.gif -function Sinusoid 3.5,0 flux_rippled_anim.gif

[IM Output]
Anda juga bisa menganimasikan riaknya sendiri di dalam animasi. Hanya saja mungkin perlu 'laju siklus fase' yang jauh lebih besar untuk riaknya (ekspresi 'j = 5 * i'). Dan karena ini siklus di dalam siklus, animasinya harus jauh lebih panjang: 60 frame dalam kasus ini. Namun itu sekaligus menguntungkan karena memperlambat gerakan 'fluks' yang lebih besar juga. |

  for i in `seq 0 10 359`; do
    j=`expr $i \* 5`
    magick random.png -channel G \
            -function Sinusoid 1,${i} \
            -virtual-pixel tile -blur 0x8 -auto-level \
            -function Sinusoid 2.5,${j} \
            -separate +channel miff:-
  done |
    magick miff:- -set delay 15 -loop 0 ripples_flux_anim.gif

[IM Output]
Perhatikan pada gambar kedua bagaimana riak mula-mula tampak keluar dari satu titik, lalu belakangan mulai kembali masuk ke titik yang sama, walau tidak pernah sekadar membalik arah. Pembangkit siklus fluks multi-siklus yang lebih baik semestinya menghilangkan keanehan kecil ini dengan membuang efek 'negatif' pada animasi fluks yang mendasarinya.
FUTURE: Use of Rippled Random Images for Dispersion Mapped Distortions.


Kanvas yang di-tile

Gambar tile bisa sangat besar atau sangat kecil, dirancang untuk saling bersambung menyamping dan menurun guna menutupi area yang luas. Berkat World Wide Web, terjadi ledakan gambar tile yang tersedia untuk dipakai (menemukan yang Anda mau itu soal lain). Di bawah ini sekumpulan gambar tile yang saya salin dari Anthony's Icon Library untuk dipakai di seluruh halaman contoh ini. [IM Output]
bg.gif | [IM Output]
tile_aqua.jpg | [IM Output]
tile_water.jpg | [IM Output]
rings.jpg | [IM Output]
tile_disks.jpg | [IM Output]
tile_weave.gif
Saat ini ada cukup banyak cara untuk men-tile sebuah gambar menutupi area luas. Anda bisa "-tile" gambar apa pun sehingga sepenuhnya menggantikan gambar latar aslinya (memakai operator compose "Copy"). (Detailnya lihat Tile Compositing.) |

  magick composite -tile tile_weave.gif -size 60x60  xc:none   tile_copy.gif

[IM Output]
Cara lain adalah membaca gambar tile-nya memakai coder "tile:", dan men-tile-nya ke ukuran tertentu. |

  magick -size 60x60 tile:bg.gif  tile_size.gif

[IM Output]
| _Perhatikan bahwa coder "tile:" mengganti transparansi apa pun pada gambar dengan warna latar belakang saat ini. Itu karena secara internal ia membuat kanvas seukuran yang diminta lalu 'menimpakan' gambar tiling-nya ke kanvas itu.

Jika ingin mempertahankan transparansi, setel "-background none" atau "-compose SRC" (lihat metode compose Src untuk detailnya)._
Ini bisa dipakai untuk membuat gambar yang di-tile jauh lebih besar dari kebutuhan, yang lalu ditimpakan ke gambar asal memakai "-composite". Jika gambar tile-nya sebagian transparan, metode "-compose" 'Over' perlu ditentukan. Ini metode tiling yang sangat lambat, terutama untuk gambar besar, dan Anda menghadapi masalah menentukan seberapa besar gambar yang perlu dibuat untuk penimpaannya. |

  magick test.png -size 200x200 tile:tile_disks.jpg \
          -composite  tile_over.gif

[IM Output]
Dengan menentukan sebuah tile sebagai 'pola isian tile' bagi operator "-draw", gambar tile itu bisa digambar di atas gambar lain, membentuk bentuk atau figur apa pun yang Anda suka. Ini karena pengaturan "-tile" menimpa pengaturan warna "-fill" apa pun yang dipakai draw. Lihat pengaturan menggambar MVG. |

  magick -size 60x60 xc: -tile tile_aqua.jpg \
          -draw "circle 30,30 2,30"   tile_draw.gif

[IM Output]
Ini hanya bekerja untuk "-draw" dan operator seperti "-annotate" yang juga memakai "-draw" untuk menjalankan fungsinya. Ia tidak bekerja untuk operator gambar yang memakai warna "-fill" secara langsung, seperti "label:", "caption:", dan "text:". Namun "-draw" punya bawaan beberapa primitif warna khusus, misalnya menyetel ulang seluruh piksel gambar ke warna fill atau pola tile (bila disetel). |

  magick test.png   -tile tile_water.jpg  -draw "color 0,0 reset" \
          tile_reset.gif

[IM Output]
Ini sebenarnya persis metode yang dipakai beberapa cara kanvas warna polos dengan warna tertentu. Hanya saja di sini kita memakai "-tile" alih-alih warna "-fill".
Metode yang lebih maju adalah memakai operator Distort dengan pengaturan khusus Distort Viewport yang disetel ke ukuran gambar asal (memakai artefak global terdefinisi dan persen escape). Ini pada dasarnya memetakan virtual pixel dari tile kecil itu, yang mengelilingi gambar tile kecilnya, untuk menghasilkan kanvas yang di-tile lebih besar. |

  magick rose: -set option:distort:viewport '%g' +delete  \
          tree.gif -virtual-pixel tile -filter point -distort SRT 0 \
          tile_distort_sized.gif

[IM Output]
Lihat tiling lewat distort (di bawah), tempat kita akan memakai teknik yang sama untuk men-tile gambar yang sudah ada di memori.

Kanvas tiling dengan offset

Kadang Anda butuh kendali lebih atas posisi persis tekstur latar, entah untuk menyelaraskan pola tile dengan gambar lain, atau untuk menghindari korelasi buruk dengan bagian lain dari gambar akhir. Untuk banyak metode tiling standar, ini bisa dicapai lewat pengaturan "-tile-offset". Misalnya, di sini saya menggulung (roll) gambar tile yang dipakai untuk langsung membuat kanvas yang di-tile memakai "tile:" atau "pattern:".

  magick -size 80x80 -tile-offset +30+30 tile:rose: offset_tile.gif
  magick -size 80x80 -tile-offset +20+20 \
                                 pattern:checkerboard offset_pattern.gif

[IM Output] [IM Output]

| Pengaturan tile offset rusak sebelum IM versi 6.3.9-9: offset 'X' dipakai untuk nilai offset 'X' sekaligus 'Y' (nilai 'Y' yang diberikan diabaikan). Artinya, walau contoh di atas tetap bekerja (offset X dan Y-nya sama), Anda mungkin tidak mendapat hasil yang diharapkan saat kedua nilainya berbeda.
Ini juga bekerja untuk pengaturan latar "-texture" pada "magick montage". |

  montage tree.gif     -geometry +24+24 \
          -tile-offset +30+30 -texture rose: offset_texture.gif

[IM Output]
Pengaturan ini juga bisa dipakai dengan mendefinisikannya sebelum pengaturan "-tile" atau "-fill". Sebagai contoh... |

  magick -tile-offset +30+30  -tile rose: \
          -size 80x80 xc: -draw 'color 30,20 reset'    offset_tile_fill.gif

[IM Output]
Pastikan pengaturan "-size" disetel ulang sebelum mendefinisikan gambar "-tile"-nya, tetapi setelah gambar lain mana pun selesai dibaca. |

  magick -size 80x80  xc: \
          -tile-offset +20+20 +size -tile pattern:checkerboard \
          -draw 'color 30,20 reset'  offset_pattern_good.gif

[IM Output]
Bagaimanapun, mungkin paling aman mendefinisikan tile offset dan gambar tile-nya tepat sebelum penggunaan pertamanya, yang hasilnya sama dengan solusi di atas.

Tiling dengan gambar yang sudah ada di memori

Men-tile gambar yang sudah Anda pegang di memori (hasil buatan atau modifikasi) tidaklah lugas, dan hanya tersedia beberapa metode tidak langsung.

Meng-clone dan menyambung gambar tile

Jika ukuran persis gambar yang di-tile tidak jadi soal, Anda bisa sekadar menyambung (append) gambarnya beberapa kali. Misalnya, di sini kita men-tile gambarnya dalam susunan 3x3. |

  magick tree.gif \
          \( +clone +clone \) +append \
          \( +clone +clone \) -append \
          tile_clone.gif

[IM Output]
Metode tiling ini punya kelebihan: Anda bisa men-tile-nya sambil mencerminkan (flip-tile alias mirror tile). |

  magick tree.gif \
          \( +clone -flop +clone \) +append \
          \( +clone -flip +clone \) -append \
          tile_clone_flip.gif

[IM Output]
Umumnya metode ini hanya praktis bila Anda punya gambaran seberapa besar gambar yang di-tile. Dan karena clone sebenarnya sangat cepat dan efisien, ini metode tiling yang cukup sederhana dan cepat, apalagi jika hasilnya dipakai untuk men-tile lebih lanjut gambar yang lebih besar itu.

Tiling memakai MPR: (memory program register)

Metode yang lebih baik adalah menyimpan gambarnya ke format file khusus 'dalam memori' "mpr:", alias 'memory program register'. Dari register ini lalu bisa dipakai pengaturan "-tile", atau memakai pembaca file gambar khusus "tile:"; keduanya hanya bisa disetel dari format file gambar yang 'tersimpan'. Misalnya memakai "tile:" untuk membuat gambar yang di-tile berukuran tertentu... |

  magick tree.gif   -write mpr:tile +delete \
          -size 100x100 tile:mpr:tile    tile_mpr.gif

[IM Output]
| Ingat, coder "tile:" mengganti transparansi apa pun pada gambar dengan warna latar belakang saat ini. (lihat di atas)
Atau men-tile di atas gambar yang ada, dengan menyetel pola isian "-tile" atau "-fill", lalu memakai "-draw" untuk melakukan reset warna (lihat primitif isian warna)... |

  magick tree.gif  -write mpr:tile +delete \
          granite: -fill mpr:tile  -draw 'color 0,0 reset' \
          tile_mpr_reset.gif

[IM Output]
| Jika men-tile dengan gambar yang mengandung transparansi, pastikan gambar tujuannya juga punya transparansi dengan "-alpha set". Jika tidak, gambar hasilnya akan memperlihatkan warna transparansi 'tersembunyi' milik tile-nya.
Atau menggambar memakai primitif draw lain, misalnya lingkaran, dengan pola isian itu. |

  magick tree.gif -write mpr:tile +delete \
          granite:  -tile mpr:tile  -draw 'circle 64,64 10,50' \
          tile_mpr_fill.gif

[IM Output]
Nama setelah "mpr:" boleh apa saja; ia hanya label nama register 'mpr' yang dipakai menyimpan gambarnya (di memori). Ia bahkan boleh berupa label, angka, warna, atau bahkan nama file.

Tiling memakai virtual pixel lewat distort

Pada metode ini kita memakai pengaturan virtual pixel untuk membuat kanvas yang di-tile berukuran besar. Pengaturan ini menentukan seperti apa tampak area di sekeliling gambar sebenarnya (di luar batas gambar normal). Cara termudah mengekstrak virtual pixel adalah memakai operator Distort dengan pengaturan khusus Distort Viewport. |

  magick tree.gif -set option:distort:viewport 100x100+0+0 \
          -virtual-pixel tile -filter point  -distort SRT 0 \
          tile_distort.gif

[IM Output]
Anda juga punya akses ke gaya pengaturan tiling virtual pixel lainnya, seperti 'Mirror' atau bahkan 'CheckerTile', dan bahkan kendali tiling ber-offset yang baik lewat pengaturan viewport. |

  magick tree.gif -set option:distort:viewport 100x100-10-10 \
          -background firebrick  -virtual-pixel CheckerTile \
          -distort SRT 0 +repage    tile_distort_checks.gif

[IM Output]
Dengan memakai operator distorsi umum seperti ini, Anda mendapat bonus tambahan: bisa mendistorsi gambar yang di-tile itu dengan cara-cara yang sangat kompleks. Contohnya bisa dilihat di Distort Affine Tiling. Sebagai contoh yang lebih kompleks, di sini saya memakai distorsi Arc untuk men-tile pohon mengelilingi titik asal yang berada di tengah viewport. Nilai '45' menentukan sudut yang dicakup lebar pohonnya, sedangkan '50' menentukan radius untuk tepi atas tile pohon itu. Sisanya tinggal mengikuti. |

  magick tree.gif -set option:distort:viewport 100x100-50-50 \
          -virtual-pixel tile  -distort Arc '45 0 50' +repage \
          tile_distort_polar.gif

[IM Output]

Memodifikasi pola/tile bawaan IM

Lihat daftar lengkap gambar dan pola bawaan ImageMagick. Ada banyak pola semacam itu, tetapi di sini saya hanya akan melihat satu-dua. Nah, pola bawaan umumnya gambar yang sangat-sangat kecil, yang bisa di-tile menutupi area luas. Namun berdiri sendiri, tampilannya sangat polos dan nyaris tak berguna. Misalnya, berikut salah satu pola yang lebih besar dan lebih menarik yang disediakan... |

  magick pattern:checkerboard  pattern_default.gif

[IM Output]
Gambar pola biasanya di-tile menutupi area yang lebih besar, entah sebagai bagian pembuatan kanvas dengan menyetel "-size", atau sebagai tile isian (lihat kanvas yang di-tile di atas). Tanpa pengaturan ukuran, ukuran tile bawaan polanya yang dipakai, dalam hal ini 30x30 piksel. Anda mungkin memperhatikan bahwa semua pola yang saat ini disediakan IM murni hitam-putih, dengan satu-satunya pengecualian pola 'checkerboard' yang saya pakai pada contoh terakhir. Berikut satu pola yang sangat saya sukai sebagai pola tile... |

  magick -size 60x60 pattern:hexagons  pattern_hexagons.gif

[IM Output]
Jika tidak puas dengan warna-warna ini, Anda bisa menggantinya memakai operator gambar "-opaque". |

  magick -size 60x60 pattern:hexagons \
          -fill blue -opaque black   -fill skyblue -opaque white \
          pattern_colored.gif

[IM Output]
Jika ingin mewarnai pola "checkerboard", paling baik lakukan dengan lebih dulu memakai "-auto-level" untuk memetakan kedua abu-abunya ke hitam dan putih sebelum mengganti kedua warna itu. Di sini, alih-alih memakai "-opaque" untuk mengganti warna, saya memakai operator "+level-colors" (ditambahkan IM v6.2.4-1), yang sedikit lebih sederhana dipakai. |

  magick -size 60x60 pattern:checkerboard -auto-level \
          +level-colors red,blue     pattern_color_checks.gif

[IM Output]
Operator "-floodfill" juga bisa dipakai untuk mewarnai polanya. Namun agar bekerja benar, ini harus dilakukan sebelum Anda men-tile pola yang sudah dimodifikasi. Dalam kasus ini saya juga perlu memperluas tile-nya tiga kali untuk mewarnainya dengan pola warna teratur yang saya inginkan. |

  magick -size 30x54 pattern:hexagons \
          -fill tomato     -opaque white \
          -fill dodgerblue -draw 'color 10,10 floodfill' \
          -fill limegreen  -draw 'color 10,25 floodfill' \
          -roll +15+27 \
          -fill dodgerblue -draw 'color 10,10 floodfill' \
          -fill limegreen  -draw 'color 10,25 floodfill'   miff:- |\
    magick -size 100x100 tile:- pattern_color_hexagons.gif

[IM Output]
Saya memakai pipeline dua perintah di atas untuk memisahkan pembuatan pola berwarna dari penggunaannya. Jika ingin melakukannya dalam satu perintah, lihat tiling dengan gambar di memori di atas. Pola tiling sederhana juga bisa dilengkungkan dan didistorsi untuk menghasilkan variasi yang menarik. Misalnya efek 'berkerut' (teknik atas kebaikan efek wrinkle IM dari Font Image Generator) pada pola heksagon yang menurut saya sangat menarik |

  magick -size 160x100 pattern:hexagons \
          -wave 3x100 -background white -rotate 90 -wave 4x66 -rotate -87 \
          -gravity center -crop 120x90+0+0 +repage   pattern_distorted.gif

[IM Output]

Memodifikasi gambar tile

Masalah terbesar yang dihadapi orang saat memodifikasi tile, entah tile yang sudah ada maupun salah satu pola bawaan, adalah banyaknya operasi gambar yang merusak sifat tileable gambar. Misalnya, di sini saya mengambil pola bawaan 'hexagon' dan mencoba memodifikasinya untuk menghasilkan pola grayscale ter-shade berupa garis heksagonal lebar. |

  magick pattern:hexagons  -rotate 90 \
          -blur 0x1  -edge 1  -negate  -shade 120x45 \
          miff:- |\
    magick -size 100x100 tile:-   tile_mod_failure.jpg

[IM Output]
Perintah pertama membuat 'gambar tile'-nya, sedangkan yang kedua benar-benar men-tile gambar itu, supaya kita bisa melihat bagaimana semuanya bersambung. Seperti terlihat, gambar tile hasilnya TIDAK menyambung dengan benar, dengan distorsi tepi artifisial yang jelas terlihat pada gambar yang di-tile. Pada dasarnya kita kehilangan keseragaman tile asal di sepanjang tepi gambar. Salah satu solusinya adalah pengaturan virtual pixel khusus, yang membuat operator menganggap gambarnya menyambung melingkar di tepi-tepinya saat mencari warna di luar batas gambar yang sebenarnya. |

  magick pattern:hexagons  -rotate 90  -virtual-pixel tile \
          -blur 0x1  -edge 1  -negate  -shade 120x45 \
          miff:- |\
     magick -size 100x100 tile:-   tile_mod_vpixels.jpg

[IM Output]
Berikut contoh lain: saya menyambungkan dua pola tile yang berkerabat, lalu memakai berbagai efek untuk membuat tile dinding bata yang tidak biasa. |

  magick pattern:leftshingle pattern:rightshingle +append \
          -virtual-pixel tile  -blur 0x0.75 -resize 150% -shade 100x45 \
          -fill Peru  -tint 100%   miff:- |\
    magick -size 100x100 tile:-   tile_slanted_bricks.jpg

[IM Output]

Alternatif

Ada alternatif selain mengandalkan virtual pixel. Pada dasarnya kita menyediakan sendiri 'piksel tepi virtual' sebelum mengoperasikan gambarnya, untuk menghindari efek tepi apa pun yang mungkin ada. Caranya: men-tile gambar itu lebih dulu ke area yang sedikit lebih besar. Setelah memodifikasi gambarnya, kita bisa mengekstrak ulang tile-nya, menghindari distorsi tepi yang tadi masuk. Tidak perlu jauh lebih besar; tergantung cakupan operasi gambar yang dilakukan. Saya mendapati 15 sampai 40 piksel mestinya menghentikan semua efek tepi pada hasil akhir. Untuk mengekstrak ulang gambarnya kita bisa "-shave" piksel ekstranya, atau "-crop" seukuran tile asal dari tengah gambar yang sudah diproses. Misalnya, di sini saya membuat efek "-shade" 3d memakai pola bawaan 'hexagons'. |

  magick -size 60x60 tile:pattern:hexagons  -rotate 90 \
          -blur 0x1  -edge 1  -negate  -shade 120x45 \
          -gravity center -crop 18x30+0+0 +repage miff:- |\
    magick -size 100x100 tile:-   tile_mod_success.jpg

[IM Output]
Perhatikan bahwa posisi persis tile yang diekstrak tidak penting. Gambar yang tileable bisa dipotong dari mana saja pada gambar yang di-tile, asalkan jauh dari tepi yang terdistorsi, dan Anda memakai ukuran asli tile yang sama. Di sini, alih-alih men-tile gambarnya ke area yang lebih besar, kita memakai teknik 'clone ganda' untuk menggandakan area yang dicakup tile. Setelah selesai, kita tinggal memangkas 50% bagian tengah gambar untuk mendapatkan kembali tile yang sudah dimodifikasi. Artinya kita tidak perlu tahu ukuran persis tile yang sedang diproses. |

  magick pattern:circles \( +clone \) +append \( +clone \) -append \
          -fill grey -opaque black  -blur 0x0.5 -shade 120x45 \
          -gravity center -crop 50%  +repage    miff:- |\
    magick -size 100x100 tile:-   tile_circles.jpg

[IM Output]
Membuat gambar tile. Masalah terbesar yang Anda hadapi saat membuat gambar yang bisa saling menyambung adalah mencocokkan tepi dan pojok gambar agar bisa bersambung mulus. Jika tidak, yang didapat hanyalah sekumpulan kotak persegi yang masing-masing berisi salinan berulang gambar itu. Ini bukan perkara mudah dan bisa jadi pengalaman yang sangat membuat frustrasi dan bikin ingin menjambak rambut sendiri. Objek yang muncul di satu tepi tile harus muncul kembali di sisi lain gambar agar keseluruhannya terbentuk lagi saat gambarnya di-tile. Meskipun ini cukup mudah dilakukan pada gambar buatan komputer, nyaris mustahil menghasilkan gambar tiling yang bagus dari foto dunia nyata. Masalah besar lainnya adalah membuat tile tampak tidak berulang. Satu-satunya solusi sejati adalah membuat gambar tile Anda cukup besar sehingga memuat cukup banyak elemen yang sangat mirip tapi tetap berbeda, sampai pola berulangnya sulit terlihat. Karena itu, membuat tile kecil yang tampak tidak berulang sangatlah sulit.

FUTURE:  Ideas and suggestions for generating tile patterns?  Anyone?

Or roll, add element, roll, add element, etc...

Any and all suggestions and examples accepted.

Suggestions for generating tile from real photos of repeating patterns,
such as water, fallen leaves, clouds, stucco, brickwork, etc...

Generating Escher-like tile patterns.

Tile noise acak

Karena kanvas noise acak mentah sejak awal tidak punya karakteristik tepi (warna tiap piksel sepenuhnya lepas dari semua tetangganya), Anda bisa men-tile-nya tanpa khawatir distorsi tepi. Pada dasarnya ia begitu acak di tingkat piksel sehingga sejak awal pun tidak ada tepi yang cocok, jadi kita tidak kehilangan apa-apa dengan men-tile-nya. Sayangnya sangat sedikit situasi yang memakai gambar noise acak mentah apa adanya untuk keperluan nyata. Ia begitu acaknya sampai tak berguna. Namun dengan memodifikasi gambarnya sambil mempertahankan sifat tileable bawaannya, kita bisa membuat hampir semua pola tile acak yang kita mau. Misalnya mari lihat "-blur" dasar atas tile asalnya, memakai teknik 'memodifikasi tile' yang sama seperti contoh terakhir. |

  magick -size 64x64 xc: +noise Random \
          -virtual-pixel tile -blur 0x6 -auto-level  tile_random.jpg

  magick -size 128x128   tile:tile_random.jpg   tiled_random.jpg

[IM Output]
[IM Output]
Dengan teknik ini hampir semua transformasi bisa diterapkan pada gambar noise acak mentah. Sebagai contoh... |

  magick -size 64x64 xc: +noise Random \
          -virtual-pixel tile  -blur 0x6  -edge 1  -fx G \
          -shade 280x45  -auto-level  tile_random_pits.jpg

  magick -size 128x128 tile:tile_random_pits.jpg tiled_random_pits.jpg

[IM Output]
[IM Output]
Seperti terlihat, jauh lebih sederhana membuat tile acak memakai gambar noise acak mentah, dan hasilnya tidak akan punya distorsi tepi. Transformasi gambar khusus ini tercantum di halaman gambar latar belakang dengan judul "pits". Lihat halaman itu untuk banyak transformasi gambar acak lainnya, beserta contoh tampilannya.

Tiling heksagonal

Alih-alih men-tile secara persegi, gambar 'noise acak' memungkinkan kita membuat jenis tile yang sangat berbeda. Dengan menggandakan dimensi gambar dan meletakkan ulang tile-nya di ruang ekstra itu, tetapi digeser setengah, kita bisa membuat pola tile heksagonal noise acak yang dasar. Ini efek tiling yang sama seperti saat kita men-tile pola bawaan khusus "pattern:hexagons" milik ImageMagick. |

  magick pattern:hexagons  tile_hexagons.gif

  magick -size 64x64  pattern:hexagons  tiled_hexagons.gif

[IM Output]
[IM Output]
Namun perhatikan: agar tile ini tampak 'heksagonal', tile-nya tidak boleh persegi biasa, bahkan tidak boleh persegi yang digandakan. Ukuran tile akhirnya harus persegi panjang. Rasio persis untuk persegi panjang ini sebenarnya melibatkan bilangan irasional, yang tidak bagus untuk pekerjaan gambar dengan larik piksel. Namun rasio kerja yang baik adalah 4:3, yang dipakai kebanyakan gambar komputer dan kamera digital. Di sini kita menimpakan gambar 'noise acak' yang sama (persegi panjang dengan rasio 2:3) dua kali ekstra untuk membuat pola heksagon dasarnya (dalam persegi panjang 4:3). Tile noise acak hasil hex-tile itu lalu ditransformasikan memakai transformasi "paint_3s" dari halaman gambar latar belakang, menghasilkan pola tile heksagonal yang cukup cantik. |

  magick -size 48x64 xc: +noise Random  -write mpr:rand \
          -extent 96x64  -page +48-32 mpr:rand  -page +48+32 mpr:rand \
          -flatten          tile_hex_random.jpg

  magick tile_hex_random.jpg -virtual-pixel tile -blur 0x10 -paint 3 \
          -shade 280x45 -auto-level  tile_hex_layered.jpg

  magick -size 160x160  tile:tile_hex_layered.jpg  tiled_hex_layered.jpg

[IM Output]
[IM Output]
Jika Anda amati pola yang dihasilkan tile ini, fitur spesifik apa pun akan punya 6 salinan fitur yang sama mengelilinginya dalam lingkaran. Inilah pola 'heksagonal' yang dihasilkan tile itu, meskipun ia tetap di-tile dengan pola 'persegi' yang sama seperti semua gambar tiling lain. Satu varian dari pola 'hextile' di atas adalah menggandakan gambar tile-nya secara vertikal, bukan horizontal seperti yang kita lakukan di atas. Hasilnya, pola heksagonalnya terputar sembilan puluh derajat. Namun jenis polanya tetap sama. | _Secara matematis, cara di atas tidak membuat Wallpaper Group baru dari tile yang ada. Baik gambar 'non-heksagonal' asal maupun versi akhirnya sama-sama anggota grup tiling 'p1 ' yang sama.

Yang sebenarnya kita lakukan di atas adalah mengubah pola tiling 'prototile' belah ketupat menjadi 'domain fundamental' persegi panjang yang lebih besar dan selaras ortogonal dari pola tiling yang sama. Dengan begitu Anda lalu bisa men-tile gambarnya memakai metode tiling standar.
_Future: Flip the extra image over to generate a larger tiling pattern (pmg tiling group).
Future: how to cut out (mask) a hexagon from an image so it will tile perfectly, without gaps or overlaps.

Tiling hex rangkap tiga

Seperti saat kita mewarnai pola bawaan "hexagons" (lihat memodifikasi pola/tile bawaan IM di atas), bisa dibuat tiga varian berbeda dari tile awalnya (misalnya dengan rotasi) sebelum memetakan ulangnya menjadi tile yang lebih besar. Tentu, sama seperti saat saya mewarnai pola "hexagons", gambar tile akhirnya perlu diperbesar tiga kali, agar terbentuk pola tile persegi panjang yang berulang. Variasi antara ketiga tile yang dibuat tidak boleh terlalu berbeda, dan harus selamat dari pasca-pemrosesan apa pun; kalau tidak, Anda tidak mendapat manfaat teknik ini. Artinya tile awalnya juga harus cukup besar, supaya fitur khas yang ada tetap terjaga. Misalnya, di sini kita ambil gambar garis yang sangat sederhana, lalu memutarnya untuk menghasilkan 3 variasi serupa. Gambar-gambar terputar ini lalu di-tile tujuh kali ke kanvas lebih besar (6 kali lebih besar) untuk menghasilkan pola hex tiga-gambar. |

  magick -size 24x24 xc: -draw "rectangle 3,11 20,12" tile_line.gif

  magick tile_line.gif -gravity center \
    \( +clone -rotate    0 -crop 24x18+0+0 -write mpr:r1 +delete \) \
    \( +clone -rotate  120 -crop 24x18+0+0 -write mpr:r2 +delete \) \
              -rotate -120 -crop 24x18+0+0 -write mpr:r3 +repage \
              -extent 72x36 \( -page  +0+0 mpr:r3 \) \
    \( -page +24+0  mpr:r1 \) \( -page +48+0  mpr:r2 \) \
    \( -page -12+18 mpr:r1 \) \( -page +12+18 mpr:r2 \) \
    \( -page +36+18 mpr:r3 \) \( -page +60+18 mpr:r1 \) \
    -flatten tile_hex_lines.jpg

  magick -size 120x120  tile:tile_hex_lines.jpg  tiled_hex_lines.jpg

[IM Output]
[IM Output]
[IM Output]
Namun cara di atas hanya bekerja untuk men-tile bentuk kecil di tengah gambar asal. Ia tidak bekerja baik untuk gambar umum. Untuk hex tiling gambar umum kita juga perlu me-mask segitiga sama sisi. Potongan-potongannya lalu diputar sehingga tepi-tepi segitiga sama sisinya saling tercermin. Ini bukan tugas mudah.

Tiling cermin diagonal

Berikut satu cara mengambil gambar persegi apa pun dan mengubahnya menjadi 8 gambar tercermin mengelilingi satu titik pusat. Tepatnya, kita membuat pola tiling 'p4m ' yang kompleks. Saya mula-mula membuat gambar rona acak, dan memakai separuh kiri-bawah gambar sumbernya, saya mencerminkannya secara diagonal, lalu horizontal dan vertikal. |

  magick -size 50x50 xc: +noise Random -virtual-pixel Tile -blur 0x5 \
          -auto-level -separate -background white \
          -compose ModulusAdd -flatten -channel R -combine +channel \
          -set colorspace HSB -colorspace RGB   tile_diag_source.jpg

  magick tile_diag_source.jpg     \( +clone -transpose \) \
          \( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
          -composite \
          \( +clone -flop -chop 1x0 \) +append \
          \( +clone -flip -chop 0x1 \) -append \
          tile_diag_mirror.jpg

[IM Output]
[IM Output]
Cermin diagonalnya dibuat dengan melakukan Transpose lalu memakai mask yang dibuat lewat Voronoi, sparse color. Perhatikan bahwa cermin diagonal ini otomatis berbagi satu garis piksel melintasi cerminnya dengan cara yang sama, akibat geometri piksel dari persegi itu. Saya juga membuang satu set piksel di sepanjang tepi sebelum membuat flip dan flop vertikal dan horizontal. Saya juga menyarankan membuang satu baris dan kolom piksel lagi di tepi atas dan kiri sebelum memakai gambar ini sebagai 'tile'. Tidak wajib, tetapi menurut saya hasilnya lebih bagus. Tanpa membuang satu baris dan kolom piksel tepi itu, Anda mendapat 'jahitan' jelek berupa piksel ganda di tempat gambar-gambar bersambung. Alternatifnya adalah men-tile dulu gambar acak mentahnya, baru melakukan konversi pola latar belakang; dengan itu kecil kemungkinan muncul 'kesan terpotong' di sepanjang garis cermin, melainkan transisi yang lebih mulus. |

  magick -size 51x51 xc: +noise Random   \( +clone -transpose \) \
          \( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
          -composite \
          \( +clone -flop -chop 1x0 \) +append \
          \( +clone -flip -chop 0x1 \) -append \
          -chop 1x1 \
          \
          -virtual-pixel Tile -blur 0x5 -auto-level \
          -separate -background white \
          -compose ModulusAdd -flatten -channel R -combine +channel \
          -set colorspace HSB -colorspace RGB    tile_p4m.jpg

[IM Output]
Bagian pertama adalah pembuatan 'tiling dari data acak'; di paruh kedua saya mengubah data acaknya menjadi pemetaan 'rona'. Saya juga menambahkan piksel ekstra pada gambar awal, yang nanti dipenggal seperlunya untuk menghasilkan gambar tiling.
Untuk pengantar yang lebih lengkap tentang gambar tiling dan matematika di baliknya, lihat Wikipedia: Wallpaper Group. Yang kita jelajahi di atas hanyalah sedikit dari sekian banyak pola tiling yang bisa Anda buat.
Grup 'p4g ' hampir persis sama dengan tiling 'p4m ' di atas, tetapi memakai rotasi 180 derajat atas persegi-persegi tercermin, alih-alih memakai flip, untuk membentuk gambar tiling penuhnya. Namun karena gambar-gambarnya tidak tersambung lewat cermin, Anda tidak bisa memakai gambar yang ada sebagai sumber tile-nya, sebab tepi-tepinya akan menjadi terputus dan tak menyambung. Namun data acak mentahnya bisa di-tile lalu gambar tile hasilnya diproses, untuk memperoleh hasil yang mulus. |

  magick -size 50x50 xc: +noise Random   \( +clone -transpose \) \
          \( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
          -composite \
          \( +clone -rotate -90 \) +append \
          \( +clone -rotate 180 \) -append \
          \
          -virtual-pixel Tile -blur 0x5 -auto-level \
          -separate -background white \
          -compose ModulusAdd -flatten -channel R -combine +channel \
          -set colorspace HSB -colorspace RGB    tile_p4g.jpg

[IM Output]
Perhatikan bahwa berkat sifat tiling yang tanpa pencerminan ini, baris atau kolom piksel yang terduplikasi tidak perlu dibuang dari tepinya sebelum menyambung. Meski begitu, melakukannya juga tidak merugikan, jika Anda ingin mengikuti jenis proses yang sama untuk kedua kasus.