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

Contoh penggunaan ImageMagick -- memotong dan memberi border

Kata pengantar dan indeks contoh penggunaan ImageMagick
Crop (memotong gambar secara bebas)

Di sini kita menelusuri operasi ImageMagick yang dapat dipakai untuk membedah gambar dengan pisau, sekaligus menambahkan frame dan border di sekelilingnya. Artinya, kita melihat operasi yang mengubah ukuran gambar tanpa menskalakan isinya. Anda mungkin mengira ini operasi sederhana, dan memang begitu. Begitu sederhana sampai-sampai IM menyediakan sangat banyak cara dan metode untuk melakukannya. Saking banyaknya, saya perlu memberinya halaman contoh tersendiri hanya untuk memperagakan semuanya.


Crop (memangkas gambar hingga ukuran yang diinginkan)

Crop dan halaman kanvas

Operator gambar "-crop" cukup memotong bagian dari semua gambar dalam urutan saat ini, pada ukuran dan posisi yang Anda tentukan lewat argumen geometry-nya.

  magick rose:                   rose.gif
  magick rose: -crop 40x30+10+10  crop.gif
  magick rose: -crop 40x30+40+30  crop_br.gif
  magick rose: -crop 40x30-10-10  crop_tl.gif
  magick rose: -crop 90x60-10-10  crop_all.gif
  magick rose: -crop 40x30+90+60  crop_miss.gif

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

Agar Anda dapat memeriksa persis apa yang terjadi, berikut keluaran "magick identify" atas hasil crop di atas.

  magick identify rose: crop.gif crop_br.gif crop_tl.gif \
                 crop_all.gif crop_miss.gif

[IM Text]

Perhatikan bahwa ukuran gambar yang ditampilkan (yaitu kanvas virtual-nya) tidak terpengaruh oleh operasi "-crop". Gambar sebenarnya memang dipangkas dan bisa jadi lebih kecil, tetapi kanvas tempat gambar GIF itu ditampilkan tetap seukuran kanvas aslinya. Terlihat pula bahwa ukuran gambar yang dihasilkan belum tentu sama dengan ukuran yang diminta pada crop. Ukurannya bisa jauh lebih kecil dari perkiraan, karena area crop-nya sendiri sebagian atau seluruhnya berada di luar area gambar yang dipangkas. Terlihat juga bahwa 'offset' gambar pada kanvas virtual dalam banyak kasus ikut berubah, supaya piksel gambar yang dipangkas tetap berada persis di posisi semula seperti pada gambar aslinya. Artinya, isi gambar tidak bergeser meskipun gambar sebenarnya menjadi lebih kecil. Ini berarti bila gambar yang lebih kecil itu sekarang diubah lalu ditimpakan kembali ke gambar asli (dengan operator pelapisan gambar), ia akan pas kembali tepat di tempat sub-gambar itu berasal. Jadi, IM mempertahankan informasi 'kanvas virtual', 'page', atau 'pelapisan' pada gambar agar dapat dipakai lagi nanti. Hal ini sangat penting supaya penanganan animasi GIF bekerja dengan benar. Keterangan lebih lanjut ada di Dekonstruksi animasi GIF. | _Gambar GIF memanfaatkan betul informasi 'page' atau 'kanvas virtual', ukuran, dan offset pada gambar yang dipangkas IM. Bila informasi itu tidak diinginkan, hapus dengan "+repage" tepat setelah "-crop".

Perhatikan bahwa banyak format gambar tidak menyimpan informasi page/kanvas virtual ini, sehingga menyimpan ke format semacam itu otomatis menghapusnya. JPEG adalah contoh khas format yang membuang informasi ini.

Format PNG tidak banyak memakai info page/kanvas (kecuali pada format multi-png (MNG)), tetapi ia menyimpan informasi offset page (bahkan offset negatif). IM juga menambahkan sedikit metadata untuk mempertahankan ukuran kanvas virtual agar dapat dipakai perintah IM lain nanti.

Karena informasi itu dipertahankan, saya sangat menyarankan agar "+repage" tetap diterapkan bahkan ketika menyimpan ke JPEG atau format tanpa page lainnya saat informasi tersebut tidak dibutuhkan, sebagai tindakan berjaga-jaga sekaligus untuk memperjelas bahwa Anda memang tidak menginginkannya.

_

Perhatikan, perilaku crop dapat dipengaruhi oleh define berikut:

