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

Contoh penggunaan ImageMagick -- warping gambar

Kata pengantar dan indeks contoh penggunaan ImageMagick
Warping gambar sederhana (menata ulang urutan piksel)

Warping gambar sederhana

Operator warping gambar sederhana hanya menata ulang piksel di dalam gambar. Jumlah piksel, bahkan ukuran gambarnya, tetap sama. Ciri utamanya adalah gambar tidak kehilangan informasi apa pun; pikselnya cuma ditata ulang dan bisa dikembalikan ke keadaan semula dengan sangat mudah tanpa kehilangan kualitas (kecuali kompresi lossy seperti JPEG saat penyimpanan). Pada dasarnya operator ini hanya menata ulang piksel, tanpa merusak, menimpa, menyalin, menggabungkan warna, atau mengubah isi gambar asli dengan cara lain. Sekadar memindahkan posisi piksel di dalam gambar. [IM Output]

Membalik dan mencerminkan

Untuk contoh-contoh ini mari kita pakai gambar koala yang lucu ini... Distorsi gambar yang paling sederhana adalah menata ulang piksel di dalam gambar dengan "-flip" sehingga gambar itu jadi terbalik atas-bawah. |

  magick koala.gif  -flip  flip.gif

[IM Output]
Atau dengan memakai "-flop" dapat dihasilkan gambar cerminnya. |

  magick koala.gif  -flop  flop.gif

[IM Output]
| Sebelum IM v6.6.6-5, operator "-flip" dan "-flop" tidak mengubah offset kanvas virtual gambar, relatif terhadap kanvas virtual berukuran lebih besar yang mungkin ada

Transpose dan transverse, secara diagonal

Operasi gambar "-transpose" dan "-transverse" menghasilkan cermin diagonal dari gambar. "-transpose" mencerminkan gambar sepanjang diagonal dari kiri atas ke kanan bawah. |

  magick koala.gif  -transpose  transpose.gif

[IM Output]
Sedangkan "-transverse" mencerminkan gambar sepanjang diagonal dari kiri bawah ke kanan atas. |

  magick koala.gif  -transverse  transverse.gif

[IM Output]
| Sebelum IM v6.6.6-5, operator "-transpose" dan "-transverse" tidak mengubah offset kanvas virtual gambar, relatif terhadap kanvas virtual berukuran lebih besar yang mungkin ada

Rotasi persegi panjang

Keempat jenis operasi di atas pada dasarnya menghasilkan gambar cermin dari aslinya. Operator "-rotate" menyediakan versi lain gambar yang tidak dicerminkan, termasuk gambar aslinya sendiri.

  magick koala.gif  -rotate   0  rotate_0.gif
  magick koala.gif  -rotate  90  rotate_90.gif
  magick koala.gif  -rotate 180  rotate_180.gif
  magick koala.gif  -rotate -90  rotate-90.gif
  magick koala.gif  -rotate 360  rotate_360.gif

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

Perhatikan bahwa "-rotate" merupakan distorsi sederhana hanya bila sudut rotasinya kelipatan 90 derajat. Sudut lain akan memasukkan distorsi tingkat piksel yang lebih rumit ke dalam gambar. Lihat Memutar gambar di bawah. Mungkin Anda perhatikan bahwa sudut rotasi positif berarti searah jarum jam, yang sekilas terasa keliru secara logika. Namun di dalamnya hal itu benar secara matematis, dan disebabkan oleh pemakaian sumbu Y yang dinegasikan. Artinya, sumbu Y dimulai dari 0 di bagian atas dan bernilai positif ke bawah. Karena itu sistem koordinatnya terbalik, sehingga sudut rotasinya pun terbalik secara matematis.
Foto digital juga dapat diputar agar cocok dengan Orientasi kamera yang terekam, dengan memakai operator "-auto-orient". Ini ditambahkan pada IM v6.2.7-8.
--- ---

Menggulung gambar seperti TV yang rusak

Gambar juga bisa di-"-roll" secara horizontal (seperti TV yang kehilangan sinkronisasi). Besar gulungan (pergeseran gambar) diberikan dalam satuan piksel. |

  magick koala.gif  -roll +0+20  roll_horiz.gif

