Contoh penggunaan ImageMagick -- serba-serbi
- Kata pengantar dan indeks contoh penggunaan ImageMagick
- Interpolasi (pencarian warna antar-piksel)
- Metode interpolasi sederhana
- Bilinear, Mesh, Catrom, Spline
- Interpolasi di atas latar belakang
- Interpolasi garis yang diputar
-
Piksel virtual (pencarian warna yang meleset dari gambar)
-
Edge, Tile, Mirror, Transparent, Black, Gray, White, Background,
HoriziontalTile, HoriziontalTileEdge, VerticalTile, VerticalTileEdge,
CheckerTile, Random, Dither - Piksel virtual dan ketakhinggaan
- Warna piksel virtual
- Contoh piksel virtual
-
Efek implosion pada piksel virtual
Bercak acak warna polos Penggunaan argumen annotate Splice: membuat operator gambar baru Border, frame, dan pemakaian BorderColor Pengujian operator daftar Halaman ini berisi contoh-contoh yang menguji berbagai aspek ImageMagick, tetapi tidak benar-benar pas dimasukkan ke pembahasan di halaman contoh lain (setidaknya tidak secara formal). Di sini disertakan pula beberapa tabel yang memperagakan hasil berbagai argumen pada operator IM tertentu. Namun orang lain pun sudah melakukannya, jadi kecuali saya punya sesuatu untuk ditambahkan, saya tidak akan membahasnya lebih jauh.
Interpolasi piksel atau pencarian warna antar-piksel
Pengaturan (setting) "-interpolate" dipakai saat mencari warna pada gambar sumber, tetapi 'titik pencarian' itu jatuh di antara piksel-piksel gambar sumber tersebut. Ini terjadi pada berbagai operasi gambar, misalnya "-fx" (operator efek khusus buatan sendiri) dan "-distort" (operator distorsi gambar umum), serta operator terkait lain seperti distorsi melingkar. Pada dasarnya 'interpolasi' memberi tahu IM bagaimana menafsirkan pencarian warna langsung dari sebuah gambar, ketika titiknya tidak persis cocok dengan piksel nyata pada gambar, melainkan jatuh di ruang antar-piksel. Misalnya, bila warna dicari di posisi piksel 3,4, yang didapat semestinya warna piksel itu persis. Tetapi apa yang harus dikembalikan IM bila warna gambar dicari pada titik 3.23,4.75? Haruskah yang didapat warna piksel di 3,4 atau 3,5? atau barangkali campuran warna piksel-piksel di sekitarnya, dan kalau begitu bagaimana warna-warna itu harus digabungkan? Interpolasi piksel menentukan apa yang harus dilakukan ImageMagick ketika mencari satu warna pada posisi bilangan pecahan (dalam koordinat piksel). Interpolasi dalam beberapa hal mirip dengan resampling piksel, seperti yang disediakan filter resampling. Bedanya yang mendasar, resampling punya 'skala', 'area', atau 'jendela' yang berubah-ubah, dan dari situ dikembalikan satu warna yang mewakili seluruh piksel di area tersebut. Interpolasi tidak melibatkan 'skala' sama sekali, hanya satu 'titik' pencarian dan hanya 'area' berukuran tetap di sekitar titik itu untuk menentukan warna yang dipakai di sana. Tentu saja kebanyakan algoritma resampling area cenderung meluruh menjadi metode interpolatif ketika area resampling mencapai 'jendela' kerja minimum, dan itu terjadi dengan sendirinya saat gambar diperbesar atau di-upsample. Karena itulah filter interpolasi dan filter blur gaussian cenderung bekerja lebih baik untuk memperbesar gambar. Interpolasi pada dasarnya bentuk sampling yang lebih rendah, dan dipakai bila Anda ingin jawaban sederhana dan cepat atas pertanyaan 'warna apa'.
Metode interpolasi sederhana
Ini metode-metode yang lugas dan sederhana, yang berusaha melakukan sesedikit mungkin untuk mengembalikan warna dari sebuah 'interpolasi titik'. Yang paling sederhana adalah 'Nearest ' dan 'Integer ', yang cukup mengambil satu warna piksel dari gambar sumber apa adanya, tanpa pencampuran atau efek pembauran lain. Cara ini mempertahankan nilai warna asli gambar, tetapi ongkosnya adalah efek aliasing dan, biasanya, tampilan gambar yang kurang mulus. |
Sejak IM v6.7.6-2 Anda dapat memakai 'Nearest' sebagai singkatan untuk pengaturan interpolasi 'Nearest-Neighbour'. |
|---|---|
Keduanya sangat mirip, hanya berbeda pada piksel mana yang diambil koordinat pencarian dari gambar sumber. Tepatnya, 'Integer' cukup membulatkan ke bawah titik pencarian untuk memilih piksel, sehingga hasilnya bergeser setengah piksel ke kanan dan ke bawah. Biasanya ini hanya dipakai pada 'penskalaan' sederhana gambar sumber. Sebaliknya 'Nearest' memilih piksel terdekat dari koordinat pencarian bilangan pecahan, sehingga hasilnya lebih benar.'Blend ' membaurkan (merata-ratakan) 1, 2, atau 4 piksel terdekat, tergantung jaraknya dari titik sampling. Hasilnya, warna piksel asli masih ada tetapi ukurannya menyusut separuh, sementara papan catur warna-warna bauran mengisi ruang di antaranya. (lihat contoh di bawah) 'Average ' tidak akan pernah menghasilkan warna yang persis sama, melainkan selalu mencampur 4 piksel di sekitarnya untuk menghasilkan rata-rata setempat. Ini bisa berguna untuk keperluan pencarian warna. 'Average4' juga dapat dipakai sebagai alias metode interpolasi ini. 'Average9 ' serupa, tetapi merata-ratakan 9 piksel terdekat di sekitar titik sampling sehingga hasilnya buram. 'Average16 ' merata-ratakan 16 piksel terdekat di sekitar titik sampling sehingga hasilnya sangat buram. Berikut ringkasan berbagai metode interpolasi sederhana ketika sekelompok kecil piksel berwarna, atau satu piksel putih, diperbesar. Gambar aslinya tampak seperti hasil "Nearest", hanya jauh lebih kecil. |
for method in integer nearest blend average average9 average16 ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-bordercolor black -border 1 \
-filter point -interpolate $method \
+distort SRT 20,0 ip_color_${method}.jpg
magick xc: -bordercolor black -border 2 \
-filter point -interpolate $method \
+distort SRT 16,0 ip_pixel_${method}.jpg
done
| Sebelum IM v6.7.7-6, 'Average' sebenarnya setara dengan yang sekarang disebut 'Average16'. Dua interpolator perata-rataan lainnya, juga 'Blend' dan 'Background', ditambahkan pada saat itu.
Satu metode interpolasi sederhana lain juga disediakan, 'Background ', yang sekadar mengembalikan warna latar belakang saat ini untuk setiap 'sampling' gambar sumber. Dalam banyak hal ini agak tidak berguna, karena biasanya yang didapat hanyalah gambar polos berwarna tunggal. Kegunaan utamanya adalah sebagai pemeriksa fungsi resampling yang lebih rumit, misalnya kegagalan resampling: filter resampling EWA (biasanya dipakai dari operator distorsi umum) akan jatuh kembali ke pencarian interpolasi bila resampling gagal menemukan piksel apa pun di 'support' atau area resampling-nya. Dengan menyetel interpolasi ke 'Background' dan menyetel warna latar belakang ke sesuatu yang mencolok (misalnya 'red'), Anda dapat mencari piksel pada gambar hasil untuk melihat di mana resampling 'gagal' atau 'meleset dari semua piksel gambar sumber' karena satu dan lain sebab. Biasanya karena pengaturan support terlalu kecil, atau karena bermain-main dengan opsi filter tingkat ahli. FUTURE: Possible future interpolation option of "random" selection over the interpolated area. Could be useful for fancy interpolated effects!
Bilinear
'Bilinear ' (atau interpolasi linear) adalah metode interpolasi bawaan , dan mungkin salah satu cara paling sederhana untuk memperoleh hasil interpolasi sungguhan, dengan menggabungkan warna piksel-piksel di sekitar titik pencarian atau sampling. Berikut diagram yang menjelaskan cara kerja interpolasi bilinear.
![[diagram]](../static/img/img_diagrams/bilinear_interpolation.jpg)
Artinya, metode ini sekadar menghubungkan garis lurus pada arah ortogonal untuk menemukan warna titik sampling yang diminta. Hasilnya juga setara dengan filter resampling Triangle bila dipakai bersama resize. |
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)}' \
interpolate_bilinear.jpg
magick \( xc:white xc:black +append \) \
\( xc:black xc:white +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_saddle.jpg
![[IM Output]](../static/img/misc/interpolate_saddle.jpg)
Gambar terakhir ini memperlihatkan bagaimana gradien linear terbentuk di sepanjang tepi antara keempat titik yang diketahui, lalu gradien linear kedua terbentuk di antara tepi-tepi itu. Artinya, warna di antara piksel-piksel sekeliling dibangkitkan memakai gradien linear horizontal dan vertikal. Ini pada gilirannya menghasilkan gradien dua dimensi melengkung yang biasa disebut 'pelana', karena terangkat pada dua sudut yang berseberangan dan turun pada dua sudut lainnya. Cara ini bahkan bisa dipakai untuk membangkitkan gradien linear bersudut 45 derajat secara lebih langsung, tetapi Anda harus menentukan warna tengah bagi kedua sudut yang berseberangan diagonal. |
magick \( xc:blue xc:navy +append \) \
\( xc:navy xc:black +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_45linear.jpg
![[IM Output]](../static/img/misc/interpolate_45linear.jpg)
Aspek terpenting dari metode interpolasi bawaan ini: piksel paling tengah gambar selalu berupa rata-rata keempat warna sudut, dengan gradien linear sempurna di tepi-tepinya dan warna yang persis cocok di sudut-sudutnya.
Mesh
Pengaturan "-interpolate" 'Mesh' adalah variasi dari interpolasi 'Bilinear'. Kalau 'Bilinear' menghasilkan permukaan lengkung tiga dimensi, 'Mesh' dirancang untuk memecah area antar-piksel menjadi dua permukaan segitiga datar. Pembagian area menjadi dua segitiga itu didasarkan pada diagonal dengan dua warna sudut yang 'terdekat'. |
Untuk rincian algoritma 'Mesh', lihat makalah Image Interpolation by Pixel-Level Data-Dependent Triangulation. |
|---|---|
| Sebagai contoh, mari kita pakai kumpulan warna sudut yang sama seperti di atas. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh.jpg)
Seperti terlihat, algoritma 'Mesh' menghasilkan kumpulan interpolasi warna yang nyaris persis sama dengan 'Bilinear'. Namun bila kita membalik warna kuning dan cyan.. |
magick \( xc:red xc:blue +append \) \
\( xc:cyan xc:yellow +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh2.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh2.jpg)
Kali ini algoritma 'Mesh' memutuskan bahwa warna 'blue' dan 'cyan' adalah dua sudut terdekat, lalu membuat gradien linear secara diagonal di antara kedua sudut itu. Warna selebihnya kemudian membentuk gradien segitiga datar sederhana dari garis tersebut ke dua sudut lainnya. Interpolasi ini mungkin terkesan tidak lazim, tetapi metode ini memastikan batas-batas tajam tetap cukup tajam ketika gambar berwarna hanya sedikit diubah ukurannya, diputar, atau digeser miring. Bahkan operasi Adaptive Resize ("-adaptive-resize") memanfaatkan kenyataan ini pada perubahan ukuran gambar yang kecil untuk mengurangi keburaman berlebih pada hasilnya. Misalnya, bila ada satu sudut 'white', 'mesh' menganggap sebuah tepi telah ditemukan lalu menyesuaikan warna interpolasinya untuk menonjolkan tepi itu. |
magick \( xc:black xc:black +append \) \
\( xc:white xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh3.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh3.jpg)
Tentu saja bila warna-warnanya menghasilkan gradien yang cukup konsisten, interpolasi 'mesh' juga menghasilkan gradien yang cukup konsisten. |
magick \( xc:blue xc:navy +append \) \
\( xc:black xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh4.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh4.jpg)
Seperti terlihat, hasilnya gradien yang cukup wajar, meski kalau diperhatikan benar-benar tampak sambungan diagonal antara kedua segitiga yang terpisah itu. Perubahannya tidak semulus bi-linear (yang sebenarnya juga tidak mulus-mulus amat), tetapi keduanya memang tidak berusaha mempertahankan tepi tajam pada gambar yang diubah ukurannya atau didistorsi.
Catrom (Catmull-Rom)
Pengaturan "-interpolate" 'Catrom' (umumnya disebut secara kurang tepat sebagai interpolasi 'BiCubic') lebih rumit dalam menentukan warna sebuah pencarian titik. Pada dasarnya ia tidak hanya melihat warna di sudut-sudut area antar-piksel, melainkan melangkah lebih jauh ke warna di luar piksel tetangga terdekat itu. Seluruhnya 16 piksel dalam area 4x4 di sekitar titik sampling. Pada dasarnya ia mencocokkan sebuah kurva pada seluruh area yang terlibat, agar dapat menentukan warna keseluruhan yang paling baik. Berikut diagram yang barangkali menjelaskan prosesnya dengan lebih baik...
![[diagram]](../static/img/img_diagrams/bicubic_interpolation.jpg)
Dan berikut warna hasil interpolasi untuk empat warna standar kita. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_catrom.jpg
![[IM Output]](../static/img/misc/interpolate_catrom.jpg)
Gambar di atas mungkin tampak sangat mirip dengan interpolasi 'Bilinear', tetapi hasilnya memakai kurva pembauran yang lebih mulus, bukan garis lurus, untuk menghasilkan warna interpolasinya. Yang tidak diperlihatkan gambar ini adalah pengaruh piksel-piksel lain di sekeliling keempat tetangga dekat kita. Untuk itu kita perlu melihat area yang sedikit lebih luas. Pada contoh yang sangat kecil ini, piksel-piksel sekeliling dikendalikan oleh pengaturan piksel virtual.
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_black.jpg
| Pada gambar sungguhan, efek piksel virtual biasanya hanya memengaruhi hasil di dekat tepi gambar. Karena gambar ini hanya selebar 2 piksel, contoh di atas terpengaruh dengan kuat. Hal ini tidak terjadi pada gambar yang lebih besar dan lebih lazim.
Seperti terlihat, kurvanya sangat dipengaruhi warna di sekitarnya, sehingga perubahan warnanya bisa menjadi sangat rapat dan tajam, atau lebih membaur, sesuai warna sekelilingnya. Namun terlihat pula bahwa perubahan kuat pada warna piksel sekeliling dapat memunculkan area kecil berisi kebalikan atau negatif warna tersebut. Ini adalah artefak ringing dan biasanya hanya terlihat pada tepi yang sangat tajam antara warna komplementer di gambar sungguhan. | _Efek ringing pada tepi warna yang sangat kuat ini bisa terpotong sehingga muncul sebaris piksel yang buruk. Masalah ini dapat dicegah dengan melakukan resize dan interpolasi di ruang warna selain 'RGB', misalnya ruang warna 'Lab' atau 'Luv'.
Untuk keterangan dan contoh lebih lanjut mengenai masalah ini, lihat Mengubah ukuran di ruang warna LAB.
_
| _Perhatikan bahwa 'BiCubic' (filter kubik yang diinterpolasi) mengacu pada keluarga filter yang sangat besar, sehingga maknanya sangat tidak pasti. Nama itu masih tersedia, tetapi pemakaiannya sudah tidak dianjurkan dan digantikan nama-nama yang lebih tepat.
Setelah IM v6.7.7-7, 'BiCubic' sekadar alias untuk 'Catrom', yang umumnya dipandang sebagai 'interpolator kubik' yang baik (b=0, c=1/2). Sebaiknya pakai nama 'Catrom' alih-alih 'BiCubic' agar jelas interpolasi apa yang sedang dipakai.
Sebelum IM v6.7.7-7, 'BiCubic' sebenarnya memakai filter 'Cardinal Cubic' yang ekstrem (b=0, c=1) dengan efek ringing negatif yang terlalu kuat. Filter itu sudah sepenuhnya digantikan 'Catrom' dan tidak lagi tersedia sebagai fungsi interpolatif.
Sebelum IM v6.3.5-3, 'BiCubic' diimplementasikan sebagai interpolator kubik 'Spline' yang sangat buram. Filter tersebut berganti nama pada versi ImageMagick ini. (lihat berikutnya)
Spline
Metode interpolasi 'Spline', seperti 'Catrom' di atas, juga memakai 16 piksel terdekat. Namun interpolasi ini sangat buram, mirip gaussian. |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate spline \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_spline.jpg
![[IM Output]](../static/img/misc/interpolate_spline.jpg)
Seperti terlihat, warna di sudut-sudut terluar interpolasi 'Spline' di atas menjadi pudar, karena permukaan hasil interpolasinya tidak benar-benar melewati warna asli piksel-piksel itu. Pada dasarnya permukaan itu terlalu 'di-blur', dan lebih tepat disebut permukaan 'B-Spline'. Permukaan ini tetap sejenis filter kubik (b=1, c=0) karena dibangkitkan dengan teknik kurva kubik sepotong-sepotong. Namun kurva ini hanya mendekati warna piksel asli, terutama di area dengan perubahan warna yang kuat. Artinya, pencarian interpolasi pada posisi piksel bilangan bulat yang persis pun tidak mengembalikan warna piksel itu sendiri, melainkan warna yang membaur dengan piksel sekitarnya. Ini sering dianggap buruk, tetapi bisa dipakai sebagai fungsi penghalus umum. Seperti 'Catrom', metode ini juga terpengaruh piksel di sekelilingnya.
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_black.jpg
| Pada gambar sungguhan, efek piksel virtual hanya ada di tepi gambar, karena area antar-piksel tempat pencarian dilakukan dikelilingi piksel nyata.
Di sini terlihat efek pemudaran warna yang timbul karena kurva 'spline' tidak pas mengikuti warna piksel. Hasilnya, tepi area berwarna dan garis tipis umumnya menjadi lebih kabur. Namun hasil itu juga tidak akan pernah memperlihatkan efek 'ringing' negatif yang mungkin muncul pada interpolasi 'Catrom'.
Latar belakang interpolasi
Karena efek interpolasi sering terlihat pada area yang lebih luas, berikut perbesaran keempat metode interpolasi utama dengan piksel sekeliling putih atau hitam.
for method in bilinear mesh catrom spline ; do
for vpixel in white black ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate $method -virtual-pixel $vpixel \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' ip_area_${method}_$vpixel.jpg
done
done
Seperti terlihat, warna latar belakang di sekelilingnya tidak benar-benar berpengaruh pada warna hasil interpolasi 'bilinear'. Hasilnya seolah sekadar ditimpakan di atas warna latar belakang apa pun yang ada. Namun terlihat pula bagaimana 'mesh' menghasilkan tepi yang lebih kuat dan tajam, tetapi bisa memutuskan untuk membalik diagonalnya tergantung warna sekeliling ketika warna itu ikut terlibat di tepi gambar. Lihat sambungan antara merah dan biru, di antara latar putih dan hitam, untuk melihat 'pembalikan' ini. Kurva interpolasi untuk 'catrom' dan 'spline' dipengaruhi piksel sekeliling, terutama pada kasus uji yang melibatkan warna absolut. Terakhir, interpolasi 'spline' sebenarnya sekadar blur mirip gaussian pada gambar (memakai sigma 0.65). Cukup buram untuk menghapus efek 'ringing' atau aliasing, meski biasanya terlalu buram untuk kebanyakan keperluan. Lihat filter gaussian.
Interpolasi garis yang diputar
Di sini saya memperagakan berbagai metode interpolasi dengan membuat gambar berisi garis vertikal, lalu memakai distorsi affine untuk memutar garis itu sejauh 17 derajat, kemudian memperbesar tampilannya agar piksel anti-aliasing yang dibangkitkan terlihat.
magick -size 10x20 xc: -draw 'line 4,0 4,20' \
-scale 50x100 ip_line_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'line 5,0 5,20' \
-interpolate $method -filter point -distort SRT 17 \
-scale 50x100 ip_line_${method}.gif
done
![[IM Output]](../static/img/misc/ip_line_none.gif)
Tanpa rotasi | | ![[IM Output]](../static/img/misc/ip_line_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_line_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_line_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_line_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_line_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_line_spline.gif)
Spline
Seperti terlihat, metode pencarian warna langsung 'Interger' dan 'NearestNeighbor' menghasilkan gambar yang sangat beraliasing, tetapi hanya memakai warna asli yang ada pada gambar. Perbedaan utamanya, 'Interger' cenderung mendorong gambar hasil ke bawah dan ke kiri sejauh setengah piksel. 'Bilinear', 'Mesh', dan 'Catrom' umumnya memberi hasil yang sangat baik dan serupa (lebih lanjut soal itu nanti), dengan yang terakhir menghasilkan garis hasil putaran yang sangat tajam. Mana pun di antaranya umumnya dianggap solusi yang baik. Metode interpolasi 'Spline' menghasilkan blur yang jelas pada garis tipis sehingga efek aliasing hilang. Namun 'Spline' cenderung terlalu mem-blur hasilnya, dan sebenarnya lebih cocok untuk menghaluskan gradien ketimbang garis yang diputar. |
Pengaturan khusus "-filter point" pada contoh di atas dipakai untuk memastikan operator Distort hanya memakai interpolasi 'titik' tunggal dalam menentukan warna piksel akhir. Tanpa itu, yang dipakai adalah resampling area, bukan pencarian interpolasi, meski cara itu pun memberi hasil yang sangat baik. |
|---|---|
_Perhatikan bahwa saya tidak memakai operator "-rotate" untuk contoh-contoh ini, karena operator itu memakai metode Pixel Shearing untuk memutar gambar. Akibatnya interpolasi piksel tidak dipakai. |
Lihat Memutar garis tipis untuk contoh pemakaian operator -rotate" dengan cara ini, beserta efeknya di tingkat piksel.
Pembaruan: Sejak IMv6.7.3-4 operator rotate secara internal sudah memakai operator Distort, sehingga keterangan di atas mungkin tidak lagi berlaku.
Interpolasi tepi yang diputar
Hasilnya sedikit berbeda ketika yang didistorsi adalah tepi sebuah area, dibandingkan dengan satu garis piksel.
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-scale 50x100 ip_edge_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-interpolate $method -filter point -distort SRT -17 \
-scale 50x100 ip_edge_${method}.gif
done
![[IM Output]](../static/img/misc/ip_edge_none.gif)
Tanpa rotasi | | ![[IM Output]](../static/img/misc/ip_edge_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_edge_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_edge_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_edge_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_edge_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_edge_spline.gif)
Spline
Yang di atas umumnya sudah berbicara sendiri. 'Bilinear' dan 'Mesh' menghasilkan tepi yang cukup tajam untuk rotasi pada umumnya, sedangkan 'Catrom' menghasilkan tepi yang lebih tajam pada gambar hasil distorsi. 'Spline' justru menghasilkan tepi yang lebih kabur. Perbedaan antara 'Bilinear' dan 'Mesh' sangat kecil pada kasus-kasus di atas. Kedua metode itu baru benar-benar memperlihatkan perbedaan kasatmata pada pembesaran ekstrem selama operasi distorsi. Selebihnya, yang terlihat hanyalah perubahan intensitas piksel yang samar dan nyaris tak kentara.
Piksel virtual: pencarian warna yang meleset dari gambar
Banyak operator kerap perlu mencari warna yang jatuh di luar batas gambar itu sendiri. Termasuk di dalamnya operator untuk mengaburkan gambar, distorsi gambar umum, operator morfologi dan konvolusi, operator distorsi umum, bahkan operator implode yang sudah sangat tua. Lalu warna apa yang harus dikembalikan bila yang diminta adalah piksel di -22,-3? Piksel semacam itu sebenarnya tidak ada, tetapi nilai warna yang dikembalikan bisa berdampak jauh pada keseluruhan hasil pemrosesan gambar, terutama pada warna piksel yang dekat dengan tepi gambar yang sesungguhnya. Pengaturan "-virtual-pixel" menentukan apa yang harus dikembalikan IM saat mengakses piksel di luar batas normal gambar.
Sebagai contoh, di sini kita memakai operator FX buatan sendiri "-fx" untuk 'mencari' dan menampilkan seluruh piksel di dalam dan di sekeliling gambar kecil itu, agar terlihat apa yang dikembalikan pengaturan "-virtual-pixel" bawaan. |
magick -size 70x70 xc: tree.gif \
-fx 'v.p[-19,-19]' virtual_default.gif
![[IM Output]](../static/img/misc/virtual_default.gif)
Pengaturan "-virtual-pixel" 'Edge ' mengembalikan warna piksel nyata yang paling dekat dengan lokasi 'virtual' yang diminta, yaitu warna 'tepi' terdekat. Kali ini saya akan memakai distorsi gambar dengan viewport yang lebih cepat untuk memperlihatkan piksel virtual di sekelilingnya, alih-alih operator FX yang jauh lebih lambat. Metode distort "SRT 0" sebenarnya tidak mendistorsi gambar hasilnya; ia hanya memperlihatkan piksel apa saja yang sungguh-sungguh dilihat operator gambar, terutama piksel 'virtual' di sekeliling gambar sumber. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Edge -filter point -distort SRT 0 \
+repage virtual_edge.gif
![[IM Output]](../static/img/misc/virtual_edge.gif)
Pengaturan piksel virtual 'Edge' adalah pengaturan bawaan, jadi hasil di atas semestinya sama dengan contoh sebelumnya. Pengaturan ini umumnya berdampak paling kecil (dari segi efek tepi) saat memproses gambar. Itu pula sebabnya ia dipilih sebagai pengaturan bawaan. Hal ini terutama penting saat memakai Blur, atau operator morfologi dan konvolusi lain yang memakai 'ketetanggaan' piksel untuk memproses. Perlu dicatat bagaimana warna piksel sudut akhirnya mengisi penuh area diagonal yang bersebelahan di sekeliling gambar sesungguhnya. Akibatnya satu piksel sudut saja bisa berpengaruh besar pada berbagai transformasi gambar. Efek 'sudut' ini terutama kentara saat gambar di-blur. Pengaturan VP 'Tile ' sangat berguna untuk membangkitkan dan memastikan efek tepi pemrosesan gambar membungkus melintasi batas-batas gambar. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Tile -filter point -distort SRT 0 \
+repage virtual_tile.gif
![[IM Output]](../static/img/misc/virtual_tile.gif)
Dengan begitu gambar yang sedang dikerjakan dapat dipastikan tetap 'tileable', atau menjadi lebih 'tileable' seiring gambar diubah. Untuk contoh lebih lanjut lihat Memodifikasi gambar tile. 'Mirror ' sangat mirip dengan 'tile' dan mungkin lebih baik untuk sebagian efek dibanding 'edge' yang bawaan. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Mirror -filter point -distort SRT 0 \
+repage virtual_mirror.gif
![[IM Output]](../static/img/misc/virtual_mirror.gif)
Ini terutama berguna untuk mengurangi efek tepi dan sudut pada gambar yang sedang di-blur. Namun ia juga bisa membangkitkan efek lain. | _Sampai IM v6.5.0-1, hanya gambar yang langsung menempel pada gambar asli yang dicerminkan. Salinan virtual lain yang lebih jauh dari aslinya tetap tidak tercermin (pola tile biasa). Ini sudah diperbaiki sehingga seluruh ruang kanvas virtual kini benar-benar di-tile secara cermin, bukan hanya salinan virtual yang bertetangga.
Hal itu baru menjadi penting saat memakai mirror tile bersama operator distorsi umum untuk men-tile cermin area yang sangat luas, misalnya ketika memandang cakrawala jauh_
'Transparent ' sekadar mengembalikan warna transparan untuk piksel di luar batas gambar sesungguhnya. |
magick tree.gif -alpha set -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans.gif
![[IM Output]](../static/img/misc/virtual_trans.gif)
Operator alpha 'set' pada contoh di atas diperlukan agar gambar punya kanal matte atau alpha sehingga warna transparan terisi dengan benar. Tanpa pengaturan itu, contoh di atas bisa mengembalikan warna 'black' alih-alih transparan, karena warna 'none' alias 'hitam sepenuhnya transparan' adalah warna transparan bawaan. Sebagai contoh, di sini saya keliru mematikan transparansi... |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans2.gif
![[IM Output]](../static/img/misc/virtual_trans2.gif)
Pengaturan 'Transparent' terutama berguna untuk distorsi gambar, ketika gambar hasil distorsi nantinya akan di-layer untuk menyusun gambar yang lebih besar. Misalnya kubus 3d affine dan kotak 3d perspektif. Pengaturan 'white ', 'gray ', dan 'black ' serupa dengan 'Transparent' di atas. Ketiganya sekadar mengembalikan warna tertentu itu untuk setiap piksel yang jatuh di luar batas. |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel White -filter point -distort SRT 0 \
+repage virtual_white.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Gray -filter point -distort SRT 0 \
+repage virtual_gray.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Black -filter point -distort SRT 0 \
+repage virtual_black.gif
![[IM Output]](../static/img/misc/virtual_black.gif)
Bila yang diinginkan warna sederhana lain , warna itu harus didefinisikan pada pengaturan "-background", lalu pakai pengaturan "-virtual-pixel" 'Background '. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Background -background coral \
-filter point -distort SRT 0 +repage virtual_bgnd.gif
Pengaturan VP 'HorizontalTile ' ditambahkan pada IM v6.4.2-6 sebagai bentuk tiling khusus yang berguna untuk distorsi "Arc" dan "Polar" 360 derajat penuh. Gambar hanya di-tile secara horizontal, sedangkan piksel virtual di atas dan di bawah tile diambil dari warna "-background" saat ini. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTile -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal.gif
![[IM Output]](../static/img/misc/virtual_horizontal.gif)
Dengan begitu gambar yang ditransformasi dapat dipastikan tetap 'tileable' secara horizontal. Untuk contoh lebih lanjut lihat Memodifikasi gambar tile. 'HorizontalTileEdge ' (ditambahkan pada IM v6.5.0-1) juga men-tile gambar secara horizontal melintasi ruang virtual, tetapi mereplikasi piksel tepi samping ke bagian-bagian lain ruang kanvas virtual. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal_edge.gif
![[IM Output]](../static/img/misc/virtual_horizontal_edge.gif)
Kedua metode VP ini ditambahkan untuk menangani lebih baik distorsi 'Arc' dan 'Polar' lingkaran penuh, ketika gambar yang dilingkarkan 'membungkus' dan bertemu ujung dengan ujung.
Serupa dengan itu, pengaturan VP 'VerticalTile ' (juga ditambahkan pada IM v6.4.2-6, demi kelengkapan) men-tile gambar hanya secara vertikal, dengan warna "-background" saat ini dipakai untuk mengisi sisi-sisi gambar. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTile -background coral \
-filter point -distort SRT 0 +repage virtual_vertical.gif
![[IM Output]](../static/img/misc/virtual_vertical.gif)
'VerticalTileEdge ' ditambahkan pada IM v6.5.0-1, dan mereplikasi piksel tepi samping ke seluruh sisa ruang kanvas virtual. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_vertical_edge.gif
![[IM Output]](../static/img/misc/virtual_vertical_edge.gif)
Pada IM v6.5.0-1 ditambahkan 'CheckerTile ' untuk men-tile gambar seolah mengisi pola papan catur. Kotak-kotak yang lain sekadar diisi warna latar belakang (yang bisa saja transparan). |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel CheckerTile -background coral \
-filter point -distort SRT 0 +repage virtual_checker.gif
![[IM Output]](../static/img/misc/virtual_checker.gif)
Dengan membuat latar belakang menjadi transparan lalu menimpakan gambar itu di atas gambar lain berukuran sama yang di-tile penuh, kedua tiling itu dapat di-layer sehingga menghasilkan pola papan catur berselang-seling dari kedua gambar. |
magick -size 96x96 tile:balloon.gif \
\( tree.gif -alpha set -set option:distort:viewport 96x96 \
-virtual-pixel CheckerTile -background none \
-filter point -distort SRT 0 \) \
-flatten virtual_checker_2.gif
Ada pula beberapa pengaturan "-virtual-pixel" yang lebih tidak lazim. 'random ' sekadar mengambil piksel acak dari gambar untuk dipakai. |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Random -filter point -distort SRT 0 \
+repage virtual_random.gif
![[IM Output]](../static/img/misc/virtual_random.gif)
Ini sering dipakai bersama "-blur" untuk membangkitkan warna rata-rata gambar yang belang-belang kasar pada efek tepi yang dihasilkannya. Perhatikan bahwa nilai pikselnya tidak konsisten, dan akan memberi efek berbeda pada tiap pencarian, bahkan pada tiap kali operasi dijalankan, kecuali pembangkit bilangan acaknya diberi "-seed" awal. Ini terutama buruk bila dipakai dengan pemrosesan gambar konvolusi atau morfologi, karena tiap pencarian di sepanjang tepi gambar akan menyumbang nilai yang berbeda meski pencarian pikselnya sama. Meski begitu, saya mendapati pola acak ini sangat bagus untuk membangkitkan cakrawala perspektif, karena polanya tampak makin buram saat mendekati cakrawala. Blur itu memberi kedalaman pada tekstur acak yang dihasilkan, kedalaman yang tidak akan tampak bila memakai warna polos biasa.
'dither ' justru mengembalikan pola warna dither terurut berdasarkan piksel-piksel dalam jarak 32x32 piksel dari posisi yang diminta. Artinya, begitu Anda melewati 32 piksel dari gambar, hasilnya kembali hanya berupa warna piksel sudut gambar. Ini agak mirip gabungan 'edge' dan 'random'. |
magick tree.gif -set option:distort:viewport 120x120-44-44 \
-virtual-pixel Dither -filter point -distort SRT 0 \
+repage virtual_dither.gif
![[IM Output]](../static/img/misc/virtual_dither.gif)
Pada contoh di atas terlihat bahwa kuning dari matahari di salah satu sudut gambar 32x32 piksel ini masih terpilih sampai jauh ke sudut kanan bawah, tetapi tidak lebih jauh lagi. Itulah batas 'ketetanggaan' 32 piksel untuk pemilihan warna dither terurut. Kalau gambar ini lebih besar, warna kuning matahari itu tidak akan mencapai sudut-sudut lainnya. Pola ini tidak 'acak' dan akan selalu memberi hasil yang sama untuk gambar yang sama. Anggap saja ia bentuk yang lebih terurut dari VP 'random' selama masih dekat ke gambar, tetapi efeknya menjadi lebih mirip 'edge' begitu melewati 32 piksel dari gambar itu sendiri.
Piksel virtual dan ketakhinggaan
Efek "-virtual-pixel" jauh lebih jelas terlihat pada hasil operator distorsi umum, terutama dengan distorsi Perspective, yang memungkinkan Anda membuat pandangan terdistorsi ke arah jarak tak hingga. Sebagai contoh, di sini saya perlihatkan hasil pengaturan "-virtual-pixel dither" pada pandangan perspektif pohon itu. Contoh ini memperlihatkan bagaimana pengaturan tersebut dapat memengaruhi piksel yang dikembalikan sampai jauh ke tak hingga.
magick tree.gif -mattecolor DodgerBlue -virtual-pixel dither \
-set option:distort:viewport 150x100-50-50 \
-distort perspective '0,0 9,0 31,0 38,0 0,31 0,18 31,31, 40,18' \
perspective_dither.gif
Cobalah contoh di atas dengan pengaturan "-virtual-pixel" lain untuk mendapat gambaran yang lebih baik tentang cara kerjanya. Beberapa contoh lain juga bisa dilihat di Memandang cakrawala jauh. Perhatikan bahwa 'langit' pada pandangan di atas sebenarnya dibangkitkan dari pengaturan "-mattecolor", yang dipakai distort untuk mewakili area yang 'Invalid', dalam hal ini 'langit' pada distorsi perspektif. Warna itu tidak berasal dari pengaturan "-virtual-pixel".
Warna piksel virtual
Tidak satu pun metode "-virtual-pixel" benar-benar mengembalikan warna yang berbeda atau warna campuran dari yang sudah ada di dalam gambar, kecuali warna itu memang diminta lewat salah satu metode warna polos: 'background', 'transparent', 'background', 'black', 'white', 'gray'; artinya, tidak pernah ada warna baru yang dibangkitkan, meski satu warna tertentu bisa ditambahkan (dua untuk operator distorsi umum). Tentu saja bila piksel yang diminta sedang diinterpolasi atau di-resample per area, seperti pada pandangan perspektif terdistorsi di atas, metode-metode itu dapat menggabungkan warna yang dikembalikan sesuai pengaturan "-virtual-pixel" yang dipilih.
Efek piksel virtual pada operator
Di sini saya menelusuri efek pengaturan "-virtual-pixel" pada berbagai operator. "-blur"... |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel edge -blur 0x8 vp_blur.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel mirror -blur 0x8 vp_blur_2.png
![[IM Output]](../static/img/misc/vp_blur_2.png)
Perhatikan pada contoh berikut bagaimana gambar bisa saling terkontaminasi ketika "-blur" dipakai dengan pengaturan "-virtual-pixel" 'tile'. Tentu saja bila sejak awal gambarnya memang tileable, hal ini justru mungkin diinginkan. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel tile -blur 0x8 vp_blur_3.png
![[IM Output]](../static/img/misc/vp_blur_3.png)
Menyetel warna tertentu untuk "-virtual-pixel" pada gambar memberi efek dan kemungkinan yang sangat menarik. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-blur 0x8 vp_blur_4.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel transparent -channel RGBA -blur 0x8 \
-background red -flatten vp_blur_5.png
![[IM Output]](../static/img/misc/vp_blur_5.png)
Perhatikan bagaimana latar 'red' yang saya taruh di belakang gambar terlihat di sekitar tepinya, tempat gambar hasil blur memanfaatkan piksel virtual yang mengelilingi piksel nyata gambar. "-gaussian" pada dasarnya memberi hasil yang sama dengan "-blur", dan itu masuk akal karena keduanya identik secara matematis. |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-gaussian 0x8 vp_gaussian.png
![[IM Output]](../static/img/misc/vp_gaussian.png)
Namun "-radial-blur" (sebenarnya blur rotasional) menghasilkan efek batas yang lebih menarik... |
magick -size 70x70 xc:lightblue \
-virtual-pixel background -background blue \
-radial-blur 0x30 vp_radial.png
![[IM Output]](../static/img/misc/vp_radial.png)
Yang terakhir ini, dengan 'transparent edge' bawaan, mungkin akan menghasilkan tepi yang mulus bila dipakai dengan sudut radial blur yang lebih besar. Ia bisa menghasilkan gambar overlay 'vignette' atau tepi lembut yang lebih bersih dibanding teknik lain. Lihat Tepi lembut dan buram untuk contoh pemakaian efek ini. Perhatikan bahwa "-motion-blur" bisa terpengaruh sangat buruk oleh efek tepi. | Keadaan diperburuk oleh kenyataan bahwa "-motion-blur" saat ini belum memahami pemakaian "-channel" untuk membatasi efeknya pada kanal tertentu.
|
magick -size 70x70 xc:none -virtual-pixel edge \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion.png
magick -size 70x70 xc:none -virtual-pixel transparent \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_2.png
magick -size 70x70 xc:none -virtual-pixel background -background blue \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_3.png
Efek implosion dari piksel virtual
Berikut beberapa contoh yang lebih menarik dari berbagai implosion bernilai besar (>1.0) memakai bermacam pengaturan "-virtual-pixel".
for v in edge tile mirror dither random gray; do
for i in 2 5 10 50 500; do \
magick koala.gif -virtual-pixel $v \
-implode $i implode_${v}_${i}.gif
done
done
Sifat 'berbintik' pada hasil di atas adalah akibat langsung dari 'sampling interpolasi' langsung yang dipakai operator "-implode". Lihat Pencarian interpolasi langsung. Ini mungkin berubah pada versi IM mendatang dengan memakai resampling area. Untuk saat ini Anda perlu memakai teknik super sampling agar hasilnya lebih baik. Pengaturan 'edge' adalah pengaturan yang lebih lazim sekaligus bawaan, dipakai untuk menghindari sebagian besar efek aneh. Yang lain (kecuali 'background' pada dasarnya menghasilkan pola replikasi dari piksel yang sudah ada pada gambar, dan efeknya sangat berubah-ubah. Perhatikan pula bahwa argumennya menuntut kenaikan besaran secara eksponensial untuk kenaikan efek yang setara. Selain itu, untuk argumen di atas kira-kira 200 bisa muncul lingkaran hitam di tengah gambar hasil. Ini disebabkan tercapainya batas matematis komputer. Memakai nilai sebesar itu adalah efek yang tidak kami anjurkan.
Bercak acak warna polos
Dengan mem-blur kanvas "plasma:fractal", lalu menurunkan jumlah warnanya sampai sangat sedikit, Anda dapat menghasilkan gambar sederhana berisi area acak dengan warna berbeda-beda. Namun hasilnya sangat berubah-ubah tergantung jumlah warna akhir yang diminta dan pengaturan piksel virtual (lihat di atas). Untuk gambar acak awal pada percobaan ini saya punya dua pilihan: gambar plasma fraktal dan gambar noise acak. Gambar acak menurut sifatnya menghasilkan gambar yang (dengan pengaturan "-virtual-pixel" 'tile') dapat membentuk gambar tileable yang lebih baik. Sedangkan gambar plasma cenderung membentuk tepi seperti persegi panjang pada bercak-bercak warnanya. Di sisi lain gambar plasma menghasilkan bercak atau gumpalan warna pastel yang cukup enak dilihat, sementara gambar acak cenderung menghasilkan gradasi abu-abu nada tengah yang menyebalkan. Karena itu saya memilih gambar plasma untuk percobaan-percobaan ini.
magick -size 80x80 plasma:fractal -normalize spot_start.gif
#magick -size 80x80 xc: +noise Random \
# -virtual-pixel tile -blur 0x5 -normalize spot_start.gif
for n in 2 3 4 5; do
for v in edge mirror tile white black; do
magick spot_start.gif -virtual-pixel $v -blur 0x10 \
+dither -colors $n spot${n}_${v}.gif
done
done
Ketiga gambar pertama punya efek yang sangat khas pada cara 'bercak' warna berinteraksi dengan tepi gambar. 'Edge' dan 'Mirror' cenderung membuat warna menempel ke tepi pada sudut 90 derajat. Pengaturan 'Random' atau 'Dither' membuat gumpalan warna menempel serupa tetapi lebih kuat ke tepi gambar, meski keduanya juga memunculkan sejumlah efek tepi tajam di dekat tepi gambar. Satu siklus blur-kuantisasi kedua mungkin diperlukan untuk membersihkan dan menghaluskan tepi bercak-bercak itu. Pengaturan 'Tile' cenderung membiarkan bercak membungkus melintasi gambar. Namun karena gambar Plasma sumbernya sendiri tidak tileable, hasilnya berupa perubahan warna yang merata di dekat tepi persegi panjangnya. Kalau gambar Random yang tileable dipakai sebagai sumber, bercak-bercak warna itu akan sama sekali mengabaikan batas gambar. Dengan memakai pengaturan virtual-pixel latar belakang 'White' atau 'Black', bercak warna cenderung terpusat di dalam gambar itu sendiri. Seberapa baik 'pemusatan' ini terjadi bergantung pada seberapa berbeda gambar acak aslinya dibanding 'warna latar belakang' yang dipakai. Besarnya "-blur" pada dasarnya memengaruhi ukuran dan kehalusan gumpalan: blur kecil menghasilkan banyak bercak kecil, blur besar seperti yang kita pakai di atas menghasilkan satu bercak warna yang lebih membulat.
Anda juga dapat menghasilkan kumpulan warna dan interaksi yang sama sekali berbeda dengan memakai ruang warna kuantisasi yang berbeda. Sebagai contoh, di sini saya mengulang contoh terakhir di atas (menurunkan ke 5 warna) tetapi memakai ruang warna "-quantize" yang lebih tidak lazim untuk pemilihan warnanya. (Lihat Kuantisasi warna dan ruang warna)
Ingat, semua gambar di atas dibangkitkan dari gambar sumber teracak yang sama. Perbedaan efek yang terlihat adalah hasil dari cara yang berbeda-beda dalam menurunkan jumlah warna pada gambar. Terlihat bagaimana pengaturan "-virtual-pixel", yang menentukan warna piksel apa yang dilihat blur di area di luar batas gambar, sangat memengaruhi bentuk area-area warna itu.
Penggunaan argumen annotate
IM Versi 6 menyediakan opsi baris perintah baru untuk menggambar teks, "-annotate", yang melewati metode "-draw" yang lebih lama dan langsung memakai API Annotate(). Ini memberi beberapa fitur baru bagi pengguna baris perintah. Untuk contoh ini saya memilih font Arial Black, karena hurufnya lurus sehingga rotasinya semestinya terlihat cukup jelas. |
magick -font ArialB -pointsize 24 -gravity center \
-size 55x55 xc:white -annotate 0x0+0+0 'Text' \
annotate_source.jpg
**-annotate {_SlewX_}x{_SlewY_}+{_X_}+{_Y_} 'Text String' **
Offset X dan Y di atas adalah posisi teks anotasi yang akan digambar, yang dipengaruhi gravity. Sementara itu SlewX dan SlewY mewakili semacam rotasi. Bila kedua nilai itu sama, yang dilakukan adalah rotasi biasa. Tetapi bila keduanya berbeda, bisa muncul efek yang sangat menarik..
Seperti terlihat, sebagian argumen berakhir tanpa teks yang tergambar, pada dasarnya ketika teksnya akan tergambar seluruhnya dalam satu garis. Itu memang bisa diduga. Namun terlihat pula bahwa kita bisa menggambar teks yang dibalik vertikal, dibalik horizontal, diputar, dimiringkan, dengan segala macam cara. Operator gambar yang sangat berguna.
Splice: membuat operator gambar baru
Tak lama setelah rilis pertama ImageMagick versi 6, muncul diskusi sebagai jawaban atas sebuah pertanyaan. Pertanyaan itu menyangkut penambahan ruang ekstra (baris dan kolom) ke tengah sebuah gambar. Contoh di bawah adalah rangkaian perintah rumit yang lahir dari diskusi tersebut, memakai sihir kelas berat IM versi 6, dan merinci persis apa yang harus dilakukan. Dari contoh inilah operator "-splice" dibuat (untuk rinciannya lihat contoh di Menyisipkan dan memotong baris dan kolom pada gambar). Jadi baris perintah ini adalah definisi operasi dari perintah baru tersebut, dan keduanya semestinya bekerja dengan cara yang persis sama. |
magick rose: -size 20x10 xc:blue -background blue \
\( -clone 0 -crop 40x0 +repage +clone -insert 1 +append \) \
-swap 0,-1 +delete +repage \
\( -clone 0 -crop 0x30 +repage +clone -insert 1 -append \) \
-delete 0 -delete 0 +repage splice_rose_seq.gif
![[IM Output]](../static/img/misc/splice_rose_seq.gif)
Pada contoh di atas kita memecah rose menjadi banyak irisan vertikal, lalu menyisipkan gambar penjarak ke dalam urutan itu, sebelum menggabungkan semuanya kembali. Pada dasarnya kita menambahkan satu kolom piksel vertikal ke dalam gambar rose. Kemudian, setelah mengganti gambar asli kita dengan yang sudah diubah, kita mengulang operasi yang sama tetapi secara horizontal. Sedikit pembersihan gambar kerja, dan selesai. Contoh ini juga menegaskan kepada milis betapa bergunanya penanganan baris perintah berurutan yang baru serta operasi urutan gambar pada ImageMagick versi 6. Pada rilis IM yang lebih lama, hal ini akan menuntut sejumlah besar perintah terpisah dan gambar sementara untuk mencapai hasil yang sama.
Border, frame, dan pemakaian BorderColor
Ada perdebatan bahwa "-bordercolor" seharusnya hanya dipakai untuk menambahkan border pada gambar lewat "-border" atau "-frame". Artinya, banyak pengguna berpendapat opsi itu tidak seharusnya dipakai untuk menyetel latar belakang di balik gambar yang punya transparansi. Sebagai contoh, di IM perintah berikut menyetel area transparan gambar bintang ke "-bordercolor" dan sama sekali mengabaikan pengaturan warna "-background". |
magick star.gif -bordercolor LimeGreen -background Gold \
-border 10 star_border.gif
![[IM Output]](../static/img/misc/star_border.gif)
Alasan utama "-bordercolor" dipakai untuk menyetel latar belakang gambar transparan adalah karena hal itu membuat "magick montage" tampil bagus ketika diberi sekumpulan gambar sembarang yang mungkin mengandung transparansi, dengan pengaturan seminimal mungkin dari pengguna. |
magick montage star.gif -frame 6 -geometry '64x64+5+5>' star_montage.gif
![[IM Output]](../static/img/misc/star_montage.gif)
Kalau transparansinya dipertahankan, hasil "magick montage" di atas tidak akan sebagus itu. Bukan berarti transparansi gambar tidak bisa dipertahankan saat memakai operator "-border" atau "-frame". Artinya hanya, perlu ditambahkan pengaturan "-compose" untuk memberi tahu IM agar mempertahankan transparansinya. |
magick star.gif -bordercolor LimeGreen \
-compose Copy -border 10 star_border_copy.gif
magick montage star.gif -bordercolor LimeGreen \
-compose Copy -background None -frame 6 \
-geometry '64x64+0+0>' star_montage_copy.gif
![[IM Output]](../static/img/misc/star_border_copy.gif)
![[IM Output]](../static/img/misc/star_montage_copy.gif)
Untuk keterangan lebih lanjut tentang mempertahankan latar belakang transparan gambar sambil menambahkan "-border" atau "-frame", lihat menambahkan border. Dan untuk "magick montage", lihat contoh penanganan latar belakang dan transparansi pada montage. Salah satu alternatif yang pernah diusulkan adalah menyetel latar belakang area gambar pada operator-operator itu ke warna "-background", tetapi hal itu akan mengganggu pemakaiannya di "magick montage". Tentu saja Anda sendiri selalu bisa menghapus transparansi gambar itu sebelum frame atau border tambahan dipasang. Dalam hal itu pemakaian "-compose Copy" menjadi tidak relevan. |
magick montage star.gif -background Gold -alpha remove \
-frame 6 -geometry '64x64+5+5>' -size 16x16 \
-bordercolor LimeGreen -background SeaGreen \
star_montage_texture.gif
![[IM Output]](../static/img/misc/star_montage_texture.gif)
Jauh lebih mudah memakai pengaturan "-compose" untuk mempertahankan transparansi ketimbang membuat border mempertahankannya sendiri lalu menimbulkan masalah lain. Ini mungkin tidak langsung jelas bagi pengguna baru, tetapi memang untuk itulah halaman-halaman contoh ini ada.
Pengujian operator daftar
Semua perintah berikut semestinya menghasilkan gambar yang persis sama, tetapi tiap gambar dihasilkan dengan cara yang sedikit berbeda, memperagakan operator daftar gambar yang baru pada IM versi 6. |
magick eye.gif news.gif storm.gif +append list_test_01.gif
magick \( \) eye.gif news.gif storm.gif +append list_test_02.gif
magick eye.gif news.gif storm.gif \( \) +append list_test_03.gif
magick \( eye.gif news.gif storm.gif \) +append list_test_04.gif
magick \( eye.gif news.gif storm.gif +append \) list_test_05.gif
magick eye.gif \( news.gif storm.gif +append \) +append list_test_06.gif
magick \( eye.gif news.gif +append \) storm.gif +append list_test_07.gif
magick \( storm.gif -flop \) \( news.gif -flop \) \( eye.gif -flop \) \
+append -flop list_test_08.gif
magick \( eye.gif -rotate 90 \) \( news.gif -rotate 90 \) \
\( storm.gif -rotate 90 \) -append -rotate -90 list_test_09.gif
magick eye.gif tree.gif news.gif storm.gif -delete 1 \
+append list_test_10.gif
magick eye.gif tree.gif news.gif storm.gif -delete -3 \
+append list_test_11.gif
magick eye.gif news.gif storm.gif tree.gif +delete \
+append list_test_12.gif
magick news.gif storm.gif eye.gif +insert +append list_test_13.gif
magick eye.gif storm.gif news.gif -insert 1 +append list_test_14.gif
magick news.gif eye.gif storm.gif -swap 0,1 +append list_test_15.gif
magick storm.gif news.gif eye.gif -swap 0 +append list_test_16.gif
magick eye.gif storm.gif news.gif +swap +append list_test_17.gif
magick eye.gif storm.gif news.gif \( -clone 1 \) \
-delete 1 +append list_test_18.gif
magick eye.gif -negate \( +clone -negate \) news.gif storm.gif \
-delete 0 +append list_test_19.gif
magick storm.gif news.gif eye.gif \( -clone 2,1,0 \) \
-delete 2,1,0 +append list_test_20.gif
magick storm.gif news.gif eye.gif \( -clone 2-0 \) \
-delete 0-2 +append list_test_21.gif
magick {balloon,medical,present,shading}.gif -delete 0--1 \
{eye,news,storm}.gif +append list_test_22.gif
magick balloon.gif -delete 0,0,0,0,0,0,0,0,0 \
eye.gif news.gif storm.gif +append list_test_23.gif
magick eye.gif balloon.gif news.gif storm.gif \
-delete 1,1,1,1,1 +append list_test_24.gif
magick {balloon,medical,present,shading}.gif {eye,news,storm}.gif \
-delete 0--4 +append list_test_25.gif
magick eye.gif news.gif storm.gif \
-delete 0--4 +append list_test_26.gif
magick storm.gif news.gif eye.gif -reverse +append list_test_27.gif
![[IM Output]](../static/img/misc/ip_color_integer.jpg)
![[IM Output]](../static/img/misc/ip_color_nearest.jpg)
![[IM Output]](../static/img/misc/ip_color_blend.jpg)
![[IM Output]](../static/img/misc/ip_color_average.jpg)
![[IM Output]](../static/img/misc/ip_color_average9.jpg)
![[IM Output]](../static/img/misc/ip_color_average16.jpg)
![[IM Output]](../static/img/misc/interpolate_bilinear.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_white.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_black.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_white.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_black.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_white.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_white.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_white.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_white.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_black.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_black.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_black.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_black.jpg)
![[IM Output]](../static/img/misc/virtual_white.gif)
![[IM Output]](../static/img/misc/virtual_gray.gif)
![[IM Output]](../static/img/misc/virtual_bgnd.gif)
![[IM Output]](../static/img/misc/virtual_checker_2.gif)
![[IM Output]](../static/img/misc/perspective_dither.gif)
![[IM Output]](../static/img/misc/vp_blur.png)
![[IM Output]](../static/img/misc/vp_blur_4.png)
![[IM Output]](../static/img/misc/vp_motion.png)
![[IM Output]](../static/img/misc/vp_motion_2.png)
![[IM Output]](../static/img/misc/vp_motion_3.png)
![[IM Output]](../static/img/misc/implode_edge_2.gif)
![[IM Output]](../static/img/misc/implode_tile_2.gif)
![[IM Output]](../static/img/misc/implode_mirror_2.gif)
![[IM Output]](../static/img/misc/implode_dither_2.gif)
![[IM Output]](../static/img/misc/implode_random_2.gif)
![[IM Output]](../static/img/misc/implode_gray_2.gif)
![[IM Output]](../static/img/misc/implode_edge_5.gif)
![[IM Output]](../static/img/misc/implode_tile_5.gif)
![[IM Output]](../static/img/misc/implode_mirror_5.gif)
![[IM Output]](../static/img/misc/implode_dither_5.gif)
![[IM Output]](../static/img/misc/implode_random_5.gif)
![[IM Output]](../static/img/misc/implode_gray_5.gif)
![[IM Output]](../static/img/misc/implode_edge_10.gif)
![[IM Output]](../static/img/misc/implode_tile_10.gif)
![[IM Output]](../static/img/misc/implode_mirror_10.gif)
![[IM Output]](../static/img/misc/implode_dither_10.gif)
![[IM Output]](../static/img/misc/implode_random_10.gif)
![[IM Output]](../static/img/misc/implode_gray_10.gif)
![[IM Output]](../static/img/misc/implode_edge_50.gif)
![[IM Output]](../static/img/misc/implode_tile_50.gif)
![[IM Output]](../static/img/misc/implode_mirror_50.gif)
![[IM Output]](../static/img/misc/implode_dither_50.gif)
![[IM Output]](../static/img/misc/implode_random_50.gif)
![[IM Output]](../static/img/misc/implode_gray_50.gif)
![[IM Output]](../static/img/misc/implode_edge_500.gif)
![[IM Output]](../static/img/misc/implode_tile_500.gif)
![[IM Output]](../static/img/misc/implode_mirror_500.gif)
![[IM Output]](../static/img/misc/implode_dither_500.gif)
![[IM Output]](../static/img/misc/implode_random_500.gif)
![[IM Output]](../static/img/misc/implode_gray_500.gif)
![[IM Output]](../static/img/misc/spot2_edge.gif)
![[IM Output]](../static/img/misc/spot2_mirror.gif)
![[IM Output]](../static/img/misc/spot2_tile.gif)
![[IM Output]](../static/img/misc/spot2_white.gif)
![[IM Output]](../static/img/misc/spot2_black.gif)
![[IM Output]](../static/img/misc/spot3_edge.gif)
![[IM Output]](../static/img/misc/spot3_mirror.gif)
![[IM Output]](../static/img/misc/spot3_tile.gif)
![[IM Output]](../static/img/misc/spot3_white.gif)
![[IM Output]](../static/img/misc/spot3_black.gif)
![[IM Output]](../static/img/misc/spot4_edge.gif)
![[IM Output]](../static/img/misc/spot4_mirror.gif)
![[IM Output]](../static/img/misc/spot4_tile.gif)
![[IM Output]](../static/img/misc/spot4_white.gif)
![[IM Output]](../static/img/misc/spot4_black.gif)
![[IM Output]](../static/img/misc/spot5_edge.gif)
![[IM Output]](../static/img/misc/spot5_mirror.gif)
![[IM Output]](../static/img/misc/spot5_tile.gif)
![[IM Output]](../static/img/misc/spot5_white.gif)
![[IM Output]](../static/img/misc/spot5_black.gif)
![[IM Output]](../static/img/misc/spot_RGB_edge.gif)
![[IM Output]](../static/img/misc/spot_RGB_mirror.gif)
![[IM Output]](../static/img/misc/spot_RGB_tile.gif)
![[IM Output]](../static/img/misc/spot_RGB_white.gif)
![[IM Output]](../static/img/misc/spot_RGB_black.gif)
![[IM Output]](../static/img/misc/spot_YIQ_edge.gif)
![[IM Output]](../static/img/misc/spot_YIQ_mirror.gif)
![[IM Output]](../static/img/misc/spot_YIQ_tile.gif)
![[IM Output]](../static/img/misc/spot_YIQ_white.gif)
![[IM Output]](../static/img/misc/spot_YIQ_black.gif)
![[IM Output]](../static/img/misc/spot_HSL_edge.gif)
![[IM Output]](../static/img/misc/spot_HSL_mirror.gif)
![[IM Output]](../static/img/misc/spot_HSL_tile.gif)
![[IM Output]](../static/img/misc/spot_HSL_white.gif)
![[IM Output]](../static/img/misc/spot_HSL_black.gif)
![[IM Output]](../static/img/misc/spot_XYZ_edge.gif)
![[IM Output]](../static/img/misc/spot_XYZ_mirror.gif)
![[IM Output]](../static/img/misc/spot_XYZ_tile.gif)
![[IM Output]](../static/img/misc/spot_XYZ_white.gif)
![[IM Output]](../static/img/misc/spot_XYZ_black.gif)
![[IM Output]](../static/img/misc/spot_OHTA_edge.gif)
![[IM Output]](../static/img/misc/spot_OHTA_mirror.gif)
![[IM Output]](../static/img/misc/spot_OHTA_tile.gif)
![[IM Output]](../static/img/misc/spot_OHTA_white.gif)
![[IM Output]](../static/img/misc/spot_OHTA_black.gif)
![[IM Output]](../static/img/misc/annotate_source.jpg)
![[IM Output]](../static/img/misc/annotate_montage.jpg)
![[IM Output]](../static/img/misc/list_test_01.gif)
![[IM Output]](../static/img/misc/list_test_02.gif)
![[IM Output]](../static/img/misc/list_test_03.gif)
![[IM Output]](../static/img/misc/list_test_04.gif)
![[IM Output]](../static/img/misc/list_test_05.gif)
![[IM Output]](../static/img/misc/list_test_06.gif)
![[IM Output]](../static/img/misc/list_test_07.gif)
![[IM Output]](../static/img/misc/list_test_08.gif)
![[IM Output]](../static/img/misc/list_test_09.gif)
![[IM Output]](../static/img/misc/list_test_10.gif)
![[IM Output]](../static/img/misc/list_test_11.gif)
![[IM Output]](../static/img/misc/list_test_12.gif)
![[IM Output]](../static/img/misc/list_test_13.gif)
![[IM Output]](../static/img/misc/list_test_14.gif)
![[IM Output]](../static/img/misc/list_test_15.gif)
![[IM Output]](../static/img/misc/list_test_16.gif)
![[IM Output]](../static/img/misc/list_test_17.gif)
![[IM Output]](../static/img/misc/list_test_18.gif)
![[IM Output]](../static/img/misc/list_test_19.gif)
![[IM Output]](../static/img/misc/list_test_20.gif)
![[IM Output]](../static/img/misc/list_test_21.gif)
![[IM Output]](../static/img/misc/list_test_22.gif)
![[IM Output]](../static/img/misc/list_test_23.gif)
![[IM Output]](../static/img/misc/list_test_24.gif)
![[IM Output]](../static/img/misc/list_test_25.gif)
![[IM Output]](../static/img/misc/list_test_26.gif)
![[IM Output]](../static/img/misc/list_test_27.gif)