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

Contoh penggunaan ImageMagick -- anotasi gambar

Kata pengantar dan indeks contoh penggunaan ImageMagick
Melabeli gambar (teknik memberi label pada gambar)

Dokumen ini menyajikan berbagai cara menganotasi gambar besar dengan teks atau gambar lain. Anotasinya bisa tebal dan sangat terlihat, atau halus dan tersembunyi. Alasan menganotasi gambar bermacam-macam, tetapi biasanya untuk

  • Menandai gambar dengan informasi tentang isi gambar itu.
  • Menunjukkan atau menonjolkan suatu aspek gambar.
  • Menambahkan hak cipta atau logo ke gambar sebagai bentuk perlindungan salinan.

ImageMagick menyediakan banyak cara melakukan hal-hal itu, tetapi tidak semuanya mudah ditemukan sendiri dari manual. Halaman ini mencoba menyajikan metode-metode yang umum dipakai. Banyak dari metode spesifiknya dibahas lebih lengkap di halaman contoh lain. Jika Anda tertarik menganotasi atau memberi watermark pada animasi GIF, saya sarankan menelusuri dokumen ini dulu, lalu melompat ke Menganotasi animasi GIF sebagai titik awal.


Menganotasi gambar

Masalah dasar melabeli gambar adalah membuat teksnya tetap terbaca apa pun gambarnya. Berikut diperlihatkan banyak metode, sebagian di antaranya dapat dikembangkan untuk tugas yang lebih kompleks. Dalam contoh-contoh ini saya membatasi diri pada font bawaan ImageMagick. Anda dianjurkan memakai font dan pointsize lain yang sesuai dengan apa yang ingin dicapai.

Label di bawah (atau di atas) gambar

Menyambungkan label dengan penengahan kini dimungkinkan, sejak IM v6.4.7-1, karena penyambungan gambar sekarang mengikuti pengaturan (setting) gravity untuk keperluan perataan. |

  magick dragon.gif   -background Khaki  label:'Faerie Dragon' \
          -gravity Center -append    anno_label.jpg

[IM Output]
Dengan mengubah urutan gambarnya, label dapat disambungkan di atas gambar. |

  magick dragon.gif   -background Orange  label:'Faerie Dragon' \
          +swap  -gravity Center -append    anno_label2.jpg

[IM Output]
Splice dan draw adalah cara yang sangat sederhana untuk menambah ruang ekstra pada gambar agar kita bisa menggambar/menganotasi label ke dalam gambar. |

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif

[IM Output]
Metode yang sama dapat dipakai untuk menggambar label di atas gambar; cukup ganti pengaturan gravity 'South' dengan 'North'. Mudah! |

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif

[IM Output]
Operator "-draw" tidak lagi disarankan untuk menggambar langsung ke gambar, kecuali sebagai bagian fungsi penggambaran yang lebih kompleks. Lihat bagian Penanganan teks ke gambar untuk detail metode dan teknik penggambaran teks lainnya. Label memakai montage Perintah montage di ImageMagick sering dipandang sebelah mata oleh pengguna, seolah hanya berguna membuat tampilan seluruh direktori gambar. Padahal ia menyediakan cara yang sangat sederhana untuk menambahkan label pada gambar. |

  montage -label "Faerie Dragon"  dragon.gif \
          -geometry +0+0 -background Gold anno_montage.jpg

[IM Output]
Montage juga dapat menambahkan frame dan hal lain ke gambar untuk Anda, sehingga bentuk pelabelan ini punya banyak kemungkinan ekstra di luar sekadar melabeli gambar. |

  montage -label "Faerie Dragon" dragon.gif \
          -font Candice -pointsize 15 \
          -frame 5  -geometry +0+0 anno_montage2.jpg

Untuk info lebih lanjut tentang penggunaan montage, lihat Montage, larik gambar. [IM Output]
Label memakai polaroid Alternatif dari montage adalah memakai transformasi gambar polaroid untuk menghasilkan gambar berkomentar yang cukup mewah. |

  magick -caption "Faerie Dragon" dragon.gif -gravity center \
           -background black +polaroid anno_polaroid.png

Peringatan: gambar ini terdistorsi (melengkung dan berputar) dengan sedikit pengacakan, sehingga ukuran gambar akhirnya bisa berbeda-beda, kecuali rotasinya dimatikan. Ia juga mengandung efek bayangan dan transparansi yang kompleks, sehingga gambar format PNG dipakai untuk menyimpan hasilnya. [IM Output]
'Keburaman' pada gambar hasil akibat rotasi dapat dikurangi dengan teknik 'super sampling'. Lihat transformasi gambar polaroid untuk contohnya.

Label di atas gambar itu sendiri...