[IM Output]
Tentu saja gambar juga bisa digulung ke samping... |

  magick koala.gif  -roll +30+0  roll_vert.gif

[IM Output]
Atau dengan memakai jumlah piksel negatif, gambar bisa digulung ke arah sebaliknya. |

  magick koala.gif  -roll +0-20  roll-horiz.gif

[IM Output]
Roll sangat penting untuk kanvas yang di-tile karena ia memindahkan titik asal tile tanpa merusak sifat tileable gambar. Justru itulah yang didefinisikan pengaturan "-tile-offset": seberapa besar roll yang diterapkan pada gambar tile saat dibaca oleh opsi "-tile".

Ringkasan warping gambar sederhana

Aspek terpenting dari semua operator ini adalah semuanya bisa dirangkai bersama dengan banyak cara berbeda sehingga hasilnya persis seperti kalau tidak ada operasi yang dilakukan sama sekali. |

  magick koala.gif -roll +25+0 -rotate 90  -flop \
          -roll +0-25  -flip  -rotate 90    original.gif

[IM Output]


Rotasi dan shear

Kalau operator warping gambar sederhana (di atas) mempertahankan ukuran dan warna gambar, kelompok berikutnya tidak. Hasil operator-operator ini tidak muat di ukuran asli, bahkan tidak pas di grid raster asli gambar.

Memutar gambar -- rotasi gambar sederhana

Seperti terlihat di atas, operator "-rotate" bisa melakukan distorsi sederhana yang mempertahankan gambar, bila gambar diputar dalam kelipatan 90 derajat. Dengan sudut lain, gambar hasil putaran tidak akan pas masuk ke dalam gambar berbentuk persegi panjang. Karena itu, agar tidak ada data gambar yang hilang, ukuran gambar akhir diperbesar secukupnya untuk menampung gambar yang telah diputar. |

  magick koala.gif -rotate 30 rotate.jpg

[IM Output]
Perhatikan bahwa arah rotasinya searah jarum jam. Secara matematis ini terasa tidak logis, sampai Anda sadar bahwa sistem koordinat gambar bertumpu pada bagian kiri atas gambar, bukan kiri bawah seperti lazimnya dalam matematika. Akibatnya sudut rotasi menjadi kebalikan dari yang secara logika diharapkan. Hal ini penting diingat setiap kali berurusan dengan segala bentuk rotasi gambar, dibandingkan dengan rotasi matematis. Ruang tambahan yang disisipkan ImageMagick diwarnai dengan pengaturan warna "-background" yang berlaku. Jadi warna pengisi sudut-sudutnya bisa ditentukan sendiri. |

  magick koala.gif -background lightskyblue -rotate 30 rotate_color.png

[IM Output]
Tentu saja bila yang ingin diisikan adalah warna transparan, pastikan gambarnya sanggup menangani transparansi (dengan menambahkan kanal alpha), dan disimpan ke format gambar yang mendukung transparansi. |

  magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png

[IM Output]
Kalau ruang tambahannya keluar hitam, berarti format gambar keluaran Anda tidak mengizinkan pemakaian kanal alpha (kemungkinan besar format JPEG), sehingga transparansinya jatuh ke hitam. | Sebelum versi 6.1.2, "-rotate" tidak menangani transparansi dengan benar, dan menghasilkan garis-garis hitam dan transparan di sudut-sudut gambar yang diputar. Solusi sementara untuk masalah ini cukup rumit, yaitu memutar kanal alpha secara terpisah dari warnanya.
Tetapi bagaimana kalau ruang tambahan itu tidak diinginkan, dan ukuran asli gambar ingin dipertahankan? Anda bisa memakai "-crop" yang terpusat untuk mengembalikan gambar ke ukuran semula. Bila ukuran aslinya tidak diketahui, ada trik komposisi alpha (lihat metode compose 'Src') untuk memulihkan gambar ke ukuran aslinya. |

    magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
            -gravity center  -compose Src -composite   rotate_resized.png