trim:percent-background=X% Menetapkan seberapa banyak latar belakang yang ditoleransi pada sebuah tepi. Nilainya dinyatakan dalam persen. 0% berarti tidak ada latar belakang yang ditoleransi. 50% berarti sebuah tepi boleh berisi hingga 50% piksel latar belakang menurut faktor fuzz.
trim:edges={north,east,south,west} Hanya men-trim tepi gambar yang disebutkan.
trim:minSize=geometry Membatasi trim pada ukuran yang ditentukan.
type:features=string Menambahkan fitur font yang dipakai delegate RAQM selama penataan teks kompleks. Ini biasanya dipakai untuk menyalakan fitur font opsional yang tidak aktif secara bawaan, tetapi dapat juga dipakai untuk mematikan fitur font bawaan. Fitur tersebut mencakup pengendalian kerning, ligatur, dan aksara Arab.
type:hinting=false Mematikan hinting font. Rendering glyph yang benar mengharuskan titik-titik terskala disejajarkan dengan grid piksel perangkat tujuan, lewat operasi yang sering disebut hinting. Salah satu tujuan utamanya adalah memastikan lebar dan tinggi yang penting dihormati di seluruh font. (Misalnya, sering kali diinginkan agar glyph ‘I’ dan ‘T’ memiliki garis vertikal tengah dengan lebar piksel yang sama. Hinting juga mengatur fitur seperti stem dan overshoot, yang dapat menimbulkan masalah pada ukuran piksel kecil.

Gambar 'missed' (akibat crop yang meleset)

Gambar terakhir pada contoh di atas (mis. "crop_miss.gif") juga menghasilkan gambar kosong khusus. Gambar semacam itu bisa muncul dari operasi seperti Crop, Trim, perbandingan layer, bahkan optimisasi animasi GIF, yang menghasilkan keluaran kosong atau tidak masuk akal. Misalnya pada contoh sebelumnya di atas, operasi "-crop" meleset dari gambar yang hendak dipangkasnya, sehingga menghasilkan gambar 'missed' khusus ini beserta beberapa pesan peringatan informatif...

[IM Text]

Gambar keluarannya, atau gambar 'missed', adalah gambar minimal berukuran satu piksel pada offset 0, tetapi dengan ukuran page atau kanvas gambar aslinya, berikut metadata lain yang mungkin melekat pada gambar itu. Di sini ia mewakili gambar 'kosong' atau 'berukuran nol' yang seharusnya dikembalikan "-crop", tetapi karena tidak ada format gambar yang bisa mengeluarkan gambar berdimensi 'nol', dipakailah gambar satu piksel transparan sebagai gantinya. Supaya lebih jelas, berikut keluaran "identify" untuk gambar missed tersebut, beserta 'enumerasi piksel IM' dari gambar satu piksel itu, yang menunjukkan bahwa isinya hanya satu piksel transparan.

  magick identify crop_miss.gif

[IM Text]

  magick crop_miss.gif  crop_miss_data.txt

[IM Text]

Gambar 'missed' ini pada dasarnya sama dengan membuat gambar "null:", hanya saja ukuran page atau kanvas virtual gambar sumber aslinya ikut disetel (tetapi offset-nya tidak), berikut seluruh metadata gambar lainnya seperti jeda (delay) waktu animasi GIF. Namun metode disposal GIF bisa diubah agar animasi tetap benar setelah dipangkas. Intinya, ingatlah bahwa "-crop" dan operator sejenis dapat menghasilkan gambar 'missed' khusus. Karena itu, saat menulis skrip dengan IM, rencanakan pemeriksaan pesan peringatan atau 'gambar missed' khusus ini bila gambar minimal semacam itu mungkin muncul dan bisa menyusahkan. Bila pesan peringatannya tidak diinginkan (misalnya Anda memang mengantisipasi dan menangani sesekali munculnya gambar 'missed'), tambahkan pengaturan kendali operasional "-quiet" pada baris perintah. Ini memberi tahu IM agar tidak mengeluarkan pesan peringatan informatif, hanya error yang sungguhan. Saat ini belum ada cara untuk membuang gambar 'missed' atau "null:" dari urutan gambar yang sedang diproses. Namun cara semacam itu sudah diusulkan untuk rilis IM mendatang. Kirimi saya email bila ternyata Anda membutuhkannya.

Memangkas gambar yang sudah punya kanvas virtual

Bila sebuah gambar sudah memiliki kanvas virtual (misalnya sebuah frame animasi GIF), maka operasi "-crop" diterapkan relatif terhadap kanvas virtual itu, BUKAN terhadap gambar sebenarnya. Artinya, IM berusaha mempertahankan offset data piksel gambar yang dipangkas pada kanvas tersebut. Dengan kata lain, sebuah piksel tertentu sebelum crop seharusnya tetap berada pada offset yang sama relatif terhadap kanvas virtual sesudahnya. Dengan cara ini, pemangkasan gambar berlapis atau animasi GIF tetap bekerja benar, meski 'kanvas'-nya sendiri tidak ikut dipangkas. Di sini kita membuat sebuah gambar yang diletakkan di tengah kanvas page, lalu memangkasnya dengan berbagai cara. Seperti sebelumnya, ukuran kanvas tidak diubah oleh operasi ini.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif
  magick paged.gif -crop 32x32+16+16  crop_page.gif
  magick paged.gif -crop 32x32+0+0    crop_page_tl.gif
  magick paged.gif -crop 32x32+32+32  crop_page_br.gif
  magick paged.gif -crop 60x60+2+2    crop_page_all.gif
  magick paged.gif -quiet -crop 32x32+56+56  crop_page_miss.gif

  magick identify paged.gif crop_page.gif crop_page_tl.gif crop_page_br.gif \
           crop_page_all.gif crop_page_miss.gif

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

Contoh terakhir di atas tentu saja adalah gambar missed khusus itu. Perhatikan bahwa saya meredam pesan peringatan biasa dari IM dengan pengaturan "-quiet". Supaya jelas apa yang sebenarnya terjadi, mari kita amati lebih dekat crop ber-page pada sudut kanan bawah gambar. Di sini saya menggambar kotak semitransparan di atas area yang dipangkas.

  magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \
          -alpha set  -background none  -mosaic    crop_area_br.png

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

Dari sini terlihat jelas apa yang terjadi. Meski area crop sepenuhnya berada di dalam kanvas page, area itu tidak menutupi seluruh gambar sebenarnya. Akibatnya gambar yang dihasilkan lebih kecil daripada yang mungkin dimaksudkan pengguna, tetapi tetap diletakkan pada kanvas atau page yang lebih besar.

Menghapus kanvas virtual dari hasil

Bila informasi kanvas virtual ini tidak diinginkan, gunakan operator khusus "+repage" untuk mengatur ulang kanvas page dan posisinya agar sesuai dengan gambar hasil crop.

  magick rose: -crop 40x30+10+10  +repage  repage.gif
  magick rose: -crop 40x30+40+30  +repage  repage_br.gif
  magick rose: -crop 40x30-10-10  +repage  repage_tl.gif
  magick rose: -crop 90x60-10-10  +repage  repage_all.gif
  magick rose: -quiet  -crop 40x30+90+60  +repage  repage_miss.gif

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

Inilah tentunya hasil yang biasanya diharapkan pengguna baru IM dari operator "-crop". Hal ini begitu sering dilakukan sampai bisa disebut aturan praktis.

Selalu gunakan "+repage" setelah operasi apa pun yang mirip 'crop'.
Kecuali bila informasi itu memang perlu dipertahankan.

Gambar terakhir di atas tentu saja adalah gambar crop yang meleset khusus itu, tetapi saya meredam pesan peringatannya dengan pengaturan operasional "-quiet". Pada IM versi 5 dan sebelumnya, operasi "+repage" ditangani oleh rangkaian argumen "-page +0+0", biasanya tepat sebelum menyimpan ke format yang memakai informasi kanvas virtual dan offset, seperti GIF. Namun itu hanya bisa dipakai saat membaca atau menulis gambar ke file, sehingga tidak dapat dipakai di antara beberapa operasi pemrosesan gambar.__Dengan penataan ulang baris perintah pada IM versi 6, opsi "-page" menjadi murni pengaturan pembacaan/pembuatan gambar untuk membuat animasi GIF dan lapisan gambar. Karena itu ditambahkan operator terpisah "-repage" dan "-set page" agar pengguna dapat menyetel atau mengubah informasi kanvas virtual.

Crop viewport dengan penyesuaian kanvas virtual

Sejak ImageMagick versi 6.2.4-5, sebuah flag khusus baru dapat ditambahkan pada argumen "-crop". Flag '!' ini menyuruh crop menyesuaikan informasi kanvas virtual gambar hasil agar relatif terhadap area yang dipangkas. Dengan kata lain, berapa pun ukuran gambar hasil pangkasan, kanvas dan offset gambar yang dikembalikan akan disesuaikan dengan area yang Anda minta. Flag ini dapat dibayangkan sebagai memangkas gambar agar cocok dengan 'jendela' atau 'viewport' area crop. Sekalipun separuh gambar tidak tampak di 'jendela' itu, kanvas virtual dan offset bagian yang dikembalikan tetap sesuai dengan 'viewport' tersebut. Sebagai contoh...

  magick rose: -crop 40x30+10+10\!  crop_vp.gif
  magick rose: -crop 40x30+40+30\!  crop_vp_br.gif
  magick rose: -crop 40x30-10-10\!  crop_vp_tl.gif
  magick rose: -crop 90x60-10-10\!  crop_vp_all.gif
  magick rose: -quiet -crop 40x30+90+60\!  crop_vp_miss.gif

  magick identify rose.gif  crop_vp.gif crop_vp_br.gif crop_vp_tl.gif \
              crop_vp_all.gif  crop_vp_miss.gif

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

| Karakter '!' punya makna khusus di sebagian shell UNIX, seperti "csh", sehingga harus di-escape dengan backslash, bahkan ketika ditaruh di dalam tanda kutip.
Perhatikan bagaimana ukuran kanvas gambar hasil kini cocok dengan area tempat gambar itu dipangkas. Untuk crop yang seluruhnya berada di dalam gambar sebenarnya, hasilnya setara dengan menyusulkan "+repage" setelah crop. Namun untuk crop yang sebagian atau seluruhnya meleset, hasilnya berupa kanvas yang lebih besar dan mungkin disertai offset pada gambar hasil. Jadi ini bukan pengganti "+repage" setelah crop untuk mengatur ulang informasi page/kanvas. Meski begitu, 'crop viewport' dapat disusul Flatten untuk 'mengisi' kanvas virtual baru gambar itu dengan piksel sungguhan. Artinya, Anda akan mendapat gambar yang dijamin seukuran crop yang diminta, dengan area yang 'meleset' terisi warna "-background" 'viewport' saat itu. Misalnya ketika memberi padding pada gambar. |

  magick rose: -crop 100x100-15-25\! -background skyblue -flatten \
          crop_viewport.gif

[IM Output]
Melakukan flatten pada gambar setelah crop viewport sebenarnya setara dengan memakai operator extent (lihat di bawah) untuk menghasilkan 'crop dengan padding'. Flag 'crop viewport' juga sangat penting saat memangkas animasi GIF, karena ia bukan hanya menyesuaikan ukuran kanvas, melainkan juga memastikan semua frame gambar tetap terposisi benar di dalam area yang dipangkas. Tanpa opsi ini, memangkas animasi GIF sangat sulit dan menuntut koreksi ukuran serta offset kanvas gambar dari luar. Contohnya lihat Crop animasi, berikut kanvasnya. Dalam banyak hal 'crop viewport' berkerabat dekat dengan pengaturan viewport pada distort khusus, karena keduanya bekerja seolah-olah menjadi 'jendela' ke gambar hasil. Keduanya bisa dipakai sebagai metode 'pemangkasan'. | Flag '!' TIDAK dapat dipakai saat menghasilkan crop tile multi-gambar, atau pada crop tile berluas sama, yang di sana maknanya berbeda. Lihat bagian-bagian terkait di bawah.

Crop relatif terhadap gravity

Posisi offset "-crop" secara bawaan relatif terhadap sudut kiri atas gambar. Namun dengan menyetel pengaturan "-gravity", "-crop" dapat disuruh memotong gambar relatif terhadap pusat, sudut, atau tepi gambar. Penggunaan paling umum dari crop ber-gravity adalah memangkas bagian 'center' sebuah gambar. |

  magick rose: -gravity Center  -crop 32x32+0+0 +repage  crop_center.gif

[IM Output]
Pengaturan "-gravity" tidak hanya memengaruhi posisi 'nol' awal crop, tetapi juga arah offset crop. Misalnya bila "-gravity" bernilai 'South', offset '+0+5' akan menggeser area crop ke atas, bukan ke bawah seperti biasanya. |

  magick rose: -gravity South  -crop 20x20+0+5   crop_south.gif

[IM Output]
Perhatikan posisi contoh crop di atas. Saya sengaja tidak memakai operasi "+repage" agar terlihat bagaimana area crop tergeser dari tepi bawah gambar. Perhatikan pula bahwa area crop bukan hanya relatif terhadap tepi bawah (selatan), melainkan juga 'diratakan' ke tengah tepi bawah itu. Hal yang sama berlaku pada semua operasi yang dipengaruhi gravity.

Memangkas sebagian persentase gambar

Operator "-crop" juga paham cara memangkas gambar menjadi sekian persen dari ukuran aslinya. Contoh berikut memangkas gambar menjadi separuh ukurannya. |

  magick rose:  -crop 50%x+0+0      crop_half.gif

[IM Output]
| Bila hanya satu angka ukuran yang diberikan, nilai itu dipakai untuk persentase lebar sekaligus tinggi, dan ukuran akhir area yang dipangkas dibulatkan ke bilangan bulat terdekat. Offset tidak bersifat opsional.
Perhatikan bahwa meskipun ukurannya boleh berupa persentase, offset selalu dalam piksel. Offset tidak dapat diberikan sebagai persentase dari ukuran gambar. |

  magick rose:  -crop 50%x+30+20      crop_percent.gif

[IM Output]
| _Ketika crop diberi offset, Andaharus menyertakan simbol 'x' pada argumen agar argumen itu ditafsirkan dengan benar. Ini terutama penting bila hanya satu angka yang diberikan untuk lebar sekaligus tinggi area crop.

Karena itu argumen seperti '50%+30+20 tidak bisa dipakai: itu keliru, dan membuat crop diam-diam tidak melakukan apa pun._
Yang lebih umum, crop persentase dilakukan dari pusat gambar. |

  magick rose: -gravity Center -crop 50x80%+0+0  crop_percent_center.gif

[IM Output]
| Simbol persen '%' boleh muncul di mana saja dalam argumen, dan bila diberikan ia berlaku untuk angka lebar sekaligus tinggi. Simbol ini sekadar flag yang menyatakan bahwa bagian 'ukuran gambar' adalah pecahan persentase dari ukuran kanvas virtual atau page gambar. Offset selalu dinyatakan dalam piksel.
Flag 'crop viewport' juga dapat dipakai bersama crop persentase, untuk otomatis menyetel ukuran kanvas dan offset crop ke area yang dipangkas. |

  magick rose: -gravity Center -crop 50%\!  crop_percent_vp.gif

[IM Output]
| _Ukuran persen tidak dapat dipakai untuk crop tile (lihat bagian berikutnya). Karena itu bila offset tidak diberikan dan ukuran persen yang diberikan (seperti di atas), offset +0+0 diasumsikan.

_
Flag '!' membuat "+repage" tidak diperlukan. Meski begitu, tetap disarankan berhati-hati untuk gambar masukan yang mungkin juga punya ukuran dan offset kanvas virtual.

Crop tile, membagi satu gambar menjadi banyak gambar

Salah satu segi crop yang lebih berguna muncul ketika posisi tertentu tidak diberikan pada perintah crop. Artinya, yang diberikan hanyalah ukuran, bukan posisi di dalam gambar yang hendak dipangkas. Dalam hal ini crop tidak menghasilkan satu gambar saja, melainkan serangkaian gambar..

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif  +gravity -crop 32x32  tiles_%d.gif

  magick identify paged.gif tiles_?.gif

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

Bila yang diinginkan hanyalah mengambil sejumlah tile tertentu dari sebuah gambar, lihat Memangkas menjadi bagian-bagian yang kira-kira sama besar di bawah. Ada baiknya memastikan gravity dimatikan dengan "+gravity". Sebabnya, pada satu kasus khusus (crop persentase terpusat) pengaturan gravity dapat mematikan crop tile. Efek gravity lain terhadap crop tile juga tidak terdefinisi.
Dengan operator pelapisan gambar "-mosaic" atau "-flatten" (lihat Layer flatten), gambar-gambar ini dapat ditumpuk kembali satu di atas yang lain sehingga gambar aslinya pulih.
  magick tiles_[0-3].gif -background white -mosaic  tiles_mosaic.gif

[IM Output]
Namun seperti terlihat, kanvas virtual gambar itu telah diisi warna latar belakang oleh "-mosaic". Alternatifnya adalah memakai "-layers merge" (lihat Layer merge), yang menggabungkan beberapa gambar layer menjadi satu gambar layer baru yang ukurannya pas untuk menampung semua gambar yang diberikan. Artinya, kanvas virtual tidak ikut diisi seperti yang dilakukan metode pelapisan "-mosaic" atau "-flatten". |

  magick tiles_[0-3].gif -background none -layers merge  tiles_layered.gif
  magick identify tiles_layered.gif

[IM Output]
|

  [![\[IM Text\]](../static/img/crop/tiles_layered_ident.txt.gif)](../static/img/crop/tiles_layered_ident.txt)

Bila informasi kanvas dan offset sudah diatur ulang dengan "+repage", gambar-gambar itu tidak lagi menyimpan offset asal pemangkasannya maupun ukuran gambar sumbernya. Dalam hal itu, semua gambar dapat disatukan kembali memakai mode 'concatenation' khusus dari "magick montage". Anda perlu memberi tahu montage berapa baris atau kolom gambar yang diambil dari gambar aslinya.

  magick rose: -crop 20x20  +repage  +adjoin  rose_tiles_%02d.gif
  montage -mode concatenate -tile 4x  rose_tiles_*.gif   rose_rejoined.gif

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

Perhatikan bahwa nama masing-masing gambar berkisar dari "rose_tiles_00.gif" sampai "rose_tiles_11.gif", yang sekadar nomor urut tile di memori. Ini kurang enak dipakai karena nama file-nya tidak mudah menunjukkan posisi sebenarnya setiap tile, atau berapa jumlah tile per baris dan kolom. Sejak IM v6.4.8-4, percent escape nama file khusus dapat dipakai untuk menghasilkan dan menyisipkan label khusus ke dalam nama file keluaran. Dipadukan dengan percent escape FX, 'posisi tile' yang berbeda dapat dihitung untuk setiap gambar. Sebagai contoh...

  magick rose: -crop 20x20 \
          -set filename:tile "%[fx:page.x/20+1]_%[fx:page.y/20+1]" \
          +repage +adjoin "rose_tile_%[filename:tile].gif"

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

Perintah itu menghasilkan nama file tile "rose_tile_1_1.gif" sampai "rose_tile_4_3.gif", skema penamaan yang jauh lebih baik. Berbelit, tetapi berhasil. Sayangnya angka yang dihasilkan percent escape tidak bisa diformat, entah untuk diberi padding nol atau ditentukan jumlah digit desimalnya. Setidaknya untuk saat ini.

Crop tile terpusat

Dalam sebuah diskusi di forum IM muncul permintaan agar crop tile dipusatkan sehingga 'gambar sisa'-nya tersebar merata di sekeliling tepi. Dengan begitu kita memaksimalkan efek tile yang utuh dengan menempatkannya di tengah gambar. Tentu saja tile tepi yang tidak utuh pun jadi lebih banyak. Solusinya adalah memusatkan gambar masukan pada kanvas virtual yang ukurannya kelipatan ukuran tile yang diinginkan. Misalnya, untuk memangkas gambar "rose:" (berukuran 70x46 piksel) menjadi tile 30x20 utuh sebanyak-banyaknya di tengah gambar (dikelilingi tile sisa), lakukan langkah berikut.

  1. Pertama, hitung berapa tile utuh yang bisa didapat dari gambar itu dengan membagi ukuran gambarnya...

     70x46 / 30x20 => 2x2 tile utuh + sisa
    
  2. Sekarang tambahkan 2 baris dan kolom lagi untuk menampung gambar sisa (bila diperlukan)

     2x2 + 2x2 => 4x4 gambar tile
    
  3. Kalikan ukuran tile dengan angka itu untuk mendapat ukuran kanvas virtual.

     30x20 * 4x4 => 120x80 ukuran kanvas
    
  4. Kurangi dengan ukuran gambar asli lalu bagi dua untuk mendapat offset pemusatan.

     ( 120x80 - 70x46 ) / 2 => +25+17
    

Jadi kanvas virtual dan offset pemusatannya adalah 120x80+25+17. Dan di sini kita memakai perhitungan di atas untuk melakukan crop tile terpusat...

  magick rose: -repage 120x80+25+17 -crop 30x20 +repage rose_30x20_%02d.gif

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

Bila lokasi offset asli tile ingin dipertahankan tetapi offset pemusatannya dibuang, lakukan penyesuaian offset relatif dengan "-repage -25-17\!" (menggantikan "+repage" di atas). Bila dua kolom dan baris tambahan tidak ditambahkan pada jumlah tile sehingga muncul offset negatif, tile sisa di tepi praktis bisa diabaikan, dan hanya tile utuh yang ada di dalam gambar yang dikeluarkan.

  magick rose: -repage 60x40-5-3 -crop 30x20 +repage rose_ctiles_%d.gif

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

Pada dasarnya, karena sisa-sisa itu kini berada di 'luar' kanvas virtual yang dihitung, operator "-crop" tidak tahu keberadaannya dan mengabaikannya. Sekali lagi, mengganti "+repage" di atas dengan penyesuaian offset relatif memakai nilai offset yang dinegasikan, "-repage +5+3\!", akan memulihkan lokasi offset asal tile itu dipangkas. Alternatif untuk crop tile terpusat sambil mengabaikan sisa adalah cukup mengganti pengaturan kanvas virtual dengan crop yang sesuai.

  magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \
          -crop 30x20 +repage rose_ctiles2_%d.gif

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

Cara di atas lebih mudah dipahami, tetapi juga sedikit lebih lambat karena kini dua kali crop dijalankan. Meski begitu, perhitungan yang dibutuhkan lebih sedikit. Namun bila offset tile aslinya ingin dipulihkan, offset relatif itu tetap harus dihitung, dan kalau begitu sekalian saja pakai metode pertama yang lebih cepat lewat kanvas virtual gambar.

Crop strip, memotong baris dan kolom

Pada IM versi 6.1.1, "-crop" diperbaiki sehingga bila salah satu argumen ukurannya tidak ada atau disetel nol, argumen ukuran yang hilang itu diisi dengan ukuran kanvas/page gambar. Dalam kebanyakan kasus ini cukup besar untuk menutupi gambar yang berada di atas kanvas, asalkan offset terkait juga disetel nol. Perubahan kecil ini memudahkan pemotongan satu baris atau satu kolom dari gambar, tanpa perlu angka raksasa seperti '999999' untuk menutupi ukuran gambar. Contohnya, di sini kita mengambil satu baris dan satu kolom sederhana dari gambar rose 'ber-page' tadi.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif  -crop 20x0+30+0  strip_column.gif

  magick paged.gif  -crop 0x20+0+30  strip_row.gif

  magick identify paged.gif strip_column.gif strip_row.gif

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

  [![\[IM Text\]](../static/img/crop/strip_ident.txt.gif)](../static/img/crop/strip_ident.txt)

Bila kedua offset dihapus berikut salah satu argumen ukuran, gambar dapat dibagi menjadi serangkaian strip atau kolom, bukan tile.

  magick rose: -crop 40x30+10+10  crop.gif

  magick crop.gif -quiet -crop  20x  strips_%d.gif
  magick identify crop.gif strips_?.gif

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

  [![\[IM Text\]](../static/img/crop/strips_ident.txt.gif)](../static/img/crop/strips_ident.txt)

Perhatikan bahwa crop tile, baik strip maupun bukan, membentang di seluruh kanvas page gambar dan karenanya sejajar dengan kanvas itu, BUKAN hanya dengan gambar sebenarnya. Itulah sebabnya gambar pertama dan terakhir yang dihasilkan pada contoh di atas hanya selebar 10 piksel. Tentu saja bila sebuah tile tertentu, dalam hal ini 'kolom', meleset dari gambar sebenarnya di atas kanvas virtual (seperti gambar terakhir di atas), gambar crop yang meleset akan dihasilkan. Peringatan yang biasanya dikeluarkan IM diredam dengan pengaturan "-quiet". Ini tidak disarankan kecuali Anda memang mengantisipasi kejadian itu dan siap menghadapinya, misalnya di dalam skrip. | _Sebuah gambar bisa saja terposisi sedemikian rupa sehingga tidak muncul sama sekali pada page atau kanvas virtualnya sendiri, atau begitu besar sampai kanvas page hanya memuat sepotong jendela kecil atau sebagian gambar itu.

Dalam kasus langka semacam itu, crop strip tanpa argumen ukuran akan salah membagi gambar, dan berturut-turut menghasilkan gambar missed atau tile yang lebih kecil berisi hanya bagian di dalam batas kanvas virtual.

Namun operator "-crop" tidak akan diperbaiki untuk menangani kasus khusus yang langka ini, karena perbaikan itu justru menghalangi penggunaannya pada kasus lain, seperti contoh-contoh di bawah.

Bila hal ini merepotkan, bersihkan dulu offset page gambar sebelum memangkas dengan memakai "+repage" untuk membuang kanvas virtual, sebelum mencoba menghasilkan gambar tile._
Sebagai cara lain membagi gambar menjadi baris-baris terpisah, lihat skrip khusus "divide_vert". Program ini membagi gambar berdasarkan 'celah' mendatar berwarna polos tunggal. Misalnya, bila diberi gambar teks sederhana, ia akan membaginya menjadi gambar 'baris' dan 'celah' berselang-seling. Sebuah opsi sederhana memungkinkan celah itu dibuang.

Kuadran, memotong di sekitar satu titik

Setiap angka ukuran crop yang tidak diberikan akan digantikan oleh ukuran kanvas gambar yang sedang dipangkas. Dalam kebanyakan kasus, hasilnya adalah seluruh gambar pada dimensi itu ikut masuk ke hasil crop. Dengan pemakaian argumen yang cermat, ini memungkinkan gambar dipangkas menjadi empat bagian di sekitar sebuah titik tertentu (dengan piksel titik itu menjadi piksel kanan atas pada gambar kuadran kiri bawah). Untuk itu, ukuran gambarnya tidak perlu diketahui. Contohnya, di sini saya memangkas gambar menjadi kuadran di sekitar titik 30,40

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif  -crop 30x40+0+0  quadrant_tl.gif

  magick paged.gif  -crop 0x40+30+0  quadrant_tr.gif

  magick paged.gif  -crop 30x0+0+40  quadrant_bl.gif

  magick paged.gif  -crop    +30+40  quadrant_br.gif

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

Tentu saja bila titik pusat pemangkasan meleset dari gambar sebenarnya, dua atau bahkan tiga gambar kuadran yang dihasilkan akan berupa gambar error crop yang meleset khusus itu.

Menggunakan offset negatif, membuang tepi bawah atau kanan

Tidak ada alasan offset negatif tidak boleh dipakai bersama "-crop". Malah kadang-kadang manfaatnya sangat nyata. Contohnya, mari ambil gambar rose ber-page tadi dan memangkasnya secara bertahap dengan offset negatif yang makin besar. Kita tidak memberikan ukuran gambar pada argumen "-crop", sehingga ukurannya jatuh ke bawaan, yaitu ukuran kanvas gambar.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif  -crop -10-10  neg_offset_1.gif

  magick paged.gif  -crop -20-20  neg_offset_2.gif

  magick paged.gif  -crop -30-30  neg_offset_3.gif

  magick paged.gif  -crop -40-40  neg_offset_4.gif

  magick paged.gif  -crop -50-50  neg_offset_5.gif

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

Seperti terlihat, menurunkan offset ke nilai negatif yang makin besar perlahan-lahan 'memotong' tepi bawah dan kanan, sampai contoh terakhir nyaris meleset dari gambar sebenarnya. Bila dilanjutkan satu langkah lagi, gambar missed akan dihasilkan. Ini mirip memakai operator "-chop" tetapi tanpa pengaturan "-gravity". Lihat Chop, menghapus tepi. Tentu saja dengan "-crop" Anda mungkin perlu memakai operator "+repage" untuk menyesuaikan informasi kanvas/page, sementara "-chop" melakukan penyesuaian itu secara otomatis. Begitulah hidup.

Memangkas menjadi bagian-bagian yang kira-kira sama besar

Masalah terbesar crop tile adalah kita hanya bisa menetapkan ukuran akhir tiap tile. Cara ini bekerja bagus ketika ukuran gambar merupakan kelipatan pas dari ukuran tile yang diinginkan, tetapi seperti sudah terlihat, bila tidak demikian akan tersisa tile 'pendek' di tepi kanan dan bawah. Contohnya, mari kita bagi lagi gambar rose bawaan, kali ini menjadi 3x3 tile. Gambar aslinya 70x46 piksel, jadi dibagi 3 membuat tiap tile berukuran 23x15 piksel...

  magick rose: -crop 23x15  +repage  +adjoin  rose_23x15_%02d.gif

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

Nah, seperti terlihat, ini tidak berhasil karena gambar rose tidak bisa dibagi tepat menjadi 3 tile berukuran sama. Dalam kasus ini tersisa tile yang 'kurang' 1 piksel. Bahkan bila ukuran tile diperbesar menjadi 24x16 piksel, tetap ada tile yang 2 piksel lebih 'pendek' daripada tile lain. Keadaan ini makin parah seiring bertambahnya jumlah tile yang diinginkan. Coba misalnya membagi panjang 100 menjadi 30 tile. Mustahil. Pilihannya panjang 3 dan dapat 34 tile, atau 4 dan dapat 25 tile. Mendapat tepat 30 tile berukuran sama itu mustahil! Sejak IM v6.5.8-9, flag khusus '@' dapat ditambahkan pada argumen "-crop". Flag ini menyuruh operator "-crop" berusaha sebisanya membagi gambar menjadi jumlah tile yang diberikan. Sebagai contoh...

  magick rose: -crop 3x3@  +repage  +adjoin  rose_3x3@_%d.gif

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

Hasilnya, gambar terbagi menjadi tile yang ukurannya sedikit berbeda-beda. Namun selisih ukuran tile paling banyak 1 piksel! Silakan periksa sendiri! Sebagai bonus, gambar juga bisa dibagi sedemikian rupa sehingga tiap tile 'overlap' dengan tetangganya. Caranya, selain memakai flag '@', tentukan pula berapa piksel overlap yang diinginkan. Misalnya, mari bagi rose menjadi empat bagian dengan overlap 20 piksel.

  magick rose: -crop 2x2+20+20@  +repage  +adjoin  rose_2x2+20+20@_%d.gif

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

Sekali lagi, semua potongan hanya berbeda ukuran paling banyak satu piksel! Meski dalam kasus ini gambar hasilnya berukuran sama, karena rose habis dibagi 2. Lain halnya bila ukuran overlap atau gambarnya ganjil. Dalam hal itu elemen yang lebih besar berada di sepanjang tepi atas dan kiri. Namun dengan tiga tile, elemen yang lebih besar (atau lebih kecil) diletakkan di tengah! Overlap negatif bahkan bisa dipakai untuk 'melompati' persis sekian piksel di antara tile! Bagaimana persisnya operator ini diterapkan bergantung pada piksel mana yang ingin di-'overlap' atau di-'lompati'. Dan itu bergantung pada karakter 'tepi' gambarnya (lihat Memisahkan gambar tile yang berjarak di bawah). Seperti pada pemakaian operator "-crop" mana pun, disarankan memakai "+repage untuk membuang offset 'page' bila tidak diinginkan. Namun informasi offset gambar hasil crop bisa sangat berguna, dan itulah sebabnya ia dipertahankan. Informasi itu misalnya dapat dipakai untuk menamai file keluaran, atau mencari tahu ukuran dan lokasi tile yang dihitung IM. Perhatikan bahwa crop tile berukuran sama adalah satu-satunya situasi ketika operator "-crop" mengabaikan kanvas virtual gambar saat menentukan bagian mana yang dipangkas. Artinya, perhitungan crop tile didasarkan pada ukuran gambar sebenarnya, bukan ukuran kanvas virtual. Meski begitu, offset akhir tiap tile tetap relatif terhadap kanvas virtual aslinya. Opsi crop ini juga bisa dipakai sebagai alternatif operator shave untuk gambar 'ber-page'. Sebelum IM versi v6.6.1-0, crop tile berukuran sama pada gambar yang punya offset kanvas virtual masih rusak.

Memisahkan gambar tile yang berjarak

Sering kali Anda punya gambar berisi tile berukuran tetap yang dipisahkan jarak dengan lebar tetap pula. Operator crop dengan flag '@' yang baru memudahkan pemotongan tile-tile itu, baik dengan menyertakan maupun melewati ruang di sekelilingnya. Masalah utamanya, meski gambar 'tile' punya ruang berukuran tetap di sekitarnya, ruang di sepanjang tepi luar biasanya tidak setetap itu. Dari sini muncul tiga gaya dasar karakter tepi pada sekumpulan gambar 'berjarak', dan tiap jenis perlu ditangani sedikit berbeda. Tile hasil montage Di sini gambar aslinya sekadar diberi border berukuran tetap sebelum disambung. Akibatnya jarak antar-tile selalu berjumlah piksel genap. Yang lebih penting, 'jarak tepi'-nya tepat separuh jarak yang ditaruh di antara tile. Beginilah sebenarnya "montage" memberi jarak pada 'sel' tile-nya, dan dengan perintah inilah gambar contoh di bawah dihasilkan. Karena gambar-gambar itu sekadar dijejerkan, Anda bisa memakai crop tile biasa (bila ukuran tile-nya diketahui) atau crop berukuran sama (bila jumlah tile-nya diketahui) untuk memisahkan sub-gambar dari border di sekelilingnya. Pada dasarnya tidak ada overlap antar-tile, dan operator shave sederhana kemudian dapat dipakai untuk membuang border itu dari tile hasil.

  magick montage.gif -crop 5x1@ +repage +adjoin montage_%d.gif
  magick montage_?.gif -shave 3x3 montage-3_%d.gif

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

Jarak yang sama di sekeliling tepi Di sini sub-gambar bukan hanya 'diberi jarak' 6 piksel, melainkan juga punya jarak 6 piksel di sekeliling tepinya, sehingga tampak rapi. Ini ditangani dengan crop berukuran sama bawaan disertai jumlah 'overlap' piksel yang sesuai. Sebagai contoh...

  magick edged.gif -crop 5x1+6+6@ +repage +adjoin edged+6_%d.gif

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

Perhatikan bagaimana operator itu memisahkan gambar-gambar tersebut sehingga ukurannya tetap sama, tetapi dengan overlap 6 piksel. Justru itulah tujuan perancangannya. Dengan offset negatif, IM diberi tahu bahwa area yang overlap (bagian jarak) tidak boleh masuk ke hasil akhir.

  magick edged.gif -crop 5x1-6-6@ +repage +adjoin edged-6_%d.gif

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

Kalau saya lanjutkan dengan mengurangi lebih banyak piksel lagi, sebagian border putih pada angka-angka di atas bahkan ikut ter-trim.

  magick edged.gif -crop 5x1-8-8@ +repage +adjoin edged-8_%d.gif

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

Cara ini bahkan bisa dipakai sebagai alternatif operator shave, cukup dengan menentukan crop 1 tile...

  magick edged+6_0.gif -crop 1x1-6-6@ +repage tile-shave.gif

[IM Output] [IM Output]

Tile berjarak sederhana Gambar tile berjarak yang paling sederhana tidak punya jarak tepi, atau jarak tepinya sudah di-trim dari gambar. Namun agar ini tertangani, IM harus diberi tahu tentang situasi khusus tersebut dengan menyertakan KEDUA flag '@' dan '!' sekaligus.

  magick spaced.gif -crop 5x1+6+6@\! +repage +adjoin spaced+6_%d.gif

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

Perhatikan bahwa gambar di tepi pembagian ini sedikit lebih pendek daripada gambar di tengah. Itulah sebabnya 'mode' operasi khusus ini BUKAN bawaan, meskipun sebenarnya lebih sederhana daripada kategori tile berjarak sebelumnya. Perhatikan pula bahwa saat memakai flag '@' dan '!' sekaligus, crop satu tile (dalam hal ini secara vertikal) tidak berpengaruh apa-apa, karena bagian atas maupun bawah tile itu sama-sama 'tepi' sehingga tidak ada 'ruang tepi' yang bisa dibuang. Sekali lagi, dengan nilai overlap negatif, IM dapat disuruh tidak menyertakan area yang overlap (bagian jarak) ke dalam hasil crop tile.

  magick spaced.gif -crop 5x1-6-6@\! +repage +adjoin spaced-6_%d.gif

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

| Karakter '!' punya makna khusus di sebagian shell UNIX, seperti "csh", sehingga harus di-escape dengan backslash, bahkan ketika ditaruh di dalam tanda kutip.
Dengan rumus-rumus ini, Anda kini semestinya dapat memangkas gambar yang tersusun sebagai grid, bahkan ketika gambarnya saling overlap atau berjarak. Sekalipun persoalan yang Anda hadapi tidak persis masuk ke salah satu kasus di atas, piksel tepinya semestinya bisa ditambah atau dikurangi seperlunya sehingga gambar itu jatuh ke salah satu kategori gambar berjarak di atas.


Menambah/menghapus tepi gambar

Border, menambahkan ruang di sekeliling gambar

Sering kali Anda cuma ingin menambahkan sedikit ruang kerja di sekeliling tepi gambar, tanpa harus bergantung pada pengetahuan tentang ukuran gambar itu. Ada banyak cara menambah ruang pada gambar di luar penambahan ruang secara langsung, antara lain menyambungkan gambar kosong atau label, mengomposisikan overlay 'Src', atau sekadar menempatkan gambar pada kanvas yang lebih besar. Namun cara-cara itu biasanya menuntut setidaknya perkiraan seberapa besar gambar yang sedang dikerjakan. Salah satu bentuk penambahan ruang gambar yang paling sederhana adalah operasi "-border". Warna ruang yang ditambahkan berasal dari pengaturan "-bordercolor". Berikut beberapa contoh yang lugas..

  magick rose: -bordercolor SkyBlue    -border 10x10 border.gif
  magick rose:                         -border 15x6  border_default.gif
  magick rose: -bordercolor LimeGreen  -border 10x0  border_sides.gif
  magick rose: -bordercolor Tomato     -border  0x10 border_topbot.gif
  magick rose: -alpha set -bordercolor none -border 10    border_none.gif

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

Perhatikan gambar contoh terakhir di atas. Warna border disetel ke warna transparan "none", tetapi agar ini bekerja sesuai harapan kita perlu memastikan gambarnya benar-benar punya kanal 'matte' atau 'alpha'. Perhatikan pula bahwa bila ukuran border vertikal dan horizontalnya sama, angka kedua boleh dihilangkan dan cukup satu angka saja. Seperti terlihat di atas, warna bawaan yang dipakai operator "-border" adalah abu-abu muda karena warna itu serasi dengan warna halaman abu-abu bawaan pada halaman web di WWW.
Border juga bisa ditentukan sebagai persentase dari ukuran gambar...
  magick rose: -border 10%x10%  border_percent.jpg

[IM Output]
Yang sebenarnya terjadi di balik layar adalah "-border" membuat gambar baru berukuran pas, lalu menimpakan gambar sumber aslinya di atas latar belakang baru itu. Operasi ini sendiri sangat berguna di ImageMagick untuk menyetel latar belakang gambar transparan dan semitransparan. Artinya, operasi "-border 0" yang tampak percuma itu justru sangat berguna pada IM versi 6. Sebagai contoh...

  magick star.gif -bordercolor LimeGreen -border 0  star_background.gif

[IM Output] [IM Output]

Tentu ada banyak cara lain untuk Menghapus transparansi dari gambar. Kenyataan bahwa menambahkan border pada gambar bertransparansi juga secara bawaan mengisi latar belakang transparan gambar itu telah memicu perdebatan di antara pengguna IM dan tim pengembang. Ringkasan perdebatan itu ada diBorder, frame, dan pemakaian BorderColor.

Border dan komposisi alpha

Penimpaan gambar ke atas kanvas berwarna bordercolor dikendalikan pengaturan "-compose", yang secara bawaan disetel ke pengomposisian alpha 'Over'. Bila disetel ke nilai lain, operasi "-border" bisa menghasilkan sesuatu yang tak terduga. Sebagai contoh, berikut beberapa pemakaian "-compose" yang lebih menarik bersama operator gambar "-border" pada gambar yang punya area transparan.

  magick star.gif -bordercolor LimeGreen \
                   -compose {_operation_} -border 5  {_result_}

[IM Output]

Pilihan antara 'Over' dan 'Copy' pada dasarnya menentukan apakah transparansi pada gambar ingin dipertahankan atau tidak. Sebagai contoh, berikut gambar 'star' bertransparansi yang sama, tetapi kali ini border-nya ditambahkan tanpa merusak transparansi gambar itu. |

  magick star.gif  -bordercolor LimeGreen   -compose Copy \
                     -border 5     star_border_copy.gif

[IM Output]
Compose 'Src' akan menambahkan border transparan pada gambar (bila gambar itu punya kanal alpha), tanpa memedulikan pengaturan "-bordercolor" saat itu. Pada dasarnya kanvas latar belakang yang dibuat "-border" diabaikan. 'Dst' mungkin tampak tidak berguna, tetapi bisa dipakai untuk menghasilkan kanvas seukuran (atau sedikit lebih besar dari) gambar aslinya. Gambar asli hanya dipakai untuk menentukan ukuran akhir kanvas. Contoh lain ada di Membuat gambar berukuran sama. Keterangan lebih lanjut tentang berbagai metode "-compose" ada di Contoh pengomposisian alpha.

Border dan kanvas virtual

Ketika "-border" diterapkan pada gambar yang punya kanvas virtual, border tetap ditambahkan di sekeliling gambar sebenarnya di atas kanvas itu, BUKAN di sekeliling seluruh kanvas.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif         -border 5x5        paged_border.gif

[IM Output] [IM Output]

Perhatikan bahwa ukuran kanvas virtual juga bertambah sebesar dua kali tebal border untuk menampung border yang ditambahkan. Ini tentu berarti border tidak bisa begitu saja ditambahkan langsung pada animasi GIF biasa, kecuali bila sub-frame animasi itu memang ingin ditandai satu per satu (lihat misalnya skrip Montage frame animasi yang memakai hal ini sebagai opsi untuk memberi 'frame' pada gambar overlay). Bila border ingin ditambahkan, lakukan dulu coalesce pada animasi itu untuk membuang optimisasi frame yang mungkin ada padanya.

Frame, menambahkan border bergaya 3D

Operator "-frame" sangat mirip dengan "-border", dan bila Anda melihat gambar contoh pertama yang dihasilkan di bawah, hasilnya persis sama, hanya saja ia memakai "-mattecolor" alih-alih "-bordercolor". Perhatikan bahwa "-bordercolor" tetap dipakai saat menghasilkan gambar ber-frame, lihat di bawah. Untuk memakai "-frame" dengan benar, perintah itu perlu diberi empat argumen, bukan hanya 2. Argumen tambahannya menentukan lebar bevel 'luar' dan 'dalam' frame yang dihasilkan. Berikut beberapa contoh pemakaian operator "-frame" dengan berbagai pengaturan.

  magick rose:                    -frame 10x10      frame.gif
  magick rose:                    -frame 15x6+2+2   frame_wierd.gif
  magick rose: -mattecolor SkyBlue -frame 6x6+2+2    frame_blue.gif
  magick rose: -mattecolor Tomato  -frame 10x10+5+5  frame_red.gif

  magick rose:   -frame 10x10+10+0    frame_rasied.gif
  magick rose:   -frame 10x10+6+0     frame_rasied_part.gif
  magick rose:   -frame 10x10+0+6     frame_sunken_part.gif
  magick rose:   -frame 10x10+0+10    frame_sunken.gif

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

Memakai beberapa operasi frame sekaligus juga dapat menghasilkan gaya frame yang lebih aneh.

  magick rose:      -frame 10x10+3+3                    frame_normal.gif
  magick rose:      -frame 3x3+3+0      -frame 7x7+3+0  frame_popped.gif
  magick rose:      -frame 7x7+0+3      -frame 3x3+0+3  frame_pressed.gif
  magick rose: -frame 3x3+3+0 -frame 4x4 -frame 3x3+0+3  frame_inverted.gif

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

| Nilai bawaan "-mattecolor" adalah abu-abu yang sedikit lebih gelap daripada pengaturan bawaan "-bordercolor". Warna ini pun serasi dengan warna abu-abu bawaan halaman web di WWW (yang dipakai peramban awal seperti "mosaic" dan "netscape". (Lihat di bawah)
| Walaupun "-frame" memang memakai warna "-mattecolor", ia juga menurunkan empat warna tambahan dari warna dasar itu untuk menggambar frame. Artinya, kemungkinan besar lima warna terkait yang ditambahkan ke gambar, bukan satu.
Dengan sedikit usaha, gambar ber-frame ala "magick montage" lengkap dengan label teks pun bisa ditiru. |

  magick rose:  -mattecolor grey  -background grey  -frame 3x3+0+3 \
          -gravity South -splice 0x15 -annotate 0x0 'A Red Rose' \
          -frame 6x6+3+0    frame_montage.gif

[IM Output]
"-mattecolor" semitransparan bahkan bisa dipakai untuk "-frame", lalu sebuah pola menarik (misalnya kanvas plasma fraktal) di-'underlay' di bawahnya, sehingga frame-nya lebih berwarna. |

  magick rose: -alpha set -mattecolor '#CCC6' -frame 10x10+3+4 \
          \( -size 100x100 plasma:fractal -normalize -blur 0x1 \) \
          -compose DstOver -composite   frame_plasma.gif

[IM Output]
Sebagai alternatif, frame-nya dapat diwarnai terpisah (dihasilkan lewat pengaturan komposisi 'Dst' khusus), lalu gambarnya ditimpakan ke dalam frame setelah frame itu diwarnai. Tetapi itu sudah sangat berbelit. Untuk teknik pemakaian frame yang lebih maju, lihat Teknik pembuatan frame.

Frame dan komposisi alpha

Frame berkerabat dekat dengan operator "-border". Frame bukan hanya digambar memakai "-mattecolor"; operator ini juga memanfaatkan pengaturan "-bordercolor" untuk menentukan latar belakang tempat frame itu mula-mula digambar. Nah, pada gambar yang tidak punya transparansi, "-bordercolor" tidak akan terlihat karena tertimpa gambar itu sendiri. Tetapi pada gambar yang punya area transparan, warna latar belakang itu jadi terlihat. |

  magick star.gif  -frame 6x6+2+2 star_framed.gif

[IM Output]
Dengan kata lain, "-frame" berlaku seolah-olah gambar Anda diambil lalu ditimpakan pada sebuah frame foto berlatar warna polos. Karena itu setiap bagian gambar yang transparan akan diganti dengan "-bordercolor", yang secara bawaan berwarna abu-abu muda. | Kenyataan bahwa menambahkan frame pada gambar bertransparansi juga secara bawaan mengisi latar belakang transparan gambar itu dengan bordercolor telah memicu perdebatan di antara pengguna IM dan tim pengembang. Ringkasan perdebatan itu ada diBorder, frame, dan pemakaian BorderColor.
Bila transparansi gambar ingin dipertahankan saat diberi frame, ada dua solusi. Yang pertama adalah memakai "-bordercolor" transparan seperti 'none'. |

  magick star.gif -bordercolor none  -frame 6x6+2+2  star_framed_none.gif

[IM Output]
Solusi lain, sekaligus metode yang lebih disukai, adalah memastikan piksel transparan tetap terjaga saat gambar dimasukkan ke frame. Caranya dengan memakai metode "-compose" khusus bernama 'Copy'. |

  magick star.gif -compose Copy  -frame 6x6+2+2  star_framed_copy.gif

[IM Output]
| Pemakaian "-bordercolor" sebagai gambar latar belakang untuk "-border" maupun "-frame" ditambahkan ke IM pada versi 6.1.4. Sebelum itu, kanvas latar belakang yang dihasilkan berupa kanvas hitam yang di atasnya border atau frame digambar.

Pemakaian warna hitam ini sangat buruk bagi perintah "magick montage" yang banyak memakai fungsi internal "-frame" dalam pemrosesannya. (Lihat Penanganan latar belakang dan transparansi montage)
Seperti terlihat, operator "-frame", sama seperti "-border", juga memakai pengaturan "-compose" untuk menentukan bagaimana gambar sumber ditimpakan ke frame latar belakang.

  magick star.gif -bordercolor LimeGreen \
          -compose {_operation_} -frame 6x6+2+2  {_result_}

[IM Output]

Pemakaian pengaturan "-compose" bernilai 'Copy' menjadi sangat penting bila pengaturan "-bordercolor" juga ingin dipakai pada frame "magick montage". Lihat Penanganan latar belakang dan transparansi montage untuk keterangan lebih rinci.

Frame dan kanvas virtual

Sama seperti Border dan kanvas virtual, frame pun diterapkan di sekeliling gambar sebenarnya di atas kanvas virtual itu, BUKAN di sekeliling seluruh kanvas.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif         -frame 5x5+2+2     paged_framed.gif

[IM Output] [IM Output]

Perhatikan bahwa ukuran kanvas virtual juga bertambah sebesar dua kali tebal border untuk menampung frame yang ditambahkan. Ini tentu berarti frame tidak bisa begitu saja ditambahkan langsung pada animasi GIF biasa, kecuali bila sub-frame animasi itu memang ingin ditandai satu per satu (lihat misalnya Montage frame animasi). Bila border ingin ditambahkan, lakukan dulu coalesce pada animasi itu untuk membuang optimisasi frame yang mungkin ada padanya.

Shave, membuang tepi dari gambar

Kebalikan dari operator "-border" atau "-frame" adalah "-shave", yang bila diberi argumen yang sama akan membuang ruang yang ditambahkan perintah-perintah tadi.

  magick border.gif -shave 10x10 shave.gif
  magick border.gif -shave 10x0  shave_sides.gif
  magick border.gif -shave  0x20 shave_topbot.gif

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

Hal utama yang perlu diingat tentang ketiga operator ini adalah bahwa mereka menambah dan membuang ruang pada sisi-sisi gambar yang berseberangan, bukan hanya satu sisi atau sisi yang bersebelahan. Bila hanya satu tepi gambar yang ingin dibuang, pakailah operator "-chop" sebagai gantinya. (Lihat contoh chop di bawah.) Seperti sebelumnya, operator "-border", "-frame", dan "-shave" hanya memengaruhi gambar sebenarnya di atas kanvas virtual, bukan kanvas virtualnya sendiri.

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif

  magick paged.gif         -border 5x5        paged_border.gif

  magick paged_border.gif  -frame  5x5+2+2    paged_frame.gif

  magick paged_frame.gif   -shave  10x10      paged_shave.gif

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

Alternatif dari shave adalah memakai operator crop tile berukuran sama yang baru. Kelebihan operator ini, tidak seperti "-shave, ia tidak mengubah ukuran kanvas gambar hasilnya.

  magick paged_frame.gif   -crop  1x1-10-10@     paged_tile_shave.gif

[IM Output] [IM Output]

| Sebelum IM versi v6.6.1-0, crop tile berukuran sama pada gambar yang punya offset kanvas (seperti di atas) masih rusak.

Extent, penyesuaian ukuran gambar secara langsung

Setelah beberapa diskusi, sebuah operator untuk langsung menyesuaikan ukuran akhir gambar ditambahkan ke IM versi 6.2.4, yaitu operator "-extent". Bila ukuran gambar bertambah, ruang ditambahkan di tepi kanan atau bawah gambar. Bila berkurang, data gambarnya sekadar dibuang atau dipangkas agar pas dengan ukuran gambar yang baru. Pada kedua kasus itu, area kiri atas gambar umumnya tidak terpengaruh.

  magick rose: -background skyblue -extent 100x60     extent_enlarge.gif
  magick rose: -background skyblue -extent  40x40     extent_shrink.gif
  magick rose: -background skyblue -extent 100x40     extent_wider.gif
  magick rose: -background skyblue -extent  40x60     extent_taller.gif

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

Seperti terlihat, area baru mana pun yang ditambahkan ke gambar akan diisi dengan warna "-background". Sebelum IM versi v6.3.2, "-extent" sekadar menolkan memori area baru itu, alias hitam pekat. Ia tidak mengisi area tersebut dengan warna "-background".
Sejak IM v6.3.2 pula, "-extent" memakai "-gravity" untuk menentukan di mana area yang ditambah/dibuang diletakkan relatif terhadap gambar aslinya.
  magick rose: -gravity north  -extent 100x80 extent_north.gif
  magick rose: -gravity south  -extent 100x80 extent_south.gif
  magick rose: -gravity east   -extent 100x80 extent_east.gif
  magick rose: -gravity west   -extent 100x80 extent_west.gif
  magick rose: -gravity center -extent 100x80 extent_center.gif
  magick rose: -gravity center -extent  40x80  extent_center2.gif

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

Contoh terakhir di atas menunjukkan bahwa extent juga bisa melakukan crop terpusat tanpa perlu "-repage", walau ia memang me-'flatten' gambar dengan warna "-background" saat itu. Offset pun bisa dipakai, yang pada dasarnya berarti operator extent sekadar crop biasa dengan isian bantalan latar belakang, terlepas dari posisinya. |

  magick rose: -background skyblue -extent 100x100-15-25 extent.png

[IM Output]
Kemampuan memangkas sekaligus memperluas gambar menurut gravity membuat operator ini sempurna untuk memberi padding atau memangkas gambar agar pas ke area berukuran tertentu; lihat misalnya Padding/mengisi thumbnail agar pas. Perhatikan bahwa "-extent" bekerja dengan teknik 'penimpaan' yang sama seperti operator border dan frame. Karena itu, secara bawaan memakainya pada gambar bertransparansi akan mengganti transparansi tersebut dengan warna "-background" saat itu. |

  magick star.gif  -background LimeGreen  -extent 80x80-10-10  star_extent.gif

[IM Output]
Sekali lagi, solusinya adalah menyetel metode "-compose" yang sesuai, atau menyetel warna "-background" ke 'None'.


Menambah/menghapus baris, kolom, dan tepi

Splice, menambahkan baris, kolom, dan tepi

Operator "-splice" adalah hal baru pada IM versi 6, lihat Splice, contoh pembuatan operator gambar baru. Pada dasarnya ia memberi kemampuan yang sangat dibutuhkan untuk menyisipkan baris atau kolom berupa ruang ke tengah atau ke salah satu tepi gambar. Warna ruang yang disisipkan berasal dari pengaturan warna "-background".

  magick rose: -background blue  -splice 20x10+40+30  splice.gif
  magick rose: -background blue  -splice 20x0+40+0    splice_column.gif
  magick rose: -background blue  -splice 0x10+0+30    splice_row.gif
  magick rose: -background blue  -splice 20x10        splice_topleft.gif

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

| Bila warna latar belakang tidak disetel, IM berusaha menentukan nilainya dari gambar itu sendiri. Artinya, pada sebagian gambar warnanya bisa putih (bawaan yang lazim), pada gambar lain bisa hitam, dan untuk format GIF bisa berupa warna latar belakang apa pun yang disetel saat gambar itu disimpan. Intinya, bila warna "-background" tidak disetel, nilai bawaannya bergantung pada gambar, dan hasilnya bisa apa saja. Selalu setel "-background" sebelum memakai operator yang memakainya.
Nah, meski menambahkan baris dan kolom pada gambar itu bagus, operator "-splice" paling pas untuk menambahkan ruang hanya pada satu tepi gambar. Tepi mana yang dipakai ditentukan lewat opsi "-gravity" dan pengaturan geometry splice.

  magick rose: -background blue  -splice 0x10  splice_top.gif
  magick rose: -gravity south \
                 -background blue  -splice 0x10  splice_bottom.gif
  magick rose: -background blue  -splice 20x0  splice_left.gif
  magick rose: -gravity east \
                 -background blue  -splice 20x0  splice_right.gif
  magick rose: -gravity southeast \
                 -background blue  -splice 20x10  splice_botright.gif

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

Salah satu pemakaian splice yang paling umum adalah menambah ruang untuk menggambar label. (Lihat Memberi label pada gambar) |

  magick rose: -gravity South  -background LimeGreen  -splice 0x15 \
           -annotate 0x0 'Rose'    splice_label.gif

[IM Output]

Chop, menghapus baris, kolom, dan tepi

Kebalikan alami dari "-splice" adalah operator "-chop" yang jauh lebih tua. Diberi argumen yang sama dengan "-splice" dan pengaturan "-gravity" yang sama, "-chop" akan mengembalikan gambar ke bentuk aslinya.

  magick splice.gif       -chop  20x10+40+30   splice_chop.gif
  magick splice_chop.gif  -chop  20x10+30+20   chop.gif
  magick chop.gif -background grey \
                           -splice 20x10+30+20   chop_splice.gif

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

Saya melanjutkan pemrosesan contoh terakhir untuk memperlihatkan bagaimana urutan "-splice" dan "-chop" bisa dibalik sehingga sebuah baris atau kolom (atau keduanya) di tengah gambar 'dibersihkan' tanpa menggambar atau menimpakan apa pun. Chop lebih umum dipakai untuk memotong satu tepi dari gambar, dengan gravity sebagai penentu tepi itu. Sebagai contoh...

  magick frame_red.gif                 -chop  0x10  chop_top.gif
  magick frame_red.gif                 -chop 10x0   chop_left.gif
  magick frame_red.gif -gravity East   -chop 10x0   chop_right.gif
  magick frame_red.gif -gravity South  -chop  0x10  chop_bottom.gif

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

Sebagai alternatif dari "-chop" untuk membuang satu tepi, operator "-crop" yang lebih universal sebenarnya bisa dipakai. Cara ini tidak menuntut "-gravity" untuk mendapatkan tepi bawah atau kanan, tetapi menuntut "+repage" pada kanvas gambar sesudahnya.

  magick frame_red.gif  -crop +0+10 +repage  crop_edge_top.gif
  magick frame_red.gif  -crop +10+0 +repage  crop_edge_left.gif
  magick frame_red.gif  -crop -10+0 +repage  crop_edge_right.gif
  magick frame_red.gif  -crop +0-10 +repage  crop_edge_bottom.gif

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

Ini bertumpu pada kenyataan bahwa bila "-crop" tidak diberi area gambar untuk dibuang, ukurannya jatuh ke bawaan, yaitu ukuran kanvas gambar (bukan gambar sebenarnya, melainkan kanvas virtualnya). Artinya, pada gambar sederhana tepi gambar dapat dibuang cukup dengan menggeser area crop yang dipotong. Metode memakai "-crop" untuk 'meng-chop' tepi gambar ini ditemukan dan dipublikasikan Don Sheythe, dan setelah beberapa diskusi dianggap sebagai 'fitur' IM, sehingga dimuat di sini.


Teknik crop tingkat lanjut

Memangkas ke rasio aspek tertentu

Gambar dapat dipangkas agar cocok dengan rasio aspek tertentu, tetapi caranya berbelit dan memakai teknik matematika swakarya. Misalnya, sebuah skrip bisa ditulis untuk melakukan perhitungannya lalu menjalankan crop. Atau pada IM v6, perhitungan itu bisa dilakukan dengan viewport distort untuk mengambil bagian gambar yang diinginkan selama distorsi no-op, seperti diuraikan di Crop persegi terpusat. Namun pada ImageMagick versi 7, perhitungan matematis kini bisa dilakukan langsung di dalam perintah seperti "-crop" dan "-extent", sehingga tidak perlu lagi menyalahgunakan "-distort". Hal ini dibahas rinci di forum pengembang IM, Crop to Aspect Ratio.


Trim, operator 'auto-crop'

Operator "-trim" berkerabat sangat dekat dengan operator "-crop" serbaguna yang dibahas di atas. Namun alih-alih diberi argumen, operator ini berusaha membuang border atau tepi gambar mana pun yang warnanya atau transparansinya tidak berubah. Dengan kata lain, ia membuang bagian 'membosankan' di sekeliling gambar. Perhatikan bahwa pada ImageMagick versi 5 dan sebelumnya, operasi auto-crop dilakukan dengan memberi argumen '0x0' pada operator "-crop". Sekarang tidak lagi, karena argumen ukuran 'nol' pada crop kini berarti 'tak terhingga' atau 'sampai batas ukuran gambar'. Karena itu, argumen '0x0' pada crop kini praktis berarti memangkas gambar menjadi tile seukuran kanvas gambar aslinya. Dengan kata lain, pada IM v6 hasilnya sama dengan gambar aslinya, alias 'no-op'.
Sebagai contoh, di sini kita mengambil logo IM, mengubah ukurannya, lalu men-'trim' atau 'auto-crop' semua ruang berlebih di sekelilingnya.
    magick logo: -resize 30%    -trim     trim.gif

Ada dua hal yang perlu dicatat dari contoh di atas. Pertama, seperti "-crop", "-trim" mempertahankan ukuran kanvas gambar. Artinya, argumen numerik hasil trim itu dapat diambil untuk pemrosesan lanjutan atau untuk menyesuaikan pemrosesan gambar (lihat Trim gambar 'noisy' sebagai contohnya). [IM Output]
Di sini kita men-trim gambar, tetapi hanya untuk menampilkan bagian mana dari gambar yang ter-trim, bukan gambar hasil trim-nya.

  magick logo: -resize 30%   -trim  info:-

[IM Text]

Namun bila informasi itu tidak dipedulikan, buang saja dengan mengatur ulang informasi page gambar memakai operator "+repage", atau dengan menyimpan ke format yang tidak menyimpan informasi kanvas (seperti format JPEG). Di sini kita melakukan keduanya agar jelas bahwa informasi kanvasnya memang dibuang. |

  magick logo: -resize 30%    -trim +repage    trim_repage.jpg

[IM Output]
Hal kedua yang perlu dicatat, trim ternyata tidak memangkas persis sampai tepi gambar akhir. Ini paling kentara di sudut kanan bawah gambar logo, tempat terlihat celah jelas antara kaki beserta bayangannya dengan tepi hasil trim. Di sudut itu, warnanya secara numerik menjadi berbeda dari warna latar belakang gambar. Jadi meski mata kita tidak melihat perubahan apa pun, operator "-trim" melihat perubahan warna kecil, sehingga ia tidak memangkas sedekat yang kita harapkan. Bila seluruh gambar hanya satu warna, "-trim" akan memangkasnya sampai menjadi gambar missed minimal berupa satu piksel transparan. Ini masuk akal dan mencegah masalah yang lebih serius seandainya gambar itu dibiarkan apa adanya.

Trim dengan warna tertentu

Salah satu masalah "-trim" yang paling merisaukan, terutama dalam skrip pemrosesan gambar otomatis, adalah bahwa trim bisa agak sulit ditebak. Ia misalnya tidak membatasi diri pada satu warna tertentu, bahkan tidak pada satu warna saja. Karena itu Anda bisa dengan mudah memangkas jauh lebih banyak daripada yang diperkirakan. Sebagai contoh, mari kita trim sederhana sebuah gambar bergaris warna sederhana.

  magick -size 32x32 xc:red xc:green xc:blue +append stripes.gif
  magick stripes.gif  -trim +repage   stripes_trimmed.gif

Seperti terlihat, "-trim" memangkas bukan hanya satu warna melainkan dua warna! Di dalam skrip otomatis, ini bisa sangat buruk dan menghasilkan sesuatu yang tak terduga. Bila warna yang ingin dipangkas dari gambar sudah diketahui, cara yang lebih baik adalah menambahkan "-border" selebar satu piksel berwarna itu pada gambar. Dalam contoh ini kita ambil 'red'.

  magick stripes.gif -bordercolor red -border 1x1 \
          -trim +repage   stripes_trim_red.gif

Tentu saja memakai "-border" seperti ini juga mengubah offset kanvas yang susah payah dipertahankan "-trim". Karena itu, bila hasilnya dilihat tanpa membuang informasi kanvas virtualnya, tampak bahwa gambar itu bergeser. [IM Output] [IM Output] [IM Output] [IM Output]
  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           stripes_trim_red_shifted.gif

[IM Output]
Jadi mari coba mengoreksi ukuran kanvas virtual (kurangi _border_width_ x2 ) dan offsetnya (kurangi _border_width_) saat men-trim warna tertentu. |

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -set page '%[fx:page.width-2]x%[fx:page.height-2]+%[fx:page.x-1]+%[fx:page.y-1]' \
           stripes_trim_red_fix.gif

[IM Output]
Perhatikan bahwa saya memulihkan ukuran kanvas dan offset gambar asli, yang tadi diperbesar dan digeser oleh operator border. Operasi "-trim" sendiri sudah mempertahankan lokasi gambar dengan benar. Seperti terlihat, penyesuaian ini agak merepotkan. Sebagai alternatif, bila ukuran kanvas tidak dipedulikan (lazim pada gambar berlapis), repage relatif yang jauh lebih sederhana dapat dipakai untuk sekadar menyesuaikan posisi gambar pada kanvas yang membesar itu. |

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -repage -1-1\! stripes_trim_red_fix2.gif

[IM Output]

Trim hanya pada satu sisi gambar

Seperti terlihat di atas, "-trim" memangkas sebanyak mungkin sisi yang bisa dipangkasnya. Bahkan sampai membuang dua warna berbeda dari sisi yang berbeda (dan bila disusun sangat cermat, empat warna pun bisa terbuang). Ini membuat pekerjaan sedikit lebih sulit ketika pemangkasan ingin dibatasi hanya pada satu sisi. Untuk menjamin hanya satu sisi yang terpangkas, kita perlu menambahkan garis warna di sisi lain guna melindungi ketiga sisi lainnya. Berikut prosesnya langkah demi langkah untuk memangkas hanya sisi 'kiri' atau 'barat' gambar 'border' yang kita buat tadi. Saya memakai garis yang jauh lebih tebal daripada yang diperlukan agar lebih terlihat pada contoh ini. Biasanya lebar satu piksel sudah cukup.

  magick border.gif  -gravity East \
                      -background white -splice 5x0 \
                      -background black -splice 5x0  trim_protect.gif
  magick trim_protect.gif     -trim +repage         trim_oneside.gif
  magick trim_oneside.gif  -gravity East -chop 5x0  trim_west.gif

Perhatikan bahwa saya menambahkan garis dengan dua warna berbeda! Dengan begitu, kalau salah satu warnanya kebetulan sama dengan warna border yang sudah ada di sekeliling gambar, warna satunya tetap melindungi ketiga tepi itu. Selain itu hanya salah satu warna yang ikut terpangkas, sehingga tinggal satu garis warna yang perlu dibersihkan. Berikut seluruh proses trim satu sisi sebagai satu perintah, tetapi untuk memangkas tepi atas (garisnya ditambahkan pada tepi bawah atau 'South'). [IM Output] [IM Output] [IM Output] [IM Output]
|

  magick border.gif -gravity South \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_north.gif

[IM Output]
Dan berikut trim hanya pada tepi bawah. Tentu saja pengaturan "-gravity" yang dipakai pada contoh sebelumnya tidak diperlukan, sebab untuk gambar pengaturan itu jatuh ke bawaan 'North-West'. |

  magick border.gif \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_south.gif

[IM Output]
Tentu saja, seperti pada border tadi, menyisipkan warna tambahan ke gambar kembali mengubah ukuran kanvas virtual gambar dan offset gambar layer-nya. Ini pun bisa diperbaiki dengan metode yang sama seperti yang kita tunjukkan di bagian sebelumnya, tetapi caranya bergantung pada sisi mana warna tambahan itu ditaruh untuk melindungi tepi-tepi tersebut.

Trim dengan pemilihan warna fuzzy -- gambar JPEG berkualitas rendah

Karena JPEG bersifat 'lossy', warna di dalam gambar umumnya bukan satu warna tunggal melainkan pita warna yang sedikit bervariasi. Karena itu "-trim" sering gagal pada JPEG atau gambar dunia nyata. FUTURE: Example of failure here Jadi ImageMagick perlu diberi tahu bahwa warna yang tidak persis sama tetapi cukup berdekatan harus diperlakukan sebagai warna yang sama. Menambahkan pengaturan "-fuzz" yang sangat kecil sudah cukup untuk itu.

  magick image.jpg  -fuzz 1% -trim +repage  image_fuzzy_trim.jpg

Ada baiknya pula menentukan warna tertentu sebagai acuan fuzz itu. Ini bisa dilakukan dengan sengaja menambahkan border berwarna tersebut memakai operator "-border". Border itu tentu selalu cocok dengan warna yang hendak dipangkas, sehingga selalu terbuang oleh "-trim". FUTURE: Example of fuzzy border trim here

Trim gambar 'noisy' -- gambar hasil pindai

Masalah serupa dijumpai pada gambar hasil pindai, ketika pemindai sering menghasilkan error satu piksel yang kecil akibat debu, kotoran, variasi kecil pada pemindai, atau sekadar noise elektronik yang tertangkap pembacanya. Namun error piksel dalam kasus ini biasanya terlalu besar untuk diatasi faktor fuzz yang kecil, sehingga diperlukan teknik lain untuk memangkas gambar semacam itu. Solusi paling sederhana, meski sering paling tidak praktis, adalah memindai gambar yang sama beberapa kali (atau mengambil beberapa frame dari rangkaian video diam), lalu merata-ratakan hasilnya untuk menekan gangguan. Namun cara ini tidak membuang bintik debu pada pemindai dan tidak menolong bila hanya ada satu gambar atau satu frame, sehingga tidak praktis dalam kebanyakan kasus. Solusi yang praktis terdiri atas dua langkah. Dengan salinan gambar itu, proseslah sedemikian rupa sehingga error satu piksel atau debu pemindai jadi kurang menonjol, sementara efek blok besar berwarna sangat kontras justru menguat. Lalu dengan menjalankan "-trim" pada salinan itu dan memeriksa persis apa yang dilakukannya, gambar asli yang belum diubah dapat di-"-crop" sebanyak itu pula. Ada beberapa metode untuk membuat error satu piksel kurang menonjol, antara lain "-blur", "-median", atau bahkan operator morfologi dasar untuk membuang detail tertentu seperti teks dan garis tipis. Metode 'blur' ini memberi dua kendali utama:

  • Radius sigma "-blur", atau radius konvolusi "-median", yang menentukan seberapa besar bintik debu yang ingin diabaikan. Perhatikan bahwa kedua nilai itu boleh berupa bilangan pecahan sehingga tingkat blur yang diterapkan dapat dikendalikan dengan halus. Keterangan lebih lanjut tentang blur ada di Blur pada gambar.
  • Kendali kedua adalah faktor warna "-fuzz" yang mengatur seberapa besar perubahan warna yang masih dicocokkan operator "-trim". Artinya, seberapa dekat hasil trim itu ke gambar yang diinginkan.

Sebagai contoh, mari pakai gambar "logo:" yang lebih kecil. |

  magick logo:   -resize 30%   noisy.jpg

Pada gambar kecil ini, bintang dan judul di dalamnya bisa kita anggap sebagai noise yang ingin diabaikan trim. Bintang di atas berukuran sekitar 5 piksel, jadi kita pakai nilai kira-kira dua kali lipatnya agar trim praktis mengabaikannya. [IM Output]
Berikut hasilnya. Perhatikan bahwa dalam hal ini yang kita inginkan bukan gambar, melainkan hanya informasi kanvas dari gambar itu.

  magick noisy.jpg  -virtual-pixel edge -blur 0x15 -fuzz 15% -trim  info:

[IM Text]

| _Anda mungkin perlu memeriksa pengaturanpiksel virtual untuk memastikan 'efek tepi' yang benar pada blur.

Sebagai alternatif, tambahkan border lebar berwarna latar belakang yang sama pada gambar sebelum di-blur, lalu sesuaikan hasil offsetnya seperlunya. Cara ini mungkin lebih baik untuk hasil yang lebih akurat, baik dari operator "-blur" maupun "-trim"._
Dari hasil di atas kita dapat menyimpulkan bahwa "-trim" secara internal memakai argumen "-crop" '89x121+78+23'. Inilah ukuran sebenarnya gambar hasil trim beserta offsetnya pada kanvas virtual, dan agaknya lokasi objek utama (tunggal) yang kita cari di dalam gambar. Nilai itu lalu dapat dipakai pada gambar asli yang belum di-blur. |

  magick noisy.jpg   -crop 89x121+78+23 +repage   noisy_trimmed.jpg

Dan di sini gambar kita sudah terpangkas hingga tinggal sang penyihir! [IM Output]
Ini bisa dilakukan dalam satu baris, dengan sedikit tambahan 'skrip shell UNIX' dan pemformatan hasil dari perintah pertama tadi. |

  magick noisy.jpg -crop \
    `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% \
             -trim -format '%wx%h%O' info:`   +repage   noisy_trimmed_2.jpg

Lihat Escape properti gambar untuk keterangan lebih lanjut tentang pengaturan "-format" yang dipakai mengendalikan keluaran "info:". [IM Output]
| _Contoh di atas memakai fitur shell baris perintah UNIX untuk metode 'command-substitution' dengan tanda kutip terbalik '...' guna menyisipkan argumen "-crop" yang dihasilkan ke dalam perintah "magick" di lapisan luar.

Hal yang sama bisa dilakukan dalam skrip batch Windows memakai konstruksi FOR..DO khusus. Ikuti tautan di atas untuk rinciannya._
Perhatikan bahwa meskipun tangan sang penyihir terlihat utuh, ujung topinya tidak. Inilah kelemahan metode ini: ia mengabaikan ujung yang tajam dan detail halus. Tetapi memang itulah yang sejak awal kita minta untuk diabaikan. Metode ini bisa diperbaiki dengan memperluas sedikit area yang dipangkas (10 piksel ke 4 arah), memakai escape FX untuk perhitungannya... |

  magick noisy.jpg -crop \
      `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
               -format '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]' \
      info:` +repage   noisy_trimmed_3.jpg

[IM Output]
Bila batas yang dihitung melebihi gambar aslinya, operator crop otomatis membatasinya sampai batas gambar. Pada IMv7 (memakai perintah "magick"), semuanya bisa dilakukan dalam satu perintah, dengan menyimpan ukuran trim yang dihitung ke dalam sebuah pengaturan untuk dipakai kemudian. |

  magick noisy.jpg \
         \( +clone -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
            -set option:fuzzy_trim \
                     '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]'\
            +delete \) \
         -crop %[fuzzy_trim] noisy_trimmed_4.jpg

[IM Output]
Metode trim fuzzy lainnya adalah memakai berbagai metode morfologi untuk membuang bagian gambar yang tidak diinginkan, sebelum men-trim guna mencari batas area yang dicari pada gambar aslinya. Seorang pengguna, HugoRune, perlu memangkas sebuah gambar hingga tinggal region yang kontrasnya sangat berbeda untuk keperluan pemindaian. Lihat diskusi di forum IM untuk rinciannya.