Masalah menulis teks langsung di atas foto adalah Anda tidak bisa memastikan teksnya akan terbaca dengan warna yang dipilih. Gambar yang digambari bisa saja hitam, putih, atau berwarna-warni bak pelangi. Label bergaris luar : Metode paling sederhana adalah menggambar string dengan garis luar untuk memisahkan teks dari gambar. Namun karena pengaturan font "-stroke" menambah ketebalan font ke dalam sekaligus ke luar, efektivitasnya berkurang (lihat Stroke dan strokewidth untuk informasi lebih lanjut. Cara yang lebih baik untuk menggambar font dengan garis luar latar adalah menggambar teksnya dua kali. |

  magick dragon.gif -gravity south \
          -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
          anno_outline.jpg

[IM Output]
Seperti yang Anda lihat, cara ini berhasil, tetapi tidak terlalu baik. Ia bekerja lebih baik dengan font yang lebih tebal daripada font bawaan 'Times' atau 'Arial'. Untuk detail teknik ini, lihat Font gabungan stroke tebal. Menggambar kotak redup : Metode yang lebih klasik untuk membuat teks anotasi lebih terlihat adalah 'meredupkan" gambar di area tempat teks akan ditambahkan, lalu menggambar teksnya dengan warna kebalikannya. Misalnya... |

  magick dragon.gif \
          -fill '#0008' -draw 'rectangle 5,128,114,145' \
          -fill white   -annotate +10+141 'Faerie Dragon' \
          anno_dim_draw.jpg

[IM Output]
Metode ini bekerja baik, tetapi seperti terlihat, saya memutuskan tidak memakai "-gravity" untuk menempatkan teks pada contoh ini, karena persegi panjang yang digelapkan tidak bisa diposisikan dengan gravity (ini mungkin berubah di masa depan). Ukuran dan posisinya juga bisa bergantung pada gambar dan ukuran teks akhir, yang mungkin memerlukan sedikit hitungan matematika ekstra. Kotak undercolor : Alih-alih mencoba menggambar kotak latar sendiri, Anda bisa meminta ImageMagick memakai 'undercolor' pada kotak itu. Lihat Kotak undercolor teks. 'Undercolor' teks (sebagaimana dipakai di API pustaka) dapat ditentukan di baris perintah dengan opsi "-undercolor". |

  magick dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
          -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg

[IM Output]
Seperti yang terlihat, ini jauh lebih sederhana daripada menggambar kotak redup sendiri, meski spasi ekstra di awal dan akhir teks yang digambar disarankan, untuk sedikit melonggarkan kotaknya. Label terkomposisi : Solusi yang lebih ideal adalah menyiapkan gambar teks terlebih dahulu, lalu menumpangkannya sebagai gambar. Di sini kita membuat label sederhana di latar semitransparan, lalu menumpangkannya. |

  magick -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
    magick composite -gravity south -geometry +0+3 \
              -   dragon.gif   anno_composite.jpg

[IM Output]
Teknik terakhir ini punya beberapa keunggulan yang jelas. Kotak redupnya dapat diukur pas dengan labelnya, dan dapat diposisikan secara tepat dengan "-gravity", tanpa perlu pengetahuan khusus tentang gambar yang ditambahi, maupun tentang font yang dipakai untuk menggambar.
Anda juga tidak terbatas pada kotak redup yang sederhana. Gambar font yang sangat kompleks pun dapat disiapkan, entah di muka agar bisa diterapkan berkali-kali, atau seketika untuk tiap gambar. Hampir semua gaya efek font gabungan juga tersedia, sehingga tambahan teks bisa tampak sangat menarik dan profesional. Caption berukuran otomatis : Dengan rilis IM v6.3.2, "caption:" kini dapat menyesuaikan ukuran teks secara otomatis agar paling pas dengan kotak berukuran tertentu. Tetapi untuk memakainya dengan benar sebagai overlay, lebar gambar yang dianotasi benar-benar perlu diketahui. Di sini saya mengumpulkan info itu, lalu membuat dan menumpangkan caption sehingga teksnya otomatis diukur agar paling pas dengan ruang yang tersedia, dengan pelipatan kata. |

  width=`identify -format %w dragon.gif`; \
  magick -background '#0008' -fill white -gravity center -size ${width}x30 \
          caption:"Faerie Dragons love hot apple pies\!" \
          dragon.gif +swap -gravity south -composite  anno_caption.jpg

[IM Output]
Teknik ini ideal untuk menumpangkan komentar gambar ke sebuah gambar, meski melakukannya di baris perintah punya masalah tersendiri karena Anda membuat gambar baru, bukan menganotasi gambar lama. Lihat Escape opsi buatan pengguna untuk solusi masalah ini. Label mewah : Sebagai contoh terakhir, saya akan menumpangkan string teks yang dibuat memakai font bergaris luar lembut yang mewah untuk memastikan teksnya tetap terlihat, tetapi tanpa membuat kotak persegi untuk anotasinya. |

  magick -size 100x14 xc:none -gravity center \
          -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -background none -shadow 100x3+0+0 +repage \
          -stroke none -fill white     -annotate 0 'Faerie Dragon' \
          dragon.gif  +swap -gravity south -geometry +0-3 \
          -composite  anno_fancy.jpg

[IM Output]
Jika Anda berencana mengomposisikan label yang sama (misalnya pesan hak cipta) ke banyak gambar, mungkin lebih baik membuat labelnya terpisah lalu mengomposisikan label itu ke tiap gambar memakai perintah "mogrify". Offset "-geometry +0-3" di atas dipakai untuk memosisikan overlay komposit lebih dekat ke tepi, karena garis luar lembut nan kabur pada gambar ini sering lebih besar dari yang diperlukan.
Semua contoh di atas tentu harus disesuaikan dengan kebutuhan Anda sendiri. Jangan jadi domba yang mengikuti apa yang dilakukan semua orang. Bereksperimenlah, dan beri situs web atau program Anda cita rasa yang berbeda dari yang lain. Dan yang lebih penting, ceritakan ke komunitas IM.

FUTURE: select the black or white color based on the images relative
intensity.  This uses a number if very advanced techniques.

  magick input.jpg  -font myfont -pointsize 25 \
      \( +clone -resize 1x1  -fx 1-intensity -threshold 50% \
         -scale 32x32 -write mpr:color +delete \)  -tile mpr:color \
       -annotate +10+26 'My Text'              output.jpg

Penjelasan:  Salinan gambar diperkecil menjadi 1 piksel untuk mencari warna
rata-rata gambar tersebut.  Warna itu lalu dibalik dan dijadikan grayscale
dengan -fx, kemudian diberi ambang batas menjadi hitam atau putih (sesuai keperluan).
Piksel warna tunggal ini sekarang diskalakan menjadi gambar tile yang lebih besar,
lalu disimpan ke sebuah register memori bernama (mpr:).

Gambar itu kemudian dipakai untuk menetapkan tile isian bagi teks anotasi.
Namun tidak ada cara sederhana (untuk saat ini) untuk menetapkan warna -stroke
(garis luar) teks yang digambar menjadi kebalikan warnanya.

Teknik lain adalah memakai suatu teks sebagai mask 'negate image', atau bahkan
operasi compose color burn atau color dodge, untuk mendistorsi gambar dengan teks itu.

Menumpangkan gambar Perintah "magick composite" dan operator gambar "-composite" di ImageMagick menyediakan sarana utama untuk menempatkan gambar di atas gambar lain dengan berbagai cara. Detail metode-metode ini diberikan di halaman contoh Komposisi alpha. Namun ada operator tingkat lebih tinggi yang juga memanfaatkan komposisi alpha gambar. Ini mencakup pelapisan gambar, serta pemosisian gambar dengan gravity, lebih bawah di halaman contoh ini. Metode compose bawaan adalah "Over", yang sekadar menumpangkan gambar overlay ke gambar latar belakang, dengan menangani transparansi persis seperti yang Anda harapkan. Gambar latar belakang juga menentukan ukuran akhir hasil, di mana pun overlay ditempatkan (memakai opsi "-geometry"). Tak masalah overlay-nya ada di tengah, separuh keluar dari gambar latar belakang, atau jauh sekali; gambar keluarannya berukuran sama dengan gambar latar belakang. Posisi geometry gambar juga dipengaruhi "-gravity", sehingga pemosisian gambar yang ditumpangkan dapat didefinisikan relatif terhadap salah satu dari sembilan (9) lokasi berbeda. Lihat "Memosisikan gambar dan teks" di bawah. Selain "-geometry" milik overlay compose, tiap gambar juga bisa memiliki informasi halaman atau kanvas (diatur lewat opsi "-page" dan "-repage") yang dapat memengaruhi posisi akhir gambar. Namun informasi khusus gambar ini tidak dipengaruhi "-gravity". Lanjut ke contohnya...Menumpangkan barangkali bentuk anotasi gambar yang paling umum, dan sangat mudah dilakukan. Di sini saya menumpangkan ikon kastel 32x32 di tengah frame tombol yang sudah disiapkan.

  magick composite -gravity center  castle.gif  frame.gif  castle_button.gif

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

Anda juga dapat memosisikan sub-gambar secara persis. Di sini kita memasang gambar tangan untuk menunjuk cakar kecil sang naga peri.

  magick composite -geometry +31+105  hand_point.gif dragon.gif \
            dragon_claw_pointed.jpg

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

Persisnya bagaimana gambar digambar di atas latar belakang dikendalikan oleh pengaturan "-compose". Bawaannya, seperti dipakai di atas, adalah "-compose over" yang sekadar menumpangkan gambar ke latar belakang. Sebagian besar metode compose lain yang disediakan tidak terlalu berguna kecuali pada situasi yang sangat spesifik, tetapi berikut beberapa di antaranya. Untuk detail pengaturan ini dan efeknya, lihat Komposisi alpha. Bumpmap adalah metode compose yang agak rumit; pada dasarnya ia menggelapkan gambar latar belakang sesuai kecerlangan gambar overlay. Apa pun yang putih di overlay diperlakukan seolah transparan, sementara yang hitam menjadi hitam pada gambar keluaran. Ini agak mirip memakai overlay sebagai stempel tinta, dan itu cara yang bagus untuk membayangkan operasi ini. Sebagai petunjuk, penumpangan dengan bumpmap paling cocok untuk gambar berwarna terang. Jadi gambar bumpmap-nya mungkin perlu disiapkan sebelum dipakai. Di sini kita mengubah ukuran gambar naga sebelum memakai "-compose bumpmap" untuk menggambarnya di atas gambar gulungan kertas.

  magick composite \( dragon.gif -resize 50% \) scroll.gif \
            -compose bumpmap -gravity center   dragon_scroll.gif

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

Bumpmap juga dapat dipakai untuk memberi efek menyeluruh pada gambar; dalam kasus ini kita men-tile pola latar berwarna terang di atas naga kita. Ingat bahwa gambar bumpmap diperlakukan sebagai gambar grayscale, sehingga warna apa pun di gambar overlay kita hilang.

  magick composite -compose bumpmap  -tile rings.jpg \
            dragon.gif  dragon_rings.jpg

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

| Opsi "-tile" di atas hanya bekerja untuk operasi compose yang memakai perintah "magick composite". Di "magick" Anda harus memakai generator gambar "tile:" dengan "-size" untuk menentukan luasnya. Tentu boleh saja membuat overlay gambar sumber lebih besar daripada gambar latar belakang yang ditumpangi, karena hasilnya akan berukuran sebesar gambar latar belakang atau gambar tujuan.
Metode compose multiply paling dikenal karena kemampuannya menggabungkan dua gambar berlatar putih (misalnya ke halaman teks). Berbeda dengan metode compose 'bumpmap', ia tidak lebih dulu mengubah gambar yang ditumpangkan menjadi grayscale.

  mesgs PictureWords |\
      magick -pointsize 18 text:-  -trim +repage \
              -bordercolor white -border 10x5   text.gif
  magick composite -compose multiply -geometry +400+3 \
            paint_brush.gif  text.gif  text_multiply.gif

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

CATATAN SAMPING: Perintah kompleks untuk membuat "text.gif" di atas hanyalah untuk membuat gambar khas yang berisi teks saja; perintah "mesgs" sekadar mengeluarkan kutipan tertentu, seperti "fortune" tetapi dengan kendali lebih. Metode ini bekerja sangat baik di banyak situasi, tetapi umumnya hanya jika salah satu dari kedua gambar itu pada dasarnya hitam (atau grayscale) di latar yang kebanyakan putih. Jika kedua gambar mengandung area berwarna, hasilnya bisa tak lazim. Dengan kata lain, teknik ini sempurna untuk menumpangkan gambar garis, diagram, atau gambar teks pada gambar putih (atau cukup terang), seperti gambar halaman cetak atau pindaian.


Pemberian watermark

Pemberian watermark adalah pekerjaan penting, karena menyediakan cara menandai bahwa sebuah gambar milik suatu perusahaan atau situs web. Sayangnya ini berarti merusak gambar dengan satu atau lain cara, dengan mengorbankan gambar itu sendiri. Tujuan dasar pemberian watermark adalah

  • Tandanya harus terlihat jelas tak peduli gambarnya berwarna terang atau gelap.
  • Ia harus sulit dihapus.
  • dan ia tidak boleh terlalu mengganggu orang yang melihatnya.

Semua faktor ini saling bertentangan, dan itulah salah satu alasan pemberian watermark begitu sulit dilakukan dengan baik.

Watermark dengan simbol

Salah satu bentuk watermark yang paling sederhana, sekaligus paling menjengkelkan, adalah sekadar menempatkan gambar yang sangat kecil tetapi khas di suatu tempat pada gambar yang di-watermark. Di sini kita membuat gambar (memakai "logo:") yang ingin kita watermark, memakai simbol 'mata' kecil.

  magick logo: -resize x180  -gravity center  -crop 180x180+0+0  logo.jpg
  magick composite -geometry +160+13 eyes.gif   logo.jpg  wmark_symbol.jpg

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

Gagasan terbaik untuk penempatan gambar kecil itu adalah menambahkannya sedemikian rupa sehingga tampak benar-benar bagian dari gambar asli. Di atas, saya menambahkan gambar "mata" sehingga tampak hampir seperti bagian topi si penyihir (jangan pula sampai ia terlalu menyatu ke dalam gambar). Akibatnya, teknik ini butuh sentuhan manusia, sehingga mustahil diotomatiskan sepenuhnya. Gambar kecil itu juga bisa sangat sulit dihilangkan, karena ia menghancurkan sepenuhnya bagian gambar yang ditumpanginya. Dan jika dilakukan dengan baik, ia nyaris tak kentara, kecuali Anda memang mencarinya. Saya pernah melihatnya dipakai dengan efektif di banyak tempat di web. Satu situs web memakai simbol kecil mirip belati. Gambar yang dicuri dari situs itu menjadi sangat kentara ketika saya melihat simbol belati yang sama pada gambar yang saya temukan di situs web lain. Watermark dengan teks Sekadar menggambar teks pada gambar juga cara watermark yang sederhana, dan contoh label di atas gambar mana pun di atas dapat dipakai sebagai semacam watermark. Namun agar benar, sebaiknya pakai dua warna berbeda supaya teksnya tidak menghilang saat digambar di latar dengan warna berbeda-beda. Untuk itu, semacam efek font gabungan sebaiknya dipakai. |

  magick logo.jpg  -font Arial -pointsize 20 \
          -draw "gravity south \
                 fill black  text 0,12 'Copyright' \
                 fill white  text 1,11 'Copyright' " \
          wmark_text_drawn.jpg

Ini bekerja baik dan bisa diotomatiskan, tetapi terlalu mencolok untuk menjadi watermark yang baik karena terlalu menonjol dari gambarnya. [IM Output]
Tetapi dengan sedikit persiapan, dapat dibuat gambar berlatar transparan yang tidak terlalu mencolok. Untuk detail langkah-langkah pembuatan teks watermark-nya, lihat Masking font. Contoh mask di Masking gambar juga mungkin berguna bagi pemahaman Anda.

  magick -size 300x50 xc:grey30 -font Arial -pointsize 20 -gravity center \
          -draw "fill grey70  text 0,0  'Copyright'" \
          stamp_fgnd.png
  magick -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
          -draw "fill white  text  1,1  'Copyright'  \
                             text  0,0  'Copyright'  \
                 fill black  text -1,-1 'Copyright'" \
          -alpha off stamp_mask.png
  magick composite -compose CopyOpacity  stamp_mask.png  stamp_fgnd.png  stamp.png
  magick mogrify -trim +repage stamp.png

[IM Output]

Kini kita punya font watermark yang dapat kita terapkan ke gambar kita... |

  magick composite -gravity south -geometry +0+10 stamp.png  logo.jpg \
            wmark_text_stamped.jpg

Seperti yang Anda lihat, watermark-nya tidak semencolok sebelumnya, bahkan memakai corak abu-abu alih-alih putih dan hitam murni. Meski begitu ia tetap sangat terlihat apa pun latar belakangnya. Halaman efek font gabungan merinci banyak gaya font yang dapat dipakai dengan cara ini tanpa menenggelamkan gambar yang di-watermark. [IM Output]
Teks juga dapat di-tile ke seluruh gambar. Di sini kita juga menghindari kebutuhan akan gambar perantara dengan memakai 'pipeline' perintah, dengan keluaran satu perintah menjadi masukan perintah berikutnya. |

  magick -size 140x80 xc:none -fill grey \
          -gravity NorthWest -draw "text 10,10 'Copyright'" \
          -gravity SouthEast -draw "text 5,15 'Copyright'" \
          miff:- |\
    magick composite -tile - logo.jpg  wmark_text_tiled.jpg

Ini memanfaatkan kenyataan bahwa sebuah gambar (seperti foto, bukan diagram) umumnya punya beberapa area tempat string teks yang di-tile akan terlihat. Anda mungkin ingin membuat teksnya semitransparan untuk watermark milik sendiri (memakai, misalnya, abu-abu setengah transparan seperti "'#80808080'"). Teknik tiling ini juga layak diingat pada teknik watermark yang sesungguhnya berikut ini. [IM Output]

Watermark dengan gambar

ImageMagick juga menyediakan sejumlah opsi yang berguna khususnya untuk watermark yang lebih halus, pada area yang lebih luas. Inilah yang biasanya lebih umum dimaksud saat Anda mem-watermark sebuah gambar. Di sebelah kanan adalah gambar "naga air" yang akan saya pakai untuk demonstrasi ini. Ia punya sedikit transparansi, yang saya pakai untuk memeriksa bahwa IM berlaku benar terhadap transparansi, menghindari tampilan 'kotak' yang buruk pada hasilnya. [IM Output]
Sebelum IM versi 6, opsi "-watermark" dan "-dissolve" cacat dalam penanganan kanal alpha (transparansi) gambar yang ditumpangkan, sehingga menghasilkan efek yang sangat aneh.
--- ---
Watermark — kompositing ini memang dimaksudkan untuk mem-watermark gambar, dan meski bekerja, ia cenderung hanya cocok untuk gambar overlay putih dan hitam murni, dan menghasilkan artefak tepi yang jelek.
  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg

Untuk informasi lebih rinci tentang opsi ini, lihat halaman Penggunaan opsi watermark. [IM Output]
Dissolve menurut temuan saya dan yang lain bekerja lebih baik. |

  magick composite -dissolve 25% -gravity south \
            wmark_image.png   logo.jpg  wmark_dissolve.jpg

Ini bekerja sangat baik, tetapi bagian-bagian watermark akan menghilang pada gambar dengan piksel putih dan hitam murni. Artinya, dissolve putih di atas putih dan hitam di atas hitam tidak akan terlihat di gambar akhir. Karena kedua warna ini sangat umum, lebih baik lakukan pra-pemrosesan ekstra pada watermark agar memakai beragam corak abu-abu alih-alih putih dan hitam murni. (Lihat "dissolve keabuan" di bawah) [IM Output]
Untuk informasi lebih rinci tentang opsi ini, lihat halaman Penggunaan opsi dissolve. Di-tile: Watermark juga dapat di-tile ke seluruh gambar latar belakang alih-alih hanya ditambahkan di satu lokasi. Cukup ganti posisi gravity-nya dengan "-tile". Tentu dalam hal itu Anda mungkin ingin membuat watermark-nya makin tidak mengusik. |

  magick composite -dissolve 15 -tile \
            wmark_image.png   logo.jpg  wmark_tiled.jpg

[IM Output]
Bumpmap keabuan: Agar bumpmap dipakai dengan benar sebagai watermark, gambarnya perlu sedikit persiapan untuk menjadikan putih maupun hitam sebagai rentang abu-abu yang lebih terang, memakai teknik penyesuaian grayscale. Jika tidak, hasilnya akan sangat-sangat mencolok. |

  magick wmark_image.png  -fill Gray91 -colorize 80  miff:- |\
  magick composite -compose bumpmap -gravity south \
            -  logo.jpg    wmark_bumpmap.jpg

[IM Output]
Masalah terbesar bumpmap sebagai watermark adalah operasinya hanya menggelapkan gambar. Karena itu teknik ini nyaris tak berguna untuk gambar yang sangat gelap. Dissolve keabuan: Teknik pra-pemrosesan yang sama juga berguna pada metode dissolve, supaya bagian putih gambar watermark sedikit menggelap di latar putih, dan demikian pula bagian hitam watermark menjadi lebih terang di bagian hitam gambar. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 30 -gravity south -  logo.jpg wmark_dissolve_grey.jpg

[IM Output]
Menurut saya ini nyaris ideal sebagai watermark, memenuhi semua persyaratan. Namun saya akan menyetel lagi dissolve akhirnya agar watermark-nya makin tak kentara. Dissolve keabuan yang di-tile: Ini persis seperti di atas tetapi di-tile ke seluruh gambar dengan nilai dissolve yang lebih rendah lagi. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 15 -tile  -  logo.jpg wmark_dissolve_tile.jpg

[IM Output]
| Perintah "magick composite" tidak tahu cara menangani file multi-gambar seperti animasi. Namun metode lain memungkinkannya. Lihat Memodifikasi animasi, menganotasi untuk contoh menganotasi dan menumpangkan file multi-gambar.


Memosisikan gambar dan teks dengan gravity

Soal 'gravity' dalam situasi ini

Seperti terlihat di atas, kemampuan memosisikan gambar dan teks di dalam gambar yang lebih besar bisa sama pentingnya dengan hal lain. Wajar bila pengaturan "-gravity" menjadi salah satu aspek terpenting di sini.

Di milis ImageMagick, Tim Hunter menyatakan
“ Gravity akan membuat Anda gila sampai Anda menguasainya. ”

Ini pendapat yang saya setujui dengan sepenuh hati. Gravity hanya akan diterapkan dalam situasi-situasi berikut...

  • Operasi apa pun yang melibatkan pengaturan mirip 'geometry', seperti "-crop" dan pemosisian gambar "-geometry" untuk komposisi alpha, termasuk komposisi berlapis multi-gambar.
  • Ia juga dipakai sebagai cara menentukan perataan teks oleh berbagai generator teks-ke-gambar seperti "label:" dan perataan teks oleh berbagai generator teks-ke-gambar seperti "caption:".
  • Operator penggambar teks "-annotate" juga memakainya untuk pemosisian teks sekaligus perataan.
  • Dan terakhir ia dipakai oleh metode "-draw" untuk metode 'text' dan "image'-nya, dan HANYA metode-metode itu.

Namun "-gravity" TIDAK dipakai untuk

  • Operator daftar gambar atau layer apa pun, seperti "-mosaic", "-flatten", dan kebanyakan metode "-layers", dan terutama tidak pada animasi GIF. Semua operasi ini memakai offset gambar pada kanvas virtual yang lebih besar (diatur lewat pengaturan metadata "-page", "-repage") untuk memosisikan gambar. Offset semacam itu selalu relatif terhadap sudut kiri atas kanvas virtual gambar. Tak ada pemahaman "-gravity" yang dipakai dalam metodologi ini.
  • Metode "-draw" lainnya tidak memakai "-gravity" untuk pemosisian. Kemungkinan besar juga tidak akan, karena "-gravity" tidak didefinisikan dalam draf SVG yang diikuti IM untuk fungsi-fungsi tingkat rendah ini.

Apa arti semua ini? Pertama dan terpenting, ia mendefinisikan titik asal yang dipakai "-geometry" untuk memosisikan teks dan gambar overlay relatif terhadap tepi, sisi, dan pusat gambar, tanpa pengguna perlu tahu ukuran gambar yang sebenarnya. Inilah fungsi utamanya. Kedua, ia mendefinisikan perataan horizontal dan vertikal objek yang ditumpangkan (teks atau gambar) relatif terhadap titik gravity yang ditentukan itu. Misalnya, dengan gravity 'East' teks atau gambar akan ditempatkan di sebelah kanan (perataan kanan) titik yang ditentukan. Secara teknis perataan seharusnya menjadi pengaturan terpisah dari "-gravity", meski berkaitan erat; namun IM saat ini menggabungkan keduanya ke dalam satu pengaturan. Ada dorongan untuk memisahkan kedua aspek itu, sehingga jika pengaturan "justification" tidak didefinisikan, ia kembali memakai pengaturan "-gravity" saat ini. Jika Anda merasa membutuhkannya, mintalah ke Cristy (lewat milis). Jika cukup banyak pengguna memintanya, saya yakin akhirnya akan diimplementasikan.

Pemosisian gambar memakai gravity

Berikut contoh pemakaian gravity untuk memosisikan gambar pada latar belakang.

  magick composite label:Default                      rings.jpg gravity_default.jpg
  magick composite label:Center    -gravity center    rings.jpg gravity_center.jpg
  magick composite label:South     -gravity south     rings.jpg gravity_south.jpg
  magick composite label:East      -gravity east      rings.jpg gravity_east.jpg
  magick composite label:NorthEast -gravity northeast rings.jpg gravity_northeast.jpg

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

Perhatikan bahwa posisi sebenarnya gambar juga diratakan menurut pengaturan "-gravity". Artinya, gravity "South" akan menengahkan gambar di bagian bawah gambar yang lebih besar, tetapi di atas titik gravity itu. Ini menjadi lebih penting nanti pada rotasi teks. Hal lain yang perlu diingat: posisi yang ditentukan pengaturan "-geometry" mana pun relatif terhadap posisi tempat gravity menaruh gambar. Bukan hanya itu, arah posisinya juga diubah sehingga arah posisi mengarah ke dalam. Misalnya "-gravity South -geometry +10+10" akan menggeser gambar label lebih masuk ke dalam latar belakang. Artinya, arah Y posisi geometry dibalik, sementara arah X dibiarkan.

  magick composite label:Default   -geometry +10+10 \
            rings.jpg gravity_default_pos.jpg
  magick composite label:South     -geometry +10+10 -gravity south \
            rings.jpg gravity_south_pos.jpg
  magick composite label:NorthEast -geometry +10+10 -gravity northeast \
            rings.jpg gravity_northeast_pos.jpg

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

Anda juga dapat memakai "-gravity" dengan "-draw image", untuk menempatkan beberapa gambar dengan satu perintah. |

  magick rings.jpg \
          -gravity Center     -draw "image Over     0,0 0,0 'castle.gif'" \
          -gravity NorthEast  -draw "image Bumpmap  0,0 0,0 'castle.gif'" \
          -gravity SouthWest  -draw "image Multiply 0,0 0,0 'castle.gif'" \
          gravity_image.jpg

[IM Output]
Dan kini "-composite" juga dapat dipakai untuk menumpangkan gambar ke latar belakang... |

  magick rings.jpg \
          -gravity Center     castle.gif  -compose Over     -composite \
          -gravity NorthWest  castle.gif  -compose Bumpmap  -composite \
          -gravity SouthEast  castle.gif  -compose Multiply -composite \
          gravity_image2.jpg

[IM Output]
Untuk detail lebih lanjut tentang pengaturan "-compose" yang dipakai di atas, lihat Komposisi alpha. Untuk metode lain menggabungkan dan menumpangkan banyak gambar menjadi satu gambar, lihat bagian contoh IM Layer banyak gambar.

Pemosisian teks dengan gravity

Nah, itu semua bagus untuk gambar, tetapi bagaimana dengan menggambar teks langsung di atas gambar. Efek dasar yang sama seperti pada gambar berlaku di sini. Seperti disebut di atas, gravity juga memengaruhi pemosisian teks baik lewat metode 'text' dari "-draw", maupun operator penggambar teks "-annotate" yang lebih baik. |

  magick rings.jpg -resize 120x120  \
          -gravity northwest  -annotate 0 'NorthWest' \
          -gravity east       -annotate 0 'East' \
          -gravity center     -annotate 0 'Center' \
          -gravity south      -annotate 0 'South' \
          -gravity northeast  -annotate 0 'NorthEast' \
          gravity_text.jpg

[IM Output]
Ada satu perbedaan yang sangat penting antara memosisikan gambar dan teks. Jika string teks digambar tanpa mendefinisikan bentuk "-gravity" apa pun, string itu akan digambar relatif terhadap 'baseline' font. Sebagai contoh, mari kita benar-benar melakukannya... |

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg

[IM Output]
Jika diamati saksama, hanya ekor lengkung kecil huruf 'g' pada 'String' yang terlihat di tepi atas gambar hasil. Sisa string-nya tergambar di luar gambar latar belakang. Namun jika "-gravity" diatur ke 'NorthWest', teks akan diposisikan seolah-olah sebuah gambar. Artinya, relatif terhadap kotak pembatas atau undercolor-nya sebagaimana didefinisikan font. Sebagai contoh... |

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg

[IM Output]
Alasan pembedaan ini adalah memastikan penggambaran teks IM tetap kompatibel dengan format gambar vektor lain seperti "SVG". Format-format itu tidak memakai gravity, jadi menyalakan gravity memberi tahu IM untuk mengikuti aturan yang sama dengan penempatan gambar saat menggambar teks, alih-alih aturan grafik vektor yang melibatkan 'baseline' font dan titik 'awal' teks. Jika gravity dinyalakan lalu ingin dimatikan lagi, pakailah "-gravity none" atau "+gravity" untuk mengembalikannya ke pengaturan bawaan 'tanpa gravity'. Mari terapkan offset teks dan gambar dengan kedua argumen "-gravity", bawaan 'None' dan 'NorthWest', supaya terlihat betapa dekat hubungan kedua bentuk itu. |

  magick rings.jpg \
          -gravity NorthWest -annotate +10+20 'NorthWest' \
          -gravity None      -annotate +10+20 'None' \
          gravity_text_pos.jpg

[IM Output]
Meski mungkin tak tampak pada contoh ini, kedua string itu bisa bertumpuk, terutama pada kaki huruf seperti 'g' dan 'p'. Artinya kedua string tidak dipisahkan sebagaimana mestinya sebesar satuan 'pointsize', melainkan hanya sebesar tinggi baseline font. Gagasan terbaik adalah tidak mencampur kedua mode itu dalam pemrosesan gambar Anda sendiri. Pakai gravity, atau tidak sama sekali. Pilihan di tangan Anda. Teks di tepi kiri memakai gravity Sebagai contoh terakhir, berikut cara menganotasi yang benar-benar tertengah di sepanjang tepi kiri gambar. Masalahnya, saat teks diputar, ia berputar mengelilingi 'pegangan' teks. Sayangnya pegangan ini diatur oleh gravity SEBELUM teks diputar, sehingga tidak bekerja dengan baik, kecuali dibatasi hanya pada 'teks tertengah'. [IM Output] Sebagai contoh, berikut 'percobaan pertama' yang lazim untuk memosisikan teks agar berada di tengah tepi kiri gambar. Tentu saja gagal secara agak tak terduga! |

  magick rings.jpg \
          -gravity West -annotate 90x90+10+0 'String' \
          gravity_text_left_fail.jpg

Seperti yang terlihat, teksnya diposisikan di tepi kiri, tetapi hanya sehingga awalnya (tempat 'pegangan' pra-rotasi berada) yang tertengah. Penyebab masalah ini adalah di IMv7 pengaturan "-gravity" juga langsung dipakai untuk mengatur 'perataan' teks (yang menentukan 'pegangan' yang dipakai memosisikan teks). Ada beberapa demo animasi efek gravity pada teks terputar yang ditulis dengan API PerlMagick (unduh "**im_annotation.pl**". Saya juga membuat versi skrip shell program yang sama, "**im_annotation**", dan "**im_annotation_2**". Trik agar ini berhasil: putar dulu seluruh gambarnya, lalu pakai center south! Solusi yang tak masuk akal, tetapi berhasil. |

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg

[IM Output]
Metode alternatif diperlihatkan di bawah pada Pemosisian teks memakai distort.

Pemosisian teks memakai draw

Meskipun di atas saya memakai 'offset teks' untuk memosisikan teks relatif terhadap titik "-gravity", itu bukan satu-satunya cara. Metode lainnya memakai opsi "-draw translate" untuk memosisikan teks. Keunggulannya, posisi teks dapat diatur tanpa efek gravity, sambil tetap memakai gravity untuk 'meratakan' 'pegangan' pemosisian di dalam teks. Pada contoh-contoh ini saya menambahkan beberapa garis bantu ekstra (yang juga tidak terpengaruh gravity) untuk memperlihatkan bagaimana posisi diterapkan dari titik pusat gambar. Teks dengan offset... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan  -draw 'line 50,50 70,70' \
          -fill red   -draw 'line 68,70 72,70 line 70,68 70,72' \
          -fill blue  -draw "text 20,20 'Offset'" \
          text_offset.jpg

[IM Output]
Teks dengan translasi... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 text 0,0 'Translate'" \
          text_translate.jpg

[IM Output]
Seperti yang terlihat, keduanya memberikan hasil efektif yang sama. Tetapi karena "-draw text" mengharuskan Anda memberi offset sebagai bagian argumennya, ia lebih umum dipakai untuk memosisikan teks yang digambar dari baris perintah. Namun meski kedua metode ini memberikan hasil yang sama, keduanya menghasilkan hasil yang sama sekali berbeda saat rotasi teks juga diterapkan. Pada dasarnya karena urutan penerapan aksinya.

Menggambar teks terputar

Ada dua cara terpisah memosisikan teks yang digambar: memakai 'offset teks', atau 'mentranslasikan' teks ke posisi akhirnya. Efek kedua metode pemosisian ini memberikan hasil yang sangat berbeda saat rotasi juga diterapkan. Alasannya kompleks, tetapi intinya menyangkut cara IM melakukan pelengkungan permukaan gambar. Meski begitu, mari kita lihat apa yang terjadi jika teks diputar memakai kedua posisi yang berbeda itu. Sekadar offset, tanpa rotasi... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "text 20,20 'None'" \
          rotate_none.jpg

[IM Output]
Memutar teks dengan offset... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 50,78' \
          -fill red  -draw 'line 48,78 52,78  line 50,76 50,80' \
          -fill blue -draw "rotate 45 text 20,20 'Offset'" \
          rotate_offset.jpg

[IM Output]
Memutar teks dengan translasi... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 rotate 45 text 0,0 'Translate'" \
          rotate_translate.jpg

[IM Output]
Inilah sebenarnya yang diinginkan kebanyakan orang. Meski rotasi offset bisa berguna untuk beberapa efek khusus. Perhatikan bagaimana urutan pelengkungan permukaan gambar ini terbalik dari urutan pemberiannya. Rotasi dilakukan lebih dulu, dan translasi dilakukan kedua. Jika metode 'rotate' dan 'translate' dibalik, Anda mendapat hasil yang sama dengan 'offset teks' biasa, yaitu offset yang terputar. Operator "-annotate" dirancang khusus untuk mempermudah pemosisian teks terputar, dengan secara khusus meminta IM menggambar teksnya dengan rotasi, alih-alih 'melakukan pelengkungan permukaan'. Annotate dengan rotasi dan offset... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -annotate 45x45+20+20 'Annotate' \
          rotate_annotate.jpg

[IM Output]
Masalah contoh-contoh di atas adalah pengaturan "-gravity" IMv7 tidak hanya mengacu pada posisi di gambar latar belakang, tetapi juga posisi di gambar overlay yang akan digambar. IMv7 akan menambahkan 'perataan teks', yang mengacu pada posisi overlay, sebagai pengaturan terpisah dari (tetapi berkaitan dengan) gravity (posisi latar belakang).

Pemosisian teks memakai distort

Memakai distorsi SRT dengan pelapisan gambar adalah metode yang sangat baik untuk menempatkan gambar (atau teks dalam gambar). Pada dasarnya ia memberi Anda kendali tingkat rendah yang penuh, baik atas titik penempatan gambar, maupun cara gambar diatur relatif terhadap titik itu. Sebagai awal, di sini kita membuat 'gambar teks' berlatar transparan dan sekadar 'melapiskan' gambar itu ke gambar latar belakang. |

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg

[IM Output]
Seperti yang terlihat, teksnya sekadar ditambahkan ke gambar di sudut kiri atas. Mari kita putar memakai distort (varian layer) -- Perhatikan penggunaan tanda kurung untuk membatasi gambar mana yang kita distorsi! |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg

[IM Output]
Perhatikan bahwa posisi teks TIDAK berubah! Yang terjadi hanyalah distort memutar teks mengelilingi titik pusat (pegangannya), tetapi sedemikian rupa sehingga relatif terhadap 'kanvas virtual' titik itu tidak bergeser. Maka saat gambar yang kini lebih besar itu diratakan, titik rotasinya, 'pusat gambar teks', tidak bergeser. Langkah berikutnya adalah menggeser pegangan itu, tetapi untuk ini kita perlu memakai hampir seluruh argumen distorsi SRT. Karena kita juga ingin tetap memakai 'pegangan pusat', kita perlu memakai escape persen properti gambar, atau lebih spesifiknya escape persen FX. Jadi mari tempatkan pusatnya di '+60+60' pada gambar latar belakang |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%[fx:h/2] 1 70 60,60' \
          \) -flatten  layer_translate.jpg

[IM Output]
Cara lain menggeser 'gambar layer' adalah memakai operator repage. Terutama pergeseran relatif memakai flag '!'. 'Pegangan' untuk ini, sesuai sifat gambar layer, adalah sudut kiri atas. Operator distorsi SRT tidak hanya mentranslasikan gambar memakai pegangan yang ditentukan, tetapi juga bisa memakai posisi sub-piksel (floating point) untuk kedua pegangan itu. Artinya, ia dapat mendistorsi teks dalam kelipatan sub-piksel ke lokasi mana pun, tanpa batasan bilangan bulat yang dimiliki kebanyakan operasi lain. Contoh terakhir adalah menempatkan teks yang diputar 90 derajat di tepi kiri. Pegangan teks untuk pusat rotasi dan pemosisian kali ini berada di tengah bawah teks, sebelum diputar. Yaitu posisi terhitung '%[fx:w/2],%h'. Posisi pada gambar latar belakang kini juga harus dihitung sebagai tengah tepi kiri ('0,%[fx:h/2]'). Masalahnya, operator distorsi SRT tidak punya akses ke gambar latar belakang saat mendistorsi gambar teks. Solusinya adalah melakukan perhitungan posisi ini saat gambar latar belakang tersedia, dan menyimpannya ke suatu 'pengaturan pribadi' yang kemudian bisa ditambahkan ke argumen distort. Teknik ini dibahas lebih rinci di Mengekstrak informasi dari gambar lain. Jadi inilah hasilnya. Pertama, hitung posisinya pada gambar latar belakang. Lalu distorsikan gambar teksnya sehingga 'pegangannya' juga berpindah ke posisi yang sudah dihitung itu. |

  magick rings.jpg -set option:my:left_edge '0,%[fx:h/2]' \
          \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%h 1 90 %[my:left_edge]' \
          \) -flatten  layer_on_left.jpg

[IM Output]
String 'my:' bisa apa saja yang tidak bentrok dengan prefiks yang ada. Maksudnya, saya memakainya untuk menyimpan pengaturan SAYA, terpisah dari pengaturan lain yang mungkin dipakai ImageMagick untuk coder atau opsi tertentu. Prefiks 'my:' adalah pilihan yang baik untuk ini. Escape persen ditangani murni sebagai substitusi string, dan sebenarnya kita bisa membangun seluruh opsi distort sebagai string. Satu-satunya masalah adalah Anda tidak bisa berhitung pada pengaturan 'my:' setelah nilainya diatur. Jadi semua perhitungan harus dilakukan di muka. Ini sesuatu yang akan ditinjau untuk IMv7, agar ekspresi FX memakai variabel escape %.