[IM Output]
Operator "-rotate" juga mengenali dua flag tambahan. Bila simbol '>' ditambahkan pada argumen rotate (sebelum atau sesudah angkanya), gambar hanya akan diputar bila gambar itu lebih lebar daripada tingginya. Jadi '90>' hanya akan memutar gambar bergaya 'landscape' (lebar) menjadi gambar bergaya 'portrait' (tinggi), sehingga semua gambar bergaya 'portrait'. Flag satunya, '<', melakukan kebalikannya: hanya memutar gambar yang lebih tinggi daripada lebarnya. Misalnya '90<' memastikan semua gambar menjadi 'landscape'. Kegunaan lain flag ini adalah memutar gambar 'portrait' dan 'landscape' dengan besaran yang berbeda. Artinya, cukup berikan dua operasi "-rotate" yang berbeda sehingga 'portrait' dimiringkan ke satu arah dan 'landscape' ke arah lain. Foto digital juga dapat diputar agar cocok dengan Orientasi kamera (berdasarkan meta-data EXIF gambar) dengan memakai operator "-auto-orient". Tetapi ingat, menyimpannya kembali ke format JPEG belum tentu ide bagus.

Cara kerja internal operator rotate

Sejak IMv6.7.3-4, operator rotate kini memakai operator Distort dan distorsi Scale-Rotate-Translate (SRT). Berikut rotasi yang lebih langsung memakai distorsi SRT yang mendasarinya. |

  magick koala.gif -virtual-pixel background -background lightskyblue \
          -distort SRT 30 +repage rotate_srt.jpg

[IM Output]
Atau memakai versi '+' dari operator distort untuk menyesuaikan ukuran kanvasnya. |

  magick koala.gif -virtual-pixel background -background lightskyblue \
          +distort SRT 30 +repage rotate_srt2.jpg

[IM Output]
Ada banyak kendali lain yang disediakan operator distorsi umum untuk hal-hal seperti penempatan persis pusat rotasi, penskalaan, kendali filter, ukuran gambar keluaran, dan kendali untuk pelapisan gambar, yang tidak disediakan operator rotate yang lebih sederhana. Sebelum IMv6.7.3-4, operator rotate diimplementasikan memakai distorsi rotasi 90 derajat sederhana yang diikuti tiga shear gambar, sebuah teknik yang dikenal sebagai 'Rotate by Shear' (RBS). Teknik ini pertama kali dipublikasikan dalam makalah penelitian oleh Alan Paeth. Sayangnya, karena teknik ini menuntut 3 operasi shear terpisah, efek blur yang muncul sangat bervariasi dan parah, terutama saat men-shear garis tipis; itulah sebabnya rotate kini diimplementasikan memakai Distort. Efek merugikan ini bisa Anda lihat pada Animasi rotasi di bawah. Fungsi pustaka yang dulu melakukan rotasi sebagai 'shear' masih tersedia di API, tetapi tidak lagi tersedia dari baris perintah, kecuali shear-nya dilakukan sendiri. Lihat operator shear di bawah untuk rincian lengkap tekniknya. Untuk pemahaman yang lebih dalam tentang berbagai algoritma rotasi gambar, cara kerjanya, dan persoalan yang menyertainya, lihat Leptonica Rotation. Juga contoh-contoh yang dipakai di teknik distorsi umum.

Men-shear gambar -- pergeseran linear

Operator "-shear" mengambil tiap baris (atau kolom) piksel dan menggesernya sehingga tiap baris (atau kolom) bergeser sejauh jarak yang sama relatif terhadap baris (atau kolom) tetangganya. Kedua argumennya diberikan dalam bentuk sudut. Sama seperti "-rotate", operasi ini memperbesar ukuran gambar hasil agar tidak ada informasi yang hilang. Namun shear lebih rumit karena sebenarnya ia operasi ganda.

  magick koala.gif -background Blue  -shear 20      shear_rot.gif
  magick koala.gif -background Blue  -shear 20x0    shear_x.gif
  magick koala.gif -background Blue  -shear 0x50    shear_y.gif
  magick koala.gif -background Blue  -shear 20x50   shear_xy.gif
  magick koala.gif -background Blue  -shear 20x0  -shear 0x50   shear_xy2.gif
  magick koala.gif -background Blue  -shear 0x50  -shear 20x0   shear_yx.gif

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

Kalau hasilnya diperhatikan, terlihat bahwa "-shear" X-Y penuh (gambar keempat) sebenarnya setara dengan melakukan shear X dulu, lalu shear Y (dengan pemangkasan gambar yang sesuai), seperti tampak pada gambar kelima alias gambar kedua dari belakang). Perhatikan bahwa urutan shear-nya memberikan hasil yang berbeda. Bila hanya satu angka yang diberikan (tanpa 'x' pada argumennya, seperti pada gambar pertama), "-shear" akan menerapkannya pada arah X dan Y sekaligus, semacam rotate ala kadarnya. Pengaturan warna "-background" tentu saja dipakai sebagai warna ruang tambahan yang disisipkan. |

  magick koala.gif  -background none  -shear 30  shear_trans.png

[IM Output]
| Sebelum IM versi 6.1.2, "-shear" tidak menangani transparansi. Solusi sementara untuk masalah ini cukup rumit, yaitu men-shear kanal alpha secara terpisah dari warnanya.
Perhatikan bahwa memakai "-shear" dengan cara ini bukan metode yang benar untuk memutar gambar. Untuk benar-benar memakai shear guna memutar gambar dengan tepat, diperlukan beberapa operasi shear berbentuk "-shear {X}x{Y} -shear {X}x0 -crop ... ", tetapi menghitung nilai yang tepat untuk '{X}', '{Y}' dan pemangkasan akhirnya menuntut sedikit trigonometri. "Operator rotate" dulu memang diimplementasikan dengan cara ini, dan fungsi API untuk itu masih tersedia, meski tidak lagi dari baris perintah. | Perhatikan bahwa men-shear ke arah X tidak akan memengaruhi tinggi gambar, sedangkan men-shear ke arah Y tidak akan memengaruhi lebar gambar. Akibatnya area yang ditempati suatu objek di dalam gambar tidak berubah (yang berubah hanya wadah di sekelilingnya yang menampung gambar itu).
| _Operator shear diimplementasikan sebagai 'warping' langsung (mendistorsi piksel hanya pada masing-masing baris dan kolom) atas gambar sumber. Akibatnya ia tidak memakai pengaturan interpolasi maupun pengaturan piksel virtual.

Akibatnya area yang ditambahkan ke gambar hanya diisi warna "-background" yang berlaku, dan tidak disediakan cara untuk mempertahankan warna asli gambar._
Untuk metode alternatif yang memungkinkan pemakaian filter gambar, interpolasi, dan piksel virtual, lihat distorsi Affine. Untuk keterangan tentang pemakaian matriks Affine guna mengimplementasikan shear, lihat Affine Shearing. Namun kedua metode itu tidak memungkinkan penentuan shear memakai argumen sudut.

Kubus isometrik memakai shear

Meski shear bukan operator yang paling enak atau paling sederhana dipakai, bukan berarti ia tidak bisa dipakai untuk hal-hal yang menarik. Berikut contoh pemakaian "-shear" untuk membuat kubus isometrik. |

  # Create some square images for the cube
  magick logo: -resize 256x256^ -gravity center -extent 256x256 top.jpg
  magick ../img_photos/pagoda_sm.jpg           -resize 256x256 left.jpg
  magick ../img_photos/mandrill_orig.png       -resize 256x256 right.jpg

  # top image shear.
  magick top.jpg -resize  260x301! -alpha set -background none \
          -shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
          top_shear.png

  # left image shear
  magick left.jpg  -resize  260x301! -alpha set -background none \
          -shear 0x30  left_shear.png

  # right image shear
  magick right.jpg  -resize  260x301! -alpha set -background none \
          -shear 0x-30  right_shear.png

  # combine them.
  magick left_shear.png right_shear.png +append \
          \( top_shear.png -repage +0-149 \) \
          -background none -layers merge +repage \
          -resize 30%  isometric_shears.png

  # cleanup
  rm -f top.jpg left.jpg right.jpg
  rm -f top_shear.png left_shear.png right_shear.png

[IM Output]
Contoh di atas dikembangkan dari contoh batch Windows serupa oleh Wolfgang Hugemann ImageMagick@Hugemann.de dalam sumbangannya untuk IM Examples, Penggunaan di Windows. Perhatikan bahwa gambar-gambar di atas TIDAK disambung dengan benar. Semestinya dipakai komposisi alpha Plus, tetapi yang dipakai justru over. Untuk keterangan lebih lanjut lihat Menyelaraskan dua gambar ber-mask. Akibatnya bisa muncul kesulitan menyelaraskan ketiga gambar dengan tepat, sehingga timbul celah atau tumpang-tindih gambar. Karena penempatannya terbatas pada posisi bilangan bulat, masalah ini bisa jadi sangat parah. Memakai ukuran yang jauh lebih besar dengan koordinat yang lebih mudah diatur, plus sedikit akal-akalan pada hitungannya, bisa membantu dalam kasus ini. Setelah gambar-gambarnya digabungkan, mengecilkan hasilnya ke ukuran akhir akan menajamkan dan merapikan ketidakselarasan kecil di sepanjang sambungannya. Contoh serupa lain yang memakai distorsi Affine dan komposisi alpha yang benar adalah kubus 3d dengan pelapisan Affine. Metode itu jauh menyederhanakan pemrosesan gambar yang diperlukan untuk menghasilkan kubus seperti di atas.

Gambar bergelombang - pergeseran gelombang sinus

Operator "-wave" mirip "-shear" karena sama-sama menambahkan 'pergeseran linear' pada gambar. Bedanya, operator ini hanya menggeser kolom piksel secara vertikal mengikuti fungsi gelombang sinus. Operator "-wave" punya dua argumen. Yang pertama adalah tinggi maksimum atau amplitudo pergeseran piksel ke atas maupun ke bawah, sedangkan yang kedua adalah panjang gelombang fungsi sinusnya dalam satuan piksel. |

  magick koala.gif -background Blue  -wave 10x64  wave.jpg

[IM Output]
Perhatikan bahwa karena piksel bisa bergeser sejauh amplitudo yang diberikan, ruang tambahan sebesar itu selalu ditambahkan di bagian atas dan bagian bawah gambar, sekalipun ruang itu sebenarnya tidak diperlukan. Misalnya, dengan menyetel argumennya agar panjang gelombang menjadi dua kali lebar gambar, gambar itu bisa dijadikan busur. |

  magick koala.gif -background Blue  -wave 20x150  arched.jpg

[IM Output]
Dalam kasus semacam ini, ruang yang tidak terpakai bisa dibuang dengan operasi "-chop", "-shave", atau bahkan mungkin "-trim". Mari kita rapikan contoh sebelumnya dengan memakai amplitudo negatif untuk membalik busurnya, lalu memakai "-chop" untuk membuang ruang tak terpakai yang ditambahkan operator "-wave". |

  magick koala.gif -background Blue  -wave -20x150  \
          -gravity South -chop 0x20 arched_2.jpg

[IM Output]
Tentu saja pengaturan warna "-background" bisa dipakai untuk menentukan ruang tambahan yang disisipkan ke gambar. |

  magick koala.gif -alpha set -background none  -wave 10x75  wave_trans.png

[IM Output]
Seperti terlihat dari contoh-contoh di atas, "-wave" hanya berlaku pada arah vertikal atau 'Y'. Bila Anda ingin menambahkan gelombang pada arah X, gambarnya perlu diputar sebelum dan sesudah wave diterapkan. |

  magick koala.gif  -rotate -90 -background Blue  -wave -10x75 \
                     -rotate +90  wave_y.jpg

[IM Output]
Teknik ini bisa dipakai untuk menambahkan pola gelombang atau getaran pada gambar di sudut mana pun. Contohnya diberikan pada font vibrato dan font berasap. Keterbatasan lain "-wave" adalah gelombangnya selalu dimulai dari nol. Artinya kolom paling kiri tidak bergeser, sedangkan beberapa baris berikutnya bergeser ke bawah (arah X positif), kecuali Anda memberi amplitudo negatif untuk offset vertikal awal. Pada dasarnya operator "-wave" (sampai saat ini) tidak menyediakan cara menentukan offset untuk awal fungsi sinusnya. Namun hal itu bisa diakali dengan menambahkan, lalu membuang lagi, offset gambar memakai "-splice". |

  magick koala.gif  -splice 19x0+0+0 -background Blue  -wave 10x75 \
                     -chop   19x0+0+0     wave_offset.jpg

[IM Output]
Walaupun "-wave" tidak memakai pengaturan piksel virtual yang berlaku untuk menentukan warna area yang ditambahkan, ia tetap melihat pengaturan interpolasi yang berlaku untuk memetakan warna dari sumber ke gambar yang dihasilkan. Artinya wave cenderung membuat piksel sedikit buram dalam pita-pita vertikal melintasi gambar.


Distorsi melingkar

Sejauh ini distorsi gambarnya masih tergolong ringan, dengan sangat sedikit peregangan, pemuaian, atau pemampatan data gambar. Artinya datanya nyaris tidak berubah. Beberapa operator gambar berikut ini bisa menghasilkan gambar yang begitu terdistorsi sampai gambar aslinya tidak bisa dikenali lagi. Warna-warnanya terpelintir menjadi bubur yang buram. Kebetulan pula operator-operator ini membatasi efek distorsinya pada area melingkar, dengan sedikit atau tanpa distorsi pada gambar asli di tepi persegi panjang gambar. Artinya, operator-operator ini bisa dipakai pada area yang lebih kecil lewat operator region, dan hasilnya tetap menyatu dengan gambar aslinya tanpa terlihat seperti: dipotong, dilengkungkan, lalu ditempelkan kembali ke tempatnya. Dengan kata lain, operator-operator ini dikenal sebagai distorsi 'lokal', sebab bisa dipakai untuk melengkungkan area yang lebih kecil dari sebuah gambar.

Implosi gambar

Operator "-implode" melengkungkan gambar sedemikian rupa sehingga semua piksel tertarik ke arah pusat. Kira-kira seperti menaruh penyedot, atau 'lubang hitam', di tengah gambar lalu mengisap piksel-pikselnya ke arah situ. Namun berhati-hatilah: mulailah dengan nilai yang sangat kecil, lalu naikkan pelan-pelan sampai hasilnya sesuai keinginan. Kebanyakan pengguna pemula cenderung memakai nilai yang terlalu besar lalu kecewa dengan hasilnya. Sebagai contoh, ini implosi gambar yang khas... |

  magick koala.gif -implode .6 implode.gif

[IM Output]
Memakai nilai yang makin besar pada dasarnya akan mengisap semua piksel dalam lingkaran itu sampai lenyap. |

  magick koala.gif -implode 5 implode_big.gif

[IM Output]
Tetapi perlu diingat, memakai nilai "-implode" yang lebih besar dari '1.0' juga terpengaruh oleh pengaturan piksel virtual, sebab algoritmanya mulai merujuk warna di luar batas gambar itu sendiri. Karena pengaturan "-virtual-pixel" bawaannya adalah 'edge', warna tepi atau frame di sekeliling gambar bisa sangat memengaruhi hasilnya. Misalnya, kedua gambar berikut sama saja kecuali yang satu diberi border putih. Ini pada dasarnya memperlihatkan area yang memakai warna hasil pencarian di luar batas gambar yang sesungguhnya. Area yang biasanya ditentukan oleh pengaturan "-virtual-pixel". |

  magick rose: -gravity center -crop 46x46+0+0 +repage \
                                              -implode 3   implode_rose.gif
  magick rose: -gravity center -crop 44x44+0+0 +repage \
                -bordercolor white -border 1  -implode 3   implode_rose_2.gif

[IM Output] [IM Output]
Memakai pengaturan piksel virtual lain seperti 'Background' menghasilkan efek yang sama dengan menambahkan "-border", tetapi tanpa memperbesar gambar. Pengaturan piksel virtual lain bisa menghasilkan efek yang jauh lebih menarik di daerah pusat yang mengalami implosi. Misalnya, pengaturan 'Tile' bisa menambahkan salinan gambar yang sangat terdistorsi. Sebagai contoh, di sini saya melakukan implosi pada gambar kotak sederhana memakai pengaturan itu... |

  magick -size 94x94 xc:red -bordercolor white -border 3 \
          -virtual-pixel tile     -implode 4   implode_tiled_box.gif

[IM Output]
Lebih banyak efek "-virtual-pixel" dibahas di Efek implosion dari piksel virtual. Seiring bertambahnya jumlah piksel yang tertarik ke area kecil oleh implosi, dan makin besarnya nilai parameter implosinya, hasilnya mulai tampak 'pixelated'. Untuk hasil yang lebih baik dan lebih konsisten, jumlah piksel yang diolah implode bisa diperbanyak dengan teknik bernama super sampling. Pada dasarnya, dengan memakai gambar yang lebih besar (memperbesar gambar sumber bila perlu), melakukan distorsinya, lalu mengecilkan hasilnya ke ukuran akhir, hasil yang didapat jauh lebih baik. |

  magick -size 94x94 xc:red -bordercolor white -border 3 \
          -virtual-pixel tile  -resize 400%  -implode 4 -resize 25% \
          implode_tiled_ss.gif

[IM Output]
Seperti terlihat, hasilnya jauh lebih halus dan lebih realistis, serta memperlihatkan detail internal distorsinya jauh lebih baik. Namun super sampling pun akan jebol pada gambar seekstrem ini, sebab di dalamnya terlibat ketakhinggaan. Kalau diperhatikan dengan cermat, tampilan 'berbintik' itu kembali muncul, tetapi hanya di bagian yang lebih dekat ke pusat. Dengan memakai "-border" yang lebih lebar di sekeliling gambar yang dikenai implosi, lalu membuangnya lagi, tepi gambar juga bisa dilengkungkan ke dalam, ke arah pusat. |

  magick koala.gif -bordercolor blue -border 20x20 \
          -implode .5   -shave 18x18  implode_border.jpg

[IM Output]
Sejak IM versi 6.2.1, border transparan atau gambar bertransparansi juga bisa dipakai... |

  magick koala.gif -bordercolor none -border 20x20 \
          -implode .5   -shave 18x18  implode_border_trans.png

[IM Output]

Eksplosi gambar

Dengan memakai nilai negatif pada operator "-implode", gambar bisa diledakkan. Namun ini lebih mirip memperbesar bagian tengah gambar sehingga semua piksel di radius menengah terdorong keluar ke arah tepi, ketimbang ledakan yang sesungguhnya. |

  magick koala.gif -implode -2 explode.jpg

[IM Output]
Memakai nilai yang lebih besar pada dasarnya akan memperbesar piksel-piksel paling tengah gambar menjadi lingkaran seukuran dua pertiga dimensi terkecil gambar. |

  magick koala.gif -implode -30 explode_big.jpg

[IM Output]
Dan berikut versinya dengan 'super sampling'. |

  magick koala.gif -resize 400% -implode -30 \
          -resize 25% explode_big_ss.jpg

[IM Output]
Warna pusat 'ledakan' internal itu ditentukan oleh warna bagian tengah gambar (atau region). Artinya, dengan mengubah warna di sekitar titik itu sebelum diledakkan, efek 'kilatan' ledakannya bisa dikendalikan. Lihat Animasi di bawah untuk contoh animasi pengendalian warna ini. Untuk contoh lain gambar yang dikenai implosi, lihat sumbangan pengguna hh di Flickr.

Pusaran air pada gambar

Operator "-swirl" bekerja seperti mikser kue. Ia melengkungkan gambar secara memutar dalam lingkaran, sebesar sudut yang Anda berikan sebagai argumen. |

  magick koala.gif -swirl 180 swirl.jpg

[IM Output]
Dengan menambahkan border dan menggabungkannya dengan "-implode", gambar bisa dibuat tampak seperti pusaran air yang mengisapnya sampai lenyap. |

  magick koala.gif -bordercolor white -border 20x20 \
          -swirl 180 -implode .3  -shave 20x20   whirlpool.jpg

[IM Output]
Sifat utama distorsi ini adalah gambar akan diputar di bagian tengah sebesar sudut yang Anda tentukan, sedangkan tepi lingkarannya (seperti pada operator implode di atas) tidak terpengaruh. Sampai saat ini belum ada parameter untuk menentukan 'radius dalam' agar swirl-nya terbatas pada sebuah cincin, bukan pada cakram penuh. Saya sudah menganimasikan efek swirl ini, yang bisa Anda lihat di bawah pada Animasi.


Animasi (contoh yang menyenangkan)

Sebagai penutup, mari kita hasilkan beberapa animasi GIF dari sebagian distorsi ini. Untuk itu saya membuat beberapa skrip shell sederhana guna menghasilkan gambar animasinya, yang bisa Anda unduh dan otak-atik sendiri dengan gambar uji Anda. Ini membawa saya ke satu hal penting. Bila membangkitkan serangkaian gambar dengan distorsi-distorsi ini, lebih baik selalu mendistorsi dari gambar awal yang asli, bukan mendistorsi gambar itu sedikit demi sedikit berulang-ulang. Ini terutama berlaku untuk gambar yang diputar, yang hasilnya sedikit buram; meski pada satu operasi saja efeknya minim, kalau dilakukan berulang-ulang hasilnya jadi seperti ini. Semua skripnya memakai teknik 'perintah "magick" yang dibangkitkan' untuk membuat animasinya. Artinya, sebuah skrip shell menyusun satu perintah panjang, lalu perintah itu dieksekusi. Cara ini menghindarkan kebutuhan membuat file sementara, meski jadi sulit di-debug. Alternatif lain adalah metode yang dikenal sebagai streaming gambar MIFF, yang menghasilkan gambar satu per satu di dalam loop lalu menyalurkannya lewat pipe ke satu perintah 'penggabung' terakhir. Ini diperagakan lebih jelas pada contoh penempatan terprogram gambar layer dan Pin pada peta. [IM Output] Pada skrip shell "animate_mixer", tiap frame dihasilkan dengan menerapkan "-swirl" pada gambar asli. Swirl-nya dianimasikan ke satu arah, lalu kembali lagi sehingga membentuk siklus yang berkesinambungan. Ini sebenarnya contoh animasi warping yang sangat khas di IM. Variasinya adalah membuat animasi yang meluruskan lengkungan itu menjadi gambar lain yang serupa.
[IM Output] Skrip shell "animate_whirlpool" tidak hanya memakai "-swirl" pada tiap frame gambar, tetapi juga "-implode" dengan ukuran argumen yang terus membesar. Saya memakai warna border 'lightblue' untuk ruang tambahannya guna memperlihatkan bahwa seluruh gambar akan 'terisap ke saluran pembuangan', padahal semestinya saya pakai saja warna latar belakang putih yang sama, supaya efeknya lebih bagus dan lebih realistis.
--- ---
[IM Output] Sebuah ledakan di tengah gambar (lihat skrip "animate_explode". Gambarnya sekali lagi diperbesar supaya seluruh gambar ikut meledak, dan sebuah titik berwarna digambar di pusatnya untuk menentukan warna akhirnya.
--- ---
[IM Output] Dengan skrip shell "animate_flex", bagian tengah gambar dilenturkan naik-turun dengan mengubah amplitudo fungsi "-wave" menjadi positif dan negatif bergantian.
--- ---
[IM Output] Dengan skrip shell "animate_flag" saya membuat animasi 'wave dengan offset' supaya gambarnya berkibar seperti bendera. Animasi ini bisa diperbaiki dengan menggeser tiap frame gambar secara vertikal juga, agar tepi kirinya tetap konstan, dan mungkin dengan menambahkan tiang bendera. Tetapi itu menuntut penentuan offset tersebut secara matematis, yang tidak selalu gampang.
--- ---
[IM Output] Skrip "animate_rotate" menghasilkan animasi berputar ini, tetapi memangkas tiap frame dengan gambar asli seperti dijelaskan di atas untuk mempertahankan ukuran gambar aslinya.
--- ---
[IM Output] Sebagai perbandingan, berikut rotasi koala yang dihasilkan dengan pengaturan bawaan dan perintah "-distort SRT {angle}". Skrip yang dipakai untuk menghasilkannya adalah "animate_distort_rot". Perhatikan betapa jauh lebih tajam gambarnya dengan metode rotasi ini, dan hilangnya 'jitter' rotasi yang kentara pada versi sebelumnya.
--- ---

Animasi dan video bonus

[IM Output] Sebagai bonus, Florent Monnier dari Prancis membuat video keren memakai operator distorsi "-swirl", yang dibuat lewat skrip API OCaml untuk IM. Pilih animasi GIF di sebelah kanan untuk mengunduh versi lengkap videonya. Bisakah Anda membuat video bagus yang memperagakan teknik peta distorsi? Atau tahu ada video semacam itu di tempat lain di internet? Kirimi saya email.