Contoh penggunaan ImageMagick -- penanganan teks
Membuat label teks, atau menambahkan teks ke gambar, barangkali salah satu operasi paling dasar dan paling umum yang dilakukan dengan ImageMagick. Operasi ini juga salah satu yang paling sederhana, tetapi membuka peluang untuk hasil yang sangat menawan. Karena itu, ini tempat yang baik untuk memulai penjelajahan kita atas kemampuan IM.
Operator teks di ImageMagick
ImageMagick punya banyak cara berbeda untuk menggambar teks di dalam gambar, yang menonjolkan keluwesan pustaka pemrosesan gambar ini. Halaman ini merinci metode dan gaya tertentu dalam menggambar teks. Yang perlu diingat saat mempelajari contoh-contoh ini: ImageMagick pada dasarnya adalah pengonversi dan pengubah gambar. Karena itu tiap metode yang disediakan adalah operator penggambaran teks sederhana, misalnya untuk menambahkan label dan pesan hak cipta ke gambar. Lihat Menganotasi gambar. Semua operator teks juga memahami dan memakai sekumpulan pengaturan pemrosesan teks standar seperti "-font" dan "-pointsize" yang akan dipakai. Juga pengaturan warna "-fill", dan untuk penggambaran teks yang lebih kompleks, warna "-strokewidth", "-stroke", dan "-undercolor". Bila Anda benar-benar membuat gambar baru, seperti label dan caption, pengaturan warna "-background" juga dipakai. Dan terakhir, pengubah yang lebih baru "-kerning" dan "-interword-spacing". ImageMagick bukanlah pemroses teks dan dokumen berformat penuh. Jika ingin pemrosesan teks yang berat, lebih baik gunakan pengolah kata interaktif penuh, atau pemformat teks batch seperti "TeX" (atau salah satu variannya (lihat Sistem pemrosesan teks lengkap di bawah). Keluaran program-program itu (umumnya berformat postscript) kemudian dapat dikonversi menjadi gambar dan diubah lebih lanjut oleh ImageMagick. Artinya, gunakan alat yang tepat untuk pekerjaan yang tepat. Meski begitu, sebagian penanganan campuran font tetap bisa dilakukan. Sebagai titik awal lihat Membuat baris dengan gaya font campuran di dekat bagian bawah halaman ini. Sekarang, mari kita lihat cara-cara dasar menyulap teks menjadi gambar. Nanti pada bagian berikutnya (Font majemuk kita akan melihat cara membuat beberapa efek font yang menarik.
Label - label teks sederhana
Label dasar
Membuat gambar font dengan gambar "label:" adalah cara yang paling lazim untuk menggambar font secara cepat di ImageMagick. Keunggulan terbesarnya: ia membuat kanvasnya sendiri mengikuti pengaturan warna "-background" dan "-fill" saat itu, dengan ukuran yang disesuaikan dengan teks yang digambar. Sebagai contoh, berikut label hasil yang umum.
magick -background lightblue -fill blue \
-font Candice -pointsize 72 label:Anthony \
label.gif
Contoh di atas barangkali pemakaian label yang paling umum, dengan pemilihan font dan "-pointsize" yang menentukan hasilnya. Tetapi ini jelas cara membuat label teks yang paling tidak menarik. |
Gambar 'label:' yang dihasilkan juga akan punya meta-data 'label' (properti gambar) yang diisi string yang sama. Beberapa format file, seperti MIFF dan PNG, menyimpan properti itu sehingga bisa dipakai program pemrosesan gambar berikutnya. Untuk contoh pemakaian meta-data 'label', lihat Montage dengan meta-data tersimpan. |
|---|---|
Jika "-size" juga ditentukan, gambar label yang dihasilkan akan dibuat pada ukuran itu. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 24 label:Anthony label_size.gif
![[IM Output]](../static/img/text/label_size.gif)
"-gravity" juga dapat dipakai untuk mengatur posisi label di dalam kotak yang lebih besar itu. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 24 -gravity center \
label:Anthony label_gravity.gif
![[IM Output]](../static/img/text/label_gravity.gif)
Tentu saja, jika "-size" tidak diatur untuk label, tak ada ruang ekstra pada "label:" yang dihasilkan untuk dipakai "-gravity", sehingga pengaturan itu nyaris tak berguna. Masalahnya bila "-size" dan "-pointsize" dipakai SEKALIGUS adalah teksnya bisa 'meluap' melewati ukuran gambar yang ditentukan. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 72 -gravity center \
label:Anthony label_overflow.gif
![[IM Output]](../static/img/text/label_overflow.gif)
| Sebelum versi 6.5.2-4, IM mengabaikan sepenuhnya pengaturan "-pointsize" jika pengaturan "-size" juga diberikan. Akibatnya teks pada gambar-gambar di atas diskalakan otomatis mengikuti penanganan 'pas terbaik' (lihat rangkaian contoh berikutnya).
Pas terbaik terhadap ukuran gambar
Trik terbesar memakai label untuk menghasilkan gambar dengan "-size" tertentu adalah dengan TIDAK menentukan "-pointsize" untuk label itu. Dalam keadaan ini IM bebas memilih ukuran font yang paling pas dengan ukuran gambar yang diminta. Artinya, teks yang digambar akan disesuaikan agar pas dengan ukuran yang diberikan! |
magick -background lightblue -fill blue -font Candice \
-size 165x70 label:Anthony label_size_fit.gif
![[IM Output]](../static/img/text/label_size_fit.gif)
Seperti terlihat, dengan mengatur "-size" bisa saja tersisa ruang ekstra di kanan atau di bawah gambar. | Saat IM membuat label 'bestfit', pointsize yang benar-benar dipakai juga disimpan ke properti gambar 'label:pointsize', sehingga informasi itu bisa dipakai belakangan. Fitur ini ditambahkan pada IM v6.6.2-7, dalam diskusi forum Pointsize Reporting
Posisi label pada ruang ekstra itu tetap bisa diatur lewat pengaturan "-gravity". |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -gravity center label:Anthony label_size_gravity.gif
![[IM Output]](../static/img/text/label_size_gravity.gif)
Tentu saja, jika "-size" tidak diatur untuk label, tak ada ruang ekstra pada "label:" yang dihasilkan untuk dipakai "-gravity", jadi pengaturan itu hanya masuk akal bila Anda meminta gambar berukuran tertentu. Sekarang kabar terbaiknya. Jika pengaturan "-size" yang diberikan hanya memuat lebar saja atau tinggi saja untuk label, font akan disesuaikan agar paling pas dengan dimensi itu. Dimensi lain yang tidak ditentukan lalu disesuaikan otomatis mengikuti teksnya! |
magick -background lightblue -fill blue -font Candice \
-size 160x label:Anthony label_size_width.gif
![[IM Output]](../static/img/text/label_size_width.gif)
Pada dasarnya itu berarti "label:" di atas akan selalu selebar 160 piksel, dengan ukuran font terbesar untuk lebar itu. Tinggi label lalu disesuaikan. Hal yang sama berlaku jika tinggi ditentukan tetapi lebarnya tidak. |
magick -background lightblue -fill blue -font Candice \
-size x40 label:Anthony label_size_height.gif
![[IM Output]](../static/img/text/label_size_height.gif)
Label ini setinggi 40 piksel; pointsize teks yang tak ditentukan disesuaikan agar pas dengan tinggi itu, lalu lebar yang tak ditentukan diatur mengikuti teks yang digambar. Persis seperti yang diharapkan. Tentu dalam kasus ini nyaris tak ada lagi ruang ekstra untuk dimainkan pengaturan "-gravity".
Label lebih dari satu baris
Generator "label:" dapat (sejak IM versi 6.2.5) menghasilkan label multibaris. |
magick -background lightblue -fill blue -font Ravie -pointsize 20 \
label:'ImageMagick\nRules - OK!' label_multiline.gif
![[IM Output]](../static/img/text/label_multiline.gif)
Seperti terlihat, "label:" memahami '\n' sebagai lambang baris baru. Artinya teks masukan mungkin perlu diproses lebih dulu untuk memastikan karakter khusus di-escape saat datanya ditaruh di baris perintah. Lihat Karakter escape khusus dalam argumen teks di bawah untuk rinciannya. Karena "-gravity" juga memengaruhi pembuatan "label:" (sejak IM versi 6.2.6), ia bisa dipakai untuk mengatur perataan label multibaris. |
magick -background lightblue -fill blue -font Corsiva -pointsize 24 \
-gravity center label:'ImageMagick\nExamples\nby Anthony' \
label_centered.gif
![[IM Output]](../static/img/text/label_centered.gif)
Satu fitur penting IM: ia bisa membaca data teks yang akan dipakai dari file. Caranya, awali nama file dengan karakter 'at' '@', lalu pakai itu sebagai argumen string. Sebagai contoh, di sini kita membuat label dari file 'message of the day' di workstation saya...
magick -background lightblue -fill blue \
label:@/etc/motd label_file.gif
Teks untuk label juga bisa dibaca dari pipeline input standar. Misalnya, di sini saya menyulap keluaran sebuah generator kutipan menjadi label multibaris.
mesgs ImageResolution |\
magick -background lightblue -fill blue \
label:@- label_file_multiline.gif
Perhatikan bahwa nama file yang saya pakai hanyalah karakter '-'. Itu berarti file dibaca dari input standar. Ingat, '@_filename_' bisa dipakai untuk membaca argumen string baris perintah APA PUN ke dalam IM. Termasuk semua metode masukan teks lain yang diberikan di bawah. Namun ia hanya bisa menggantikan seluruh argumen string, bukan sebagian argumen string. Perhatikan pula bahwa pada contoh-contoh di atas, satu baris kosong ekstra ditambahkan ke gambar label. Baris kosong ini disebabkan newline terakhir pada file teks masukan. Kecuali newline terakhir itu entah bagaimana dibuang dari file masukan (lihat contoh caption: di bawah untuk cara memperbaikinya), "label:" akan selalu punya baris kosong ini dari file teks masukan. |
Kebanyakan versi IM yang lebih lama (sebelum v6.2.5) tidak menangani label multibaris. Pada versi-versi itu baris-barisnya akan disambung menjadi satu baris tunggal yang sangat, sangat panjang. |
|---|---|
Label vertikal
Tentu saja newline juga bisa ditambahkan ke teks masukan. Misalnya, di sini saya mengambil satu kata sederhana dan menambahkan newline di antara setiap hurufnya, untuk membuat teks vertikal yang terpusat. |
echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '\012' |\
magick -background lightblue -fill blue -font Ravie -pointsize 24 \
-gravity center label:@- label_vertical.gif
Perhatikan bahwa perintah "sed" menambahkan karakter '@' setelah setiap karakter, kecuali di akhir string. "tr" lalu mengganti karakter '@' dengan newline. Perintah ini juga mengasumsikan teks masukan tidak berakhiran newline, yang akan menambahkan ruang kosong ekstra di bagian bawah gambar hasil. ![[IM Output]](../static/img/text/label_vertical.gif)
Pengguna Linux, yang berarti memakai versi GNU dari perintah "sed", bisa membuang "tr" dan mengganti '@' dengan '\n' di perintah sed, sehingga newline langsung disisipkan di antara tiap karakter. Lihat juga atribut khusus jarak antarbaris yang bisa dipakai untuk mengatur jarak antara karakter-karakter itu.
Caption - label dengan pelipatan kata
Generator gambar dari masukan teks "caption:" dalam banyak hal persis seperti "label:", bedanya alih-alih memperbesar teks agar pas dengan pengaturan "-size", ia melipat (word wrap) baris panjang yang tidak muat ke dalam lebar "-size" yang ditentukan. Namun pengaturan "-size" di sini tidak opsional dan minimal harus menentukan lebar maksimum dalam piksel. Sebagai contoh, berikut caption dari satu baris panjang yang tidak akan muat pada lebar yang ditentukan.
magick -background lightblue -fill blue -font Corsiva -pointsize 36 \
-size 320x caption:'This is a very long caption line.' \
caption.gif
| Gambar 'caption:' yang dihasilkan juga akan punya meta-data "caption" (properti gambar) yang di-'set' ke string yang sama, sehingga informasi itu bisa dipakai ulang nanti. Semua format file gambar yang umum menyimpan informasi ini bersama gambarnya. Lihat contohnya di Montage dengan meta-data tersimpan.
Secara default seluruh teks diratakan kiri, tetapi sejak IM versi 6.2.0 "caption:" menghormati "-gravity" untuk keperluan perataan teks.
magick -background lightblue -fill blue -font Candice -pointsize 40 \
-size 320x -gravity Center caption:'ImageMagick Rules OK!' \
caption_centered.gif
Jika tinggi ikut diberikan bersama lebar pada pengaturan "-size", tinggi gambar juga akan diatur ke nilai itu. Pengaturan "-gravity" lalu bisa dipakai untuk memosisikan teks secara vertikal.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x100 -gravity South caption:'Captions at their height!' \
caption_height.gif
Namun perlu dicatat: jika teks tidak muat (dari sisi tinggi) ke dalam "-size" yang ditentukan dengan "-pointsize" yang diberikan, teks akan meluap keluar kotak. Pengaturan "-gravity" saat itu tentu menentukan bagian teks mana yang terpotong. Contoh berikut persis sama dengan contoh sebelumnya, tetapi dengan "-size" gambar yang terlalu kecil untuk hasilnya.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x60 -gravity South caption:'Captions at their height!' \
caption_height_toosmall.gif
Caption pas terbaik
Sejak IM v6.3.2, jika lebar dan tinggi gambar akhir diberikan keduanya, tetapi "-pointsize" font tidak ditentukan (atau pointsize dimatikan dengan "+pointsize"), IM akan mencoba menyesuaikan ukuran font secara otomatis agar mengisi "-size" gambar yang diminta sebaik mungkin. Sebagai contoh, di sini saya meminta ImageMagick mengisi area yang cukup besar...
magick -background lightblue -fill blue -font Candice -size 320x140 \
caption:'This text is resized to best fill the space given.' \
caption_filled.gif
Dan sekarang area yang jauh lebih kecil dan lebih sempit, untuk font dan string teks yang sama. |
magick -background lightblue -fill blue -font Candice -size 80x110 \
caption:'This text is resized to best fill the space given.' \
caption_filled_sm.gif
![[IM Output]](../static/img/text/caption_filled_sm.gif)
Perhatikan bahwa SATU-SATUNYA perbedaan antara dua contoh terakhir adalah "-size" gambar yang dihasilkan. IM menyesuaikan teks dan pelipatan kata untuk mengisi ukuran gambar yang ditentukan sebaik mungkin. Ini sangat berguna untuk memuatkan potongan teks yang tak diketahui panjangnya ke ruang tertentu, tanpa meluap keluar batas area. Namun secara internal ini setara dengan menjalankan caption berkali-kali selagi IM mencari pointsize yang tepat untuk mengisi ruang itu sebaik mungkin. Dengan kata lain prosesnya sering 10 kali lipat atau lebih lambat dibanding bila "-pointsize" tertentu diberikan.
Caption dengan paragraf
Operator gambar "caption:" (sejak IM v6.2.5) memahami escape shell '\n' (sehingga backslash perlu digandakan '\\' untuk meng-escape backslash) sebagai baris atau paragraf baru. Sebelum versi ini, paragraf terpisah harus diproses dengan operasi "caption:" terpisah.
magick -background lightblue -fill blue \
-font Ravie -pointsize 24 -size 360x \
caption:"Here I use caption to wordwrap.\nTwo separate lines." \
caption_multi_line.gif
Teks yang akan digambar bisa dibaca dari file, atau input standar (dari perintah pipeline sebelumnya), memakai awalan nama file '@', persis seperti pada "label:".
mesgs FilePrivate |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_file.gif
Seperti terlihat, newline pada teks masukan (sejak IM v6.2.5) diperlakukan sebagai pemisah paragraf. Termasuk newline terakhir pada file masukan. Tentu saja "label:" tidak akan melipat baris-barisnya, melainkan mempertahankannya. Jika sebuah file benar-benar ingin diperlakukan sebagai satu paragraf, karakter newline-nya perlu diganti dengan karakter spasi, supaya seluruh teks berada di satu baris. Sebagai contoh, di sini kita ambil teks yang sama, tetapi mengganti line feed dengan spasi, lalu mengganti spasi berganda di antara kata dengan satu spasi...
mesgs FilePrivate | tr '\012' ' ' | sed 's/ */ /g' |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_one_line.gif
Seperti terlihat, ini bekerja jauh lebih baik. Namun yang sering diinginkan adalah memperlakukan baris kosong sebagai pemisah paragraf. Berarti semua newline perlu dibuang, kecuali yang terlibat dalam baris kosong. Berikut perintah "sed" khusus untuk menyulap teks semacam itu ke format yang dibutuhkan "caption:". Dalam kasus ini teksnya adalah halaman pertama manpage "magick".
man magick | col -b | expand | \
sed '/^$/d; :loop y/\n/ /; N; /\n$/! b loop; s/ */ /g; s/^ //' |\
head -n 7 | magick -size 400x caption:@- caption_manual.gif
| Tidak ada opsi teks rata kiri-kanan (justified) pada caption. Tetapi pemformat teks pango: (memakai pustaka eksternal) punya fitur itu, dan banyak lagi.
Atribut teks
Awalnya pengaturan yang memengaruhi penanganan teks meliputi: "-font", "-fill", "-pointsize", "-size", dan "-gravity". Banyak dari kontrol atribut ini sudah kita perkenalkan di atas. Tetapi ada kontrol atribut lain yang tak sesering itu dipakai, dan semula tidak memengaruhi pembuatan gambar teks "label:" maupun "caption:". Sejak IM v6.3.2 Anda juga bisa memakai "-stroke", "-strokewidth", dan "-undercolor" pada "label:" atau "caption:". Sebagai contoh, di sini saya memakai banyak pengaturan berbeda untuk mengendalikan atribut render gambar teks IM... |
magick -background white -fill dodgerblue -font Candice \
-strokewidth 2 -stroke blue -undercolor lightblue \
-size 165x70 -gravity center label:Anthony label_color.gif
![[IM Output]](../static/img/text/label_color.gif)
Untuk rincian pengaturan-pengaturan ini lihat kotak undercolor di bawah, dan Stroke, strokewidth di bagian menggambar. | Saat ini gambar tiling yang didefinisikan lewat "-tile", "-fill", "-background", dan "-origin" belum bisa dipakai dengan "label:" maupun "caption:". Hanya warna polos yang bisa dipakai. Mencobanya hanya akan menghasilkan warna tak terdefinisi (hitam).
Pointsize, densitas, dan ukuran font sebenarnya
Piksel adalah titik pada layar atau di dalam gambar, dan itulah satuan kerja IM. Di sisi lain, gambar dicetak pada resolusi tertentu (dinyatakan sebagai 'dots per inch' (dpi) atau piksel per inci (ppi)). Karena itu resolusi gambar memengaruhi bagaimana program lain menskalakan gambar ke media tertentu. Yakni memengaruhi ukuran fisik gambar di dunia nyata. Resolusi (densitas atau dpi) sebuah gambar tak ada hubungannya dengan ukuran piksel gambar, maupun ruang yang dipakai gambar di memori atau di disk. Pada umumnya ia juga tak relevan bagi kebanyakan operasi gambar IM. Jadi bagi ImageMagick, resolusi hanyalah sekumpulan angka yang tersimpan bersama gambar, dan biasanya diabaikan. Satu-satunya saat resolusi atau densitas gambar menjadi relevan adalah untuk font dan untuk mengonversi format vektor seperti postscript, pdf, MWF, ke format gambar raster yang ditangani IM. Pengaturan "-density" memberi tahu IM berapa piksel (titik) per inci (ppi) yang ada pada perangkat keluaran, yang lalu dipakainya menyesuaikan pembuatan gambar dan ukuran font. Misalnya, secara default IM bekerja dengan pengaturan "-density" 72 ppi, nilai yang umum untuk menampilkan gambar di monitor atau halaman web. Karena ukuran font dinyatakan dalam 'poin' (lewat "-pointsize" dan menurut definisi 1 poin adalah 1/72 inci, maka font 72 poin semestinya menghasilkan teks setinggi kira-kira 1 inci... |
magick -pointsize 72 label:Hello pointsize.gif
![[IM Output]](../static/img/text/pointsize.gif)
Namun kebanyakan layar modern beresolusi lebih baik dari itu, biasanya antara 90 sampai 120 piksel per inci (ppi). Maka... |
magick -density 90 -pointsize 72 label:Hello density.gif
![[IM Output]](../static/img/text/density.gif)
Semestinya menghasilkan label setinggi 1 inci pada layar 90 dpi. Di layar saya memang begitu! Anda bisa mengukur tinggi gambar-gambar ini di layar untuk memeriksa resolusi layar Anda. Karena jumlah piksel per incinya lebih besar, font yang digambar pun secara alami lebih besar dalam hitungan piksel gambar, sehingga menghasilkan gambar lebih besar. Program gambar yang berbeda sering punya densitas default berbeda, dan ini bisa membuat font tampil berlainan saat digambar program berbeda, bahkan pada pointsize yang sama. Perhatikan bahwa "-pointsize" sebenarnya berarti jarak antarbaris sebuah font (tepatnya tinggi area gambarnya), dan BUKAN tinggi sebenarnya huruf yang digambar! Karena itu satu font bisa tampak lebih besar atau lebih kecil dari font lain, pada pointsize dan densitas yang sama. Hanya jarak baris font-font itu yang benar-benar sama; selebihnya bergantung pada font dan perancang fontnya. Jadi dengan "-density" default 72dpi (saat 1 poin = 1 piksel), font 12 poin semestinya punya jarak 12 piksel antara baseline dua baris teks. | Perhatikan bahwa tinggi gambar "label:" yang dihasilkan didasarkan pada area gambar atau bounding box gambar itu, yang sering kali adalah jarak baris dan pointsize font. Ini tidak selalu demikian; karena itu sekadar menyambung baris-baris teks secara vertikal sebenarnya adalah penanganan font yang keliru!
Sebagian font bahkan bisa menjulur jauh melewati batas jarak baris normal, memanjang jauh ke atas atau, lebih sering, ke bawah spasi barisnya. Ini terutama berlaku pada font gaya tulisan tangan. Tampilan sebuah font juga dipengaruhi "-pointsize" dan "-density"-nya. Menggandakan pointsize font ("-pointsize 24") menghasilkan font yang tampak kira-kira sebesar font dengan densitas atau resolusi digandakan. Namun karena font dirancang untuk tampil dengan rupa tertentu, ketebalan garis pada font mungkin tak banyak berubah pada pointsize lebih besar. Artinya, ukuran font yang lebih besar itu sedikit berbeda. Tetapi jika hanya densitasnya yang digandakan ("-density 144"), font 12 poin akan digambar dengan dimensi digandakan, dan semestinya tetap tampak seperti font 12 poin aslinya, hanya digambar pada skala lebih besar dengan penghalusan tepi lebih baik. Namun pada resolusi sangat rendah, keterbatasan ukuran fisik piksel juga bisa memengaruhi tampilan font. Artinya garis tipis bisa menebal pada densitas rendah akibat besarnya ukuran piksel yang didefinisikan densitas itu. Hubungan antara 'densitas' dan 'pointsize' adalah persoalan yang sangat rumit, yang hanya bisa dipahami penuh oleh desainer grafis font profesional, agar font rancangannya menanganinya dengan benar. Menurut Lithium dari forum IM...
Saya kira ini fitur perender font TrueType. Glyph TrueType bukan sekadar kumpulan kurva; ia bisa memuat beberapa tingkat detail serta instruksi yang menyesuaikan koordinat titik menurut ukuran keluaran dalam piksel, yang lebih terlihat pada ukuran piksel kecil. Karena itu teks kecil tampak berbeda (dan lebih jernih, bisa diperhatikan) dibanding teks besar yang dikecilkan.
FUTURE Example: difference between font at same 'pixel' size, but different density and point size. Pada dasarnya menaikkan salah satu faktor ini sambil menurunkan faktor lainnya sebesar jumlah yang sama mungkin tidak memberi hasil yang sama. Terutama menyangkut ketebalan garis dan 'gaya' keseluruhan font. Lebih baik sesuaikan faktor yang tepat untuk keperluan Anda. Pakai "-density" saat menskalakan font untuk perangkat keluaran, atau untuk pengubahan ukuran font di kemudian, dan pakai "-pointsize" untuk perubahan ukuran font biasa. Jika ingin tahu lebih banyak tentang font, lihat dokumen TrueType Fundamentals (PDF), yang menurut saya sangat menarik.
Batas gambar label
Pada beberapa font eksotis, font bisa memakai karakter yang menjulur, dan dulu IM sering kerepotan membuat label untuk font-font ini. Yakni, teksnya meluap keluar kanvas yang disediakan. Sebagai contoh, berikut dua huruf kapital dalam font 'LokiCola' yang mengingatkan pada merek minuman ringan terkenal tertentu. |
magick -background lightblue -fill blue -font LokiCola -pointsize 64 \
label:HC label_overflow_font.gif
![[IM Output]](../static/img/text/label_overflow_font.gif)
Seperti terlihat, IM berhasil memuat font ini dalam label tanpa memotong grafik awalan maupun ekor fontnya. | Sebelum IM v6.3.2, "label:" akan memangkas lengkung awal 'H' dan sebagian ekor kedua karakter pada contoh di atas.
Masalah ini ada karena 'glyph' atau deskripsi karakter font itu menggambar di luar batas yang didefinisikan font untuk huruf-huruf tertentu, sehingga bisa menindih (umumnya di atas atau di bawah) karakter lain dalam font itu. Ini masalah pada cara font itu sendiri dirancang dan didefinisikan, bukan kesalahan IM, meski IM kini menangani situasi ganjil ini demi kepentingan terbaik pengguna. Pada situasi lain ini tetap bisa jadi masalah, dan tak bisa diselesaikan begitu saja karena interaksi teks multibaris. Untuk informasi lebih lanjut lihat contoh luapan bounding box di bawah, dengan uraian yang lebih presisi.
Teks unicode atau berformat UTF8
Metode memasok argumen string ke IM ini sangat penting karena memungkinkan hal-hal yang biasanya sangat sulit dilakukan dari baris perintah. Khususnya menangani 'teks unicode', atau memilih karakter tertentu lewat kode karakternya. Nah, jika karakter unicode bisa diketik langsung ke perintah atau skrip, ia bisa langsung dipakai..
magick -background lightblue -fill blue -pointsize 32 \
label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ ' label_i8n.gif
Namun sedikit orang yang keyboard atau editornya tertata baik untuk menangani masukan karakter unicode. Kalaupun karakter unicode tak bisa diketik langsung, satu solusi sederhana adalah 'salin-tempel' saja karakter yang diinginkan dari file teks UTF-8 atau halaman web yang sudah ada. Saya sendiri begitu! Jika teks UTF-8 yang ingin digambar sudah tersedia, ia bisa dibaca langsung dari file dengan '@filename'. Sebagai contoh, di sini saya membuat label bahasa Tionghoa dari file teks Tionghoa berenkode UTF-8 (tanpa newline terakhir di filenya).
magick -background lightblue -fill blue -pointsize 48 \
-font ZenKaiUni label:@chinese_words.utf8 label_utf8.gif
| _Font pada contoh di atas font khusus dengan set glyph Tionghoa lengkap, misalnya font Fedora Linux 'SimSun' (atau pada file font "gkai00mp.ttf"), "ZenKaiUni" (pada file "ukai.ttf"), atau "ShanHeiSunUni" (pada salah satu file "uming.ttf", "zysong.ttf", atau "bsmi00lp.ttf").
Perhatikan bahwa font windows 'Mincho' (dipakai pada contoh selanjutnya) juga mendefinisikan banyak glyph Tionghoa tetapi tidak lengkap. Jika dipakai pada contoh di atas, akan muncul beberapa tanda tanya untuk glyph yang tak terdefinisi.
Skrip khusus "imagick_type_gen" dipakai untuk menemukan dan mengekstrak nama resmi font, lalu menambahkan font itu ke file konfigurasi "type.xml" ImageMagick.
_
Kita juga bisa membangkitkan string UTF-8 dari kode karakter unicode memakai program "printf" 'GNU' (pada sistem Linux) untuk menyulap angka unicode menjadi string berenkode UTF-8 tertentu, dalam hal ini tanda kutip buka dan tutup tipografi yang semestinya (sekali lagi tanpa newline terakhir pada masukan UTF-8). Di sini misalnya saya membangkitkan teks UTF-8 dari kode karakter unicode, lalu menyalurkannya lewat pipeline perintah (dibaca dari 'stdin' dengan "@-"), bukan dari file sungguhan.
env LC_CTYPE=en_AU.utf8 \
printf "\u2018single\u2019 - \u201Cdouble\u201D" | \
magick -background lightblue -fill blue -pointsize 36 \
label:@- label_quotes.gif
Pada sistem lain (seperti Mac OSX dan Windows), "printf" perl bisa dipakai untuk mengeluarkan string karakter berenkode UTF-8 dari kode karakter unicode.
perl -e 'binmode(STDOUT, ":utf8"); \
print "\x{201C}Unicode \x{2018}\x{263A}\x{2019} Please\x{201D}";' |\
magick -background lightblue -fill blue -pointsize 36 \
label:@- label_unifun.gif
Untuk informasi lebih lanjut dan mencari kode karakter unicode berbagai bahasa dan simbol, lihat Unicode Character Code Charts. Karakter unicode bukan hanya memuat karakter internasional; dengan font yang tepat, set 'simbol' khusus yang didefinisikannya juga bisa dipakai. Yang paling terkenal adalah font simbol 'DingBats'. Font ini sudah begitu umum sampai kini menjadi bagian set font Unicode standar. Sebagai contoh, di sini saya mengekstrak 24 karakter pertama area simbol unicode 'DingBats' memakai skrip shell khusus "**graphics_utf**" yang saya tulis untuk membangkitkan satu 'blok' karakter unicode sebagai teks UTF-8.
graphics_utf -N 2701 2718 |\
magick -font Mincho -pointsize 32 label:@- label_dingbats.gif
Tanda tanya di atas adalah karakter tertentu yang tidak didefinisikan baik oleh unicode maupun font windows 'Mincho'. Lebih tepatnya, simbol yang dulu ada di font 'dingbat' asli memang ada di unicode, tetapi pada kode karakter unicode lain, bukan kode dingbat yang diharapkan. Lihat Dingbats Unicode Specification Chart untuk rincian, berikut rujukannya ke karakter unicode yang benar untuk karakter dingbat yang 'hilang'. Alih-alih tanda tanya, banyak font justru mencetak kotak atau karakter kosong untuk karakter tak terdefinisi semacam itu. Jika terlalu banyak karakter seperti itu, atau ada karakter hilang pada keluaran Anda, kemungkinan Anda perlu memakai font lain. Set simbol lain yang juga tersedia dalam font karakter unicode yang raksasa itu antara lain: simbol rune Tolkien, simbol matematika, angka romawi, panah, Braille, dan simbol teknis. Set yang besar untuk dijelajahi, dan skrip shell "**graphics_utf**" bisa membantu menjelajahinya. Berikut contoh lain karakter unicode yang bisa dirender font 'Mincho' Microsoft. Kali ini dari bagian "Miscellaneous Symbols"...
graphics_utf -N 2620 2630 |\
magick -font Mincho -pointsize 40 label:@- label_misc.gif
Memakai unicode di dalam skrip DOS jauh lebih sulit daripada di UNIX dan LINUX. Catatan khusus tentang pemakaian unicode dari lingkungan itu disediakan oleh Wolfgang Hugemann di enkode karakter Windows.
Font simbol
Yang lebih sering dipakai orang yang mencari gambar teks khusus adalah 'font simbol' khusus. Font-font ini jauh lebih kecil daripada font Unicode besar yang lengkap, karena hanya mengganti karakter ASCII standar biasa (huruf dan angka) dengan sekumpulan bentuk dan gambar tertentu, meski kadang (jarang) juga punya simbol tambahan di area meta-karakter Latin. Simbol font 'DingBat' bermula seperti ini, tetapi seperti disebut di atas kini menjadi bagian set karakter Unicode. Sebagai contoh, satu simbol yang cukup saya sukai berasal dari font "WebDings": simbol 'hati lekuk' yang cukup manis, yang menggantikan karakter 'Y' biasa dalam definisi font itu...
magick -size 20x20 -gravity center -font WebDings label:Y label_heart_20.gif
magick -size 40x40 -gravity center -font WebDings label:Y label_heart_40.gif
magick -size 60x60 -gravity center -font WebDings label:Y label_heart_60.gif
magick -size 80x80 -gravity center -font WebDings label:Y label_heart_80.gif
Yang penting diingat: semua font truetype sebenarnya adalah jenis khusus dari format gambar vektor. Dengan banyak gambar (satu per karakter) dalam font itu. Karena berupa gambar vektor, font semestinya memungkinkan Anda 'menggambar' karakter, bentuk, atau simbol pada hampir semua ukuran (skala), lewat kontrol yang disediakan "-size", "-pointsize", dan "-density". Seperti terlihat di atas, 'hati lekuk' itu bisa 'dirender' pada hampir semua ukuran yang saya mau. Sebagian font sangat terspesialisasi. Misalnya, dari IDAutomation tersedia file font bernama "IDAutomationHC39M.ttf" yang bisa dipakai membuat barcode. Contohnya...
![[IM Output]](../static/img/text/label_heart_80.gif)
|
magick -font IDAutomationHC39M -pointsize 16 label:'*314-76*' \
-bordercolor white -border 5x5 label_barcode.gif
![[IM Output]](../static/img/text/label_barcode.gif)
Berikut beberapa simbol menarik lain yang saya temukan di berbagai font simbol yang saya kumpulkan karena satu dan lain alasan...
magick -pointsize 48 -font WebDings label:' " _ ~ ) - ' label_webdings.gif
magick -pointsize 48 -font LittleGidding label:' x o w ' label_ltgidding.gif
magick -pointsize 48 -font WingDings2 label:'ab' label_wingdings2.gif
magick -pointsize 48 -font Zymbols label:' ? , - I Z ' label_zymbols.gif
magick -pointsize 48 -font TattoEF label:' B Y D I H ' label_tatooef.gif
magick -pointsize 48 -font SoundFX label:' V 3 t f 9 ' label_soundfx.gif
Ini hanya sampel kecil dari yang tersedia. Koleksi raksasa berisi hampir semua simbol, bentuk, atau gambar yang terbayangkan tersedia di WWW untuk Anda jelajahi dan unduh.
![[IM Output]](../static/img/text/label_soundfx.gif)
| Ingat bahwa tiap karakter yang digambar punya dua bagian terpisah yang bisa digambar: area 'fill' (yang saya tunjukkan di atas) dan 'stroke' alias garis luar, yang bisa tampak sangat berbeda dari area fill-nya. Masing-masing area bisa digambar terpisah, atau dengan warna berbeda, jadi ada baiknya memeriksa lebih dekat simbol atau bentuk yang menjanjikan, dengan beberapa cara. Hasilnya bisa sangat mengejutkan. Lihat Font majemuk, stroke untuk beberapa contohnya.
| _Banyak pembuat font simbol menghasilkan bentuknya memakai pemindai sederhana dan pengonversi bitmap-ke-vektor, tanpa perancangan atau pembersihan gambar maupun bentuk yang semestinya. Berhati-hatilah saat menimbang font 'hasil pindaian' semacam itu.
Font terakhir yang ditampilkan di atas adalah salah satu contoh font 'hasil pindaian' itu, sehingga kualitasnya tampak buruk dan 'berbintik' dibanding font-font lain yang dirancang lebih baik._
Kerning antarkarakter
Sejak IM v6.4.7-8, "-kerning" bisa dipakai untuk menyisipkan ruang antarkarakter ekstra di antara tiap huruf dalam string teks. Contohnya |
magick -pointsize 12 label:Anthony label_kerning_0.gif
magick -pointsize 12 -kerning 1 label:Anthony label_kerning_1.gif
magick -pointsize 12 -kerning 2.5 label:Anthony label_kerning_2.gif
magick -pointsize 12 -kerning 5 label:Anthony label_kerning_5.gif
magick -pointsize 12 -kerning -1 label:Anthony label_kerning-1.gif
![[IM Output]](../static/img/text/label_kerning-1.gif)
Perhatikan bahwa nilai kerning bisa berupa bilangan pecahan, bahkan negatif. Untuk contoh lain pemakaian nilai "-kerning" negatif, lihat contoh font majemuk tersambung.
Jarak antarkata
Juga sejak IM v 6.4.8-0, opsi "-interword-spacing" bisa dipakai untuk mengubah ukuran karakter spasi di antara kata. Contohnya |
magick label:'I Love IM!' label_wspace_off.gif
magick -interword-spacing 1 label:'I Love IM!' label_wspace_1.gif
magick -interword-spacing 10 label:'I Love IM!' label_wspace_10.gif
magick -interword-spacing 25 label:'I Love IM!' label_wspace_25.gif
![[IM Output]](../static/img/text/label_wspace_25.gif)
Perhatikan bahwa ukuran karakter spasi antara kata bukan hanya bisa diperbesar tetapi juga diperkecil dari ukuran default. Namun perhatikan pula bahwa spasi membuat kata-kata dijajarkan ulang ke batas piksel (tidak seperti kerning antarkarakter di atas), sehingga keluaran label dengan spasi diatur nol tetap berbeda dari label yang sama sekali tanpa spasi. Baik kerning antarkarakter maupun jarak antarkata juga memengaruhi hasil kemampuan IM menyesuaikan string teks secara otomatis ke gambar berukuran tertentu. |
magick -size 150x label:'I Love IM!' label_wsize_of.gif
magick -size 150x -interword-spacing 25 label:'I Love IM!' label_wsize_25.gif
magick -size 150x -interword-spacing 50 label:'I Love IM!' label_wsize_50.gif
![[IM Output]](../static/img/text/label_wsize_50.gif)
Yang terjadi: dengan mengatur "-interword-spacing", ukuran karakter 'spasi' tak lagi ikut berubah bersama ukuran teks lainnya. Maka selagi IM mencari "-pointsize" terbaik, besar ruang antara tiap kata bersifat tetap, sehingga tak ambil bagian dalam penyesuaian teks ke lebar tetap yang diberikan. Akibatnya, makin besar "-interword-spacing", makin kecil ukuran font yang dibutuhkan agar baris teks itu benar-benar muat pada lebar gambar yang sama. Nilai negatif bisa dipakai, dan nyatanya bisa membuat kata-kata bertindihan, atau menghasilkan efek tak biasa dengan karakter dan font tertentu. Tetapi kalau terlalu negatif, perilaku tak terdefinisi bisa menyusup. Berhati-hatilah kalau mencobanya. Meski contoh di atas bukan contoh perataan kiri-kanan teks (walau tampak seperti itu), opsi-opsi ini bisa jadi titik awal menyediakan perataan teks yang sebenarnya. Kalau tingkat pemformatan dan perataan teks seperti itu benar-benar dibutuhkan, mungkin lebih baik menengok metode lain pembuatan teks praformat atau Postscript, seperti perangkat lunak "TeX" atau "LaTeX" berbasis baris perintah. Lebih baik lagi, SVG (versi pustaka rsvg), atau Pango Markup Language (lihat di bawah), bisa dipakai untuk membuat teks rata kiri-kanan.
Jarak antarbaris
Sejak IM v6.5.5-8 satu opsi lagi ditambahkan: "-interline-spacing". Opsi ini banyak diminta pengguna menyusul pengaturan-pengaturan sebelumnya, dan dalam banyak hal jauh lebih berguna. Pada dasarnya ia menambah atau mengurangi sekian piksel di antara baris-baris teks. Yakni, bisa dipakai merenggangkan atau memampatkan baris-baris teks. Contohnya....
magick label:'First\nSecond' label_lspace_off.gif
magick -interline-spacing 5 label:'First\nSecond' label_lspace_5.gif
magick -interline-spacing 10 label:'First\nSecond' label_lspace_10.gif
magick -interline-spacing 20 label:'First\nSecond' label_lspace_20.gif
magick -interline-spacing -5 label:'First\nSecond' label_lspace-5.gif
magick -interline-spacing -10 label:'First\nSecond' label_lspace-10.gif
Agar pengaturan ini optimal, Anda perlu bisa menghitung jarak baris normal font tertentu. Inilah definisi sebenarnya "-pointsize", yang bersama resolusi atau pengaturan "-density" saat itu menentukan jarak baris sebuah font. Ia tidak benar-benar menentukan tinggi font atau ketebalan garisnya, meski memengaruhi aspek-aspek itu pada font tertentu. Jadi dengan "-density" '72' titik per inci, dan mengetahui bahwa menurut definisi ada 72 'poin' per inci, bisa dihitung bahwa font 12 poin punya jarak baris 12 piksel. Dengan informasi itu, baris teks 12 poin bisa dibuat 'berspasi ganda' lewat pengaturan "-interline-spacing 12". Ini menambah 12 piksel ekstra di antara baris. |
magick -density 72 -pointsize 12 -interline-spacing 12 -font Arial \
label:'First\nSecond\nThird' label_lspace_double.gif
![[IM Output]](../static/img/text/label_lspace_double.gif)
Tentu, seperti sudah terlihat pada ukuran antarkata, menambahkan piksel dalam jumlah tetap di antara elemen teks cenderung membuat teks mengecil bila penanganan pointsize otomatis dipakai. Yakni, saat "-size" gambar akhir diberikan tanpa pengaturan "-pointsize". |
magick -size x70 -interline-spacing 18 -font Arial \
label:'First\nSecond\nThird' label_lspace_size.gif
![[IM Output]](../static/img/text/label_lspace_size.gif)
Jarak antarbaris negatif juga bisa dipakai sebagai cara kasar tapi siap pakai untuk 'menebalkan' baris secara vertikal: cukup ulangi baris itu, lalu kurangkan 1 piksel lebih banyak dari jarak baseline. |
magick -density 72 -pointsize 12 -interline-spacing -13 -font Arial \
label:'Bolded Word\nBolded' label_lspace_vbold.gif
![[IM Output]](../static/img/text/label_lspace_vbold.gif)
Tentu ini tidak jalan kalau yang diinginkan memang dua baris, bukan sekadar menebalkan teks. Cara ini juga lebih baik dengan font lebar tetap.
Karakter escape khusus dalam argumen teks
Karakter escape khusus yang dipakai di berbagai argumen teks sudah kita perkenalkan di atas. Tepatnya, karakter khusus seperti newline bisa di-escape dengan backslash '\', atau informasi ekstra bisa disisipkan ke string lewat escape persen '%', seperti didefinisikan di halaman properti gambar. Ada juga escape '@' khusus: bila dipakai di awal, sisa argumen teks diperlakukan sebagai nama file untuk membaca data dari file itu (atau STDIN bila '-' dipakai). |
Sebagian sistem (seperti ubuntu) menonaktifkan escape '@{file}' lewat kebijakan keamanan. Ketik magick -list policy untuk melihat kebijakan apa yang ada di sistem Anda dan dari mana asalnya. |
|---|---|
Karakter escape ini bukan hanya memengaruhi "-format" untuk dipakai "magick identify" (juga "-identify" dan "info:"), tetapi juga memengaruhi generator teks-ke-gambar "label:" dan "caption:", serta mengendalikan opsi pengaturan meta-data gambar "-label", "-comment", "-caption". Dan terakhir, ia juga dipakai "-annotate". |
_Meski backslash '\' dipakai metode 'text' dari "-draw", escape persen '%' tidak, karena mengganggu penanganan gambar SVG ImageMagick. Ini salah satu alasan operator "-annotate" dibuat untuk IM versi 6. |
Poin penting lain tentang karakter escape: ia dipakai untuk argumen teks baris perintah. Ia sama sekali tidak berlaku di dalam data yang dibaca dari file teks (biasanya dibaca lewat escape '@'). Berarti Anda tak perlu pusing meng-escape 'escape' untuk data file teks, tetapi juga berarti data file harus Anda proses sendiri di luar IM bila perlu menyisipkan informasi ke teksnya. | _Perlindungan file teks masukan dari penanganan escape difinalkan pada IM versi 6.3.3.
Sebagai contoh, di sini saya mengatur lalu melaporkan meta-data 'label' dan 'comment' sebuah gambar memakai dua metode pengaturan informasi itu dari file teks sumber. File "info.txt" berisi string
, (tanpa newline terakhir). |
magick -label @info.txt rose: -format '%l label' info:
magick -comment @info.txt rose: -format '%c set "' info:
magick rose: -set label @info.txt -format '%l caption' info:
magick rose: -set comment @info.txt -format '%c set "' info:
| ![[IM Text]](../static/img/text/file.txt.gif)
Perhatikan bahwa IM tidak mengembangkan satu pun rangkaian karakter escape yang dibacanya lewat escape baca file '@'. Ini penting: artinya kapan pun IM membaca teks dari file, ia tidak akan pernah menangani karakter khusus apa pun yang ada di file itu.
IM membaca file teks sebagai teks literal, tanpa escape apa pun
Sayangnya ini juga mencakup newline terakhir yang mungkin ada di file (atau stream) yang dibaca! Akibatnya bisa muncul satu baris 'kosong' ekstra pada gambar hasil, bila teks masukan berakhiran newline (praktik yang sangat umum). Contohnya... |
echo "Anthony" | magick label:@- label_stdin.gif
![[IM Output]](../static/img/text/label_stdin.gif)
Seperti terlihat, label itu bukan hanya memuat string masukan tetapi juga satu baris kosong ekstra akibat karakter newline yang ditambahkan perintah "echo" di ujung. Kalau newline terakhir itu tak diinginkan, Anda harus membuangnya sendiri. Ini bisa jadi perkara rumit, tergantung dari mana dan bagaimana teksnya bersumber atau dibuat, serta dari API apa IM dijalankan. Cara terbaik adalah berusaha tidak menghasilkan newline terakhir itu sejak awal. Misalnya dengan flag '-n' pada "echo". |
echo -n "Anthony" | magick label:@- label_stdin_2.gif
![[IM Output]](../static/img/text/label_stdin_2.gif)
Atau memakai sesuatu yang tidak menambahkan newline ekstra kecuali diminta khusus. |
printf "Anthony" | magick label:@- label_stdin_3.gif
![[IM Output]](../static/img/text/label_stdin_3.gif)
Atau newline terakhir itu bisa 'dibuang' dengan satu baris perl kecil yang lihai... |
echo "Anthony" | perl -0777 -pe 's/\n$//' |\
magick label:@- label_stdin_4.gif
![[IM Output]](../static/img/text/label_stdin_4.gif)
Di API lain, newline terakhir itu bisa dicari dulu sebelum teks disalurkan ke perintah IM lewat 'piped open'.
Escape opsi yang didefinisikan pengguna
Masalah besar lainnya: memakai informasi escape dari satu gambar di gambar lain, misalnya saat membuat gambar "label:" atau "caption:" terpisah. Ini masalah yang sangat sulit, dan solusi saat ini (untuk satu gambar) adalah membuat 'opsi pengguna' khusus yang dilekatkan pada gambar yang sedang diproses. 'Pengaturan' ini lalu bisa dirujuk oleh "label:", "caption:", atau "-annotate" sebagai rangkaian escape persen saat dibutuhkan. Sebagai contoh, di sini saya membuat gambar label yang sama sekali baru memakai informasi dari gambar rose bawaan. Gambar sumber informasi itu lalu dihapus, meski saya bisa saja menyambungkan label baru itu ke gambar aslinya. |
magick rose: \
-set option:roseinfo 'rose image\nsize = %w x %h\nwith %k colors' \
label:'%[roseinfo]' -delete 0 label_escape.gif
![[IM Output]](../static/img/text/label_escape.gif)
Ya, contoh di atas memang rumit, tetapi itu karena ada keterbatasan internal pustaka inti IM yang terlibat. Lihat mengakses data dari gambar lain untuk rinciannya.
Meng-escape escape
Jika string harus diumpankan sebagai argumen ke IM (terutama lewat panggilan API) tetapi IM tak boleh mengembangkan escape-nya, ketiga escape itu cukup di-'escape' dengan backslash tambahan '\'. Perhatikan bahwa '@' hanya perlu di-'escape' jika menjadi karakter pertama, dan demi kompatibilitas mundur, escape persen juga bisa di-escape dengan menggandakannya. Yakni, '%%' menghasilkan satu tanda persen. Contohnya... |
magick -background lightblue -fill blue -font Candice -pointsize 48 \
label:'\@ \\n \% 5%% ' label_escapes.gif
![[IM Output]](../static/img/text/label_escapes.gif)
| Sebelum IM versi 6.3.2, backslash tak bisa dipakai untuk meng-escape '@' di awal guna mematikan fungsi 'baca dari file'. Saat itu satu-satunya cara meng-escape '@' awal adalah membacanya dari file. Ini tidak praktis di API.
Berikut contoh 'meng-escape escape' serupa untuk "-annotate"... |
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '\@ \\n 5%%' annotate_escapes.gif
![[IM Output]](../static/img/text/annotate_escapes.gif)
Tentu saja, seperti sudah ditunjukkan, teks yang dibaca dari file (lewat escape '@') selalu diperlakukan sebagai literal, tanpa makna khusus apa pun. Ini menghindarkan kebutuhan prapemrosesan teks; hanya saja waspadai newline terakhir. |
echo -n '@ \n 5%' |\
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '@-' annotate_escapes_file.gif
![[IM Output]](../static/img/text/annotate_escapes_file.gif)
Dengan kata lain, saat membaca dari file tak perlu pusing meng-escape apa pun; cukup tulis persis teks yang ingin dipakai IM.
Escape pada versi IM yang lebih lama
Definisi di atas baru difinalkan pada IM versi 6.3.3. Sebelumnya escape kadang ditangani di sebagian opsi, kadang tidak, mengikuti permintaan, masalah, dan keluhan yang dikirim pengguna IM. Ini terutama terjadi pada escape persen di "label:" dan "caption:", yang untuk beberapa waktu dianggap 'tidak masuk akal'. Misalnya, apakah '%c' terlihat pada gambar label berikut sangat bergantung versi (setidaknya sebelum IM v6.3.3). |
magick -background lightblue -fill blue -font Candice -pointsize 48 \
label:'ab%cde' label_percent.gif
![[IM Output]](../static/img/text/label_percent.gif)
Apakah yang terlihat 'abde' (escape persen diterapkan) atau 'ab%cde' (persen tidak diterapkan) bergantung persis pada versi IM yang dipakai. | _Pada IM v6.2.4, escape persen dihapus dari "label:" dan "caption:" karena dianggap tidak masuk akal.
Namun escape itu kembali pada IM v6.3.2: konstruksi baru '%[fx:...], yang bisa merujuk gambar mana pun, membuat escape persen pada generator teks-ke-gambar berguna lagi. Lihat escape ekspresi FX._
Soal 'apa yang di-escape' ini juga bermasalah dalam penanganan escape dari file. Sebelum IM v6.3.3, contoh berikut akan menghasilkan dua baris, bukan satu. |
echo -n ' Love \n/ Hate ' |\
magick -background lightblue -fill blue -font Ravie -pointsize 18 \
label:@- label_escapes_file.gif
![[IM Output]](../static/img/text/label_escapes_file.gif)
Karena hasil penanganan escape sangat bervariasi antarversi pada IM yang lebih tua dari v6.3.3, saya sarankan skrip menguji sendiri penanganan escape-nya dan menyesuaikan diri bila hal itu penting bagi kebenaran kerja programnya. Kalau ada yang mau membuat pengujian otomatis untuk skrip IM, silakan berkontribusi. Atau kalau Anda menemukan pengujian semacam itu, beri tahu saya.
Pango - teks berformat dasar
Coder teks "pango:" (bekerja penuh sejak IM v6.7.6-3) bekerja mirip dengan coder Label dan Caption. Ia menyediakan bahasa pemformatan teks terbatas pada sistem yang terpasang "Pango". Di sistem Linux dan MacOSX pango standar; di Windows opsional. Berikut contoh sederhana tanpa pemformatan pango khusus... |
magick -background lightblue pango:"Anthony Thyssen" pango.gif
![[IM Output]](../static/img/text/pango.gif)
Namun perlu dicatat, sebagian atribut teks sebelumnya tidak akan bekerja dengan pango, pada dasarnya karena tuntutan pemformatan teksnya. Misalnya, warna "-background" bisa diatur, tetapi fill default, undercolor, maupun font tertentu tidak. Sebab atribut-atribut itu justru dipilih lewat Pango Markup Language (lihat di bawah). Disarankan memakai "-size" untuk menentukan batas lebar dan tinggi gambar keluaran; pango akan otomatis melipat kata (atau melipat karakter, untuk bahasa Tionghoa) teks masukan ke batas itu. |
magick -background lightblue -size 150 \
pango:"Anthony Thyssen is the main author of IM Examples" \
pango_size.gif
![[IM Output]](../static/img/text/pango_size.gif)
Bahkan Pango bisa diminta membuat teks rata kiri-kanan (justify) secara semestinya lewat Define "pango:justify"... |
magick -background lightblue -size 150 -define pango:justify=true \
pango:"Contributions to IM Examples are welcome via the IM Forum." \
pango_justify.gif
![[IM Output]](../static/img/text/pango_justify.gif)
Namun perhatikan bahwa meski teks bisa dibuat rata kiri-kanan, spasi dan newline tetap diperhitungkan oleh pemformat teks. Pango juga memahami TAB (tidak seperti label dan caption). |
printf "col1\tcol2\nabc\txyz\n123\t789" |\
magick -background lightblue pango:@- pango_tabs.gif
![[IM Output]](../static/img/text/pango_tabs.gif)
| Perhatikan bahwa meski perintah "printf" di atas bisa menghasilkan karakter tab lewat escape '\t', IM tidak memahami escape semacam itu. Namun IM memahami rangkaian escape '\n' dalam string.
Namun membuat kolom dengan TAB tidak berjalan terlalu baik karena 'tab-stop' tak mudah didefinisikan di luar API. Karena itu memakai TAB dengan cara ini tidak disarankan , kecuali sebagai indentasi baris dan paragraf .
Bahasa Pango Markup
Kekuatan sesungguhnya pango ada pada bahasa "Pango Markup", yang aktif secara default. Markup pango bisa dimatikan dengan "-define pango:markup=false", tetapi kalau begitu lebih baik pakai Caption saja. "Pango Markup" sangat mirip HTML: sekumpulan tag markup "<...>" disisipkan tersembunyi dalam teks dan dipakai untuk mengendalikan bagaimana teks diformat. Berikut beberapa panduan bahasa markup ini (tanpa pernak-pernik API-nya)
- Bahasa Pango Markup
- Bahasa markup atribut teks Pango (dari Gnome)
- Bahasa markup atribut teks Pango (dari GTK)
- Galeri skrip Pango (contoh)
Contohnya.. |
magick -background lightblue -gravity center -size 180x \
pango:"The <b>bold</b> and <i>beautiful</i>" \
pango_formatting.gif
![[IM Output]](../static/img/text/pango_formatting.gif)
Tag "<span ... >" adalah tag utama dalam markup pango. Ia memungkinkan pengendalian ukuran, warna, dan posisi persis dari teks yang dikandungnya. Contohnya..
magick -background lightblue \
pango:' Some <span size="49152" rise="-20480"
foreground="red" background="blue"
> Big Red on Blue </span> Text ' \
pango_span.gif
Perhatikan bahwa kebanyakan nilai numerik dikalikan faktor 1024, sehingga nilai "size="49152"" pada contoh di atas berarti pointsize teks 48 poin. Sementara rise negatif ("rise="-20480") berarti menurunkan posisi teks 20 poin (atau piksel pada 72dpi). Tetapi alih-alih menentukan pointsize untuk teks, saya juga bisa memakai label ukuran khusus seperti "size="x-large"". Lihat kode sumber contoh berikutnya. Hati-hati dengan tanda kutip di dalam tanda kutip di atas. Kutip di dalam tag memang wajib. Namun newline dan spasi ekstra di dalam tag tidak ikut memformat teks. Karena itu menyembunyikan newline ekstra di dalam tag markup, atau dalam komentar markup "<!-- ... -->", bisa sangat berguna. Sekali lagi lihat teks sumber contoh berikutnya. Sebagai contoh penutup kekuatan pemformatan pango, di sini saya memakainya untuk memformat file yang sudah disiapkan "pango_test.txt". File ini memuat sebagian besar tag markup pango umum yang kemungkinan akan Anda pakai. Bandingkan file markup ini dengan gambar hasilnya di bawah.
magick -gravity center pango:@pango_test.txt pango_test.png
Catatan dan masalah Pango
- Gravity
- Saya belum berhasil membuat pango memusatkan hanya satu baris teks tertentu. Lewat pengaturan "
-gravity" hanya bisa memusatkan semuanya, atau tidak sama sekali. Alasannya tampaknya karena pango dirancang untuk menghasilkan label teks terpisah bagi aplikasi. Yakni, judul biasanya dibuat terpisah dari badan utama teks yang ditampilkan. Pango tidak dimaksudkan sebagai mesin pemformatan halaman teks skala penuh. - Font
- Pango bisa berganti font di tengah proses render. Ia sudah melakukannya dengan mudah untuk teks tebal dan miring. Namun spesifikasi fontnya berasal dari GTK, sehingga memakai sistem yang berbeda dari ImageMagick pada umumnya. Info lebih lanjut tentang font di GTK bisa dilihat dengan menjalankan program "gtk-demo" lalu mengeklik ganda "Pickers" dan "Text Widget".
- Define
- Ada banyak Define khusus yang bisa dipakai untuk mengendalikan berbagai aspek pemformatan teks pango secara global. Saat ini daftarnya ada di format file pseudo, meski saya sendiri belum menjelajahi semuanya. Berikut yang pernah saya pakai...
-define pango:markup=false- Matikan tag bahasa markup. Semua tag lalu ikut tampil di keluaran. Pemformatan pango di dalam teks tidak dimungkinkan. Ini terutama berguna saat debugging, karena memperlihatkan persis apa yang dilihat pango sebagai masukannya.
-define pango:justify=true- Ratakan teks kiri-kanan selebar ukuran gambar. Yakni, tambahkan spasi antarkata ekstra sehingga tepi kiri dan kanan blok teks sama-sama lurus.
Informasi lebih lanjut tentang Pango
| Untuk melihat apa saja yang mungkin, lihat Galeri skrip Pango Jika Anda membuat sesuatu yang menarik dengan pango, silakan berkontribusi. Kirimi saya email (alamat di footer halaman), atau kirimkan ke forum diskusi IM. | Pada sistem yang terpasang pango, perintah "pango-view" juga bisa dipakai untuk membuat gambar berformat pango. Namun pengaturan 'density' alias 'dpi' defaultnya adalah layar Anda (IM memakai 72 dpi secara default) sehingga bisa berbeda antarhost. |
|---|---|
Text - halaman teks polos
Format masukan "text:" dirancang untuk menyulap teks polos menjadi gambar, satu gambar per halaman teks. Ia operator masukan 'teks berhalaman' milik ImageMagick. Dengan kata lain tujuannya menyulap file teks praformat yang lebih besar menjadi halaman-halaman, mirip cara printer mencetak teks polos ke lembar-lembar kertas terpisah. | _Jangan rancukan format masukan file "text:" dengan format masukan "txt:" yang mirip. Yang terakhir akan lebih dulu mencoba membaca file sebagai format gambar 'IM pixel enumeration'.
Bukan berarti file teks polos berekstensi ".txt" akan gagal. Nyatanya file semacam itu kemungkinan dikonversi sesuai harapan, karena format file "txt:" otomatis jatuh kembali ke format "text:" jika gambar enumerasi tidak dikenali.
_
Namun penanganan teks dengan cara ini punya sejumlah masalah. Pertama, teks digambar ke kanvas besar, menyisakan pekerjaan membuang ruang tak terpakai bila ruang itu tidak diinginkan. Berikutnya, baris tidak 'dilipat kata' melainkan meluap keluar kanvas dan terpotong bila terlalu panjang. Dan terakhir, untuk file teks yang sangat panjang, beberapa halaman (gambar) akan dihasilkan kecuali diambil langkah pencegahan ekstra. Di sisi lain, "text:" menangani hampir semua file teks, tanpa mengubah ukuran gambar akhir yang dihasilkan, maupun melipat baris yang sangat panjang. Anda juga tak perlu memproses dulu karakter khusus seperti bila teksnya dipakai di baris perintah. Terakhir dan lebih penting, jika font lebar-tetap (seperti Courier) dipakai, file dengan kolom-kolom data berjarak spasi akan tetap menampilkan datanya dalam kolom berjarak spasi. Pada dasarnya "text:" akan menyulap file masukan 'APA ADANYA'. | _Data teks masukan yang dibaca dari file pada dasarnya diteruskan langsung ke pustaka font untuk menggambar teks UTF. Akibatnya sebagian karakter kontrol bisa digambar dengan 'glyph' yang tak lazim. Termasuk karakter TAB dan FORMFEED, yang, saat tulisan ini dibuat, ditangani keliru oleh pustaka 'freetype'.
Jika ini jadi soal, file teks bisa diproses dulu dengan program filter seperti "expand", untuk menyulap karakter TAB menjadi sejumlah spasi yang sesuai._
Saat menggambar teks, halaman besar seukuran 'letter' dibuat (atau ukuran maupun jenis halaman yang ditentukan lewat "-page" )pada resolusi saat itu (diatur dengan "-density"). Secara default (pada 72 dpi) ukurannya '612x792' piksel, yang untuk kebanyakan keperluan sangat besar. Sebagai contoh, berikut konversi langsung manual berformat teks polos untuk perintah "magick" menjadi gambar (gambarnya besar; untuk melihatnya pilih gambar 'halaman' di kanan)... |
man magick | col -b | expand | \
magick -font CourierNew text:- -delete 1--1 text_manpage.gif
| _Konversi manual-ke-gambar di atas menghasilkan beberapa halaman (gambar), jadi saya menghapus halaman kedua dan seterusnya agar tersisa halaman pertama saja, alih-alih animasi GIF semua halaman.
Saya juga bisa menambahkan pengubah baca '[0]' pada nama file masukan, misalnya "text:-'[0]'", untuk menyuruh IM membaca hanya gambar pertama yang dihasilkan. Meski saat ini seluruh pemilihan halaman tetap ditangani dengan membuat semua halaman lalu menghapus halaman yang tak diinginkan._
Saya sengaja memakai font 'lebar-tetap' 'CourierNew' di atas demi mempertahankan pemformatan spasi karakter yang ada di halaman cetak. Perhatikan bedanya keluaran ini dengan keluaran caption: di atas. Tampilan keseluruhan gambar ini juga bisa diperbaiki dengan teknik yang sama seperti pada bagian Postscript berikutnya. Kalau hanya ingin tahu seberapa besar, misalnya, halaman 'A5' pada 100 dpi, perintah berikut membuat satu halaman kosong seukuran itu dan mengembalikan ukurannya dalam piksel. Nama file "/dev/null" adalah file UNIX khusus yang selalu kosong.
magick -page A5 -density 100 -units PixelsPerInch text:/dev/null \
-format 'Page Size at %x = %w x %h pixels' info:
Memangkas halaman teks
Karena teks 'digambar' ke kanvas besar, kemungkinan Anda ingin membuang semua ruang tak terpakai yang dihasilkan. Ini bisa dilakukan dengan operasi gambar "-trim", "+repage", lalu, agar tampak pantas, menambahkan lagi sedikit ruang tepi dengan "-border". Tentu warna "-background" yang dipakai juga harus disamakan dengan "-bordercolor" yang ditambahkan kembali. Terdengar rumit? Sebenarnya tidak; contohnya...
echo " Hello Cruel World " |\
magick -background lightblue -fill blue -pointsize 18 \
text:- -trim +repage -bordercolor lightblue -border 3 \
text_trimmed.gif
Pada contoh di atas "-trim" dipakai untuk membuang ruang putih ekstra yang sangat luas pada gambar halaman "text:". Namun ini juga membuang spasi awal di depan baris! Ada teknik menarik yang memungkinkan "-trim" memangkas gambar sampai seukuran teks yang benar-benar digambar ke halaman, termasuk spasi awal dan akhir pada masukan. Teknik ini memakai pengaturan "-undercolor" khusus (dibahas rinci nanti).
echo " Hello Cruel World " |\
magick -background white -undercolor lightblue -fill blue \
-pointsize 18 text:- -trim +repage \
-bordercolor white -border 3 text_boxed.gif
Ruang ekstra di bawah teks adalah akibat karakter 'newline' terakhir pada teks masukan, yang menciptakan satu baris kosong ekstra di gambar. Tetapi seperti terlihat, spasi awal dan akhir teks masukan dipertahankan. Jika warna latar belakang transparan dipakai pada contoh di atas, gambar hasil pangkasan bisa diratakan (flatten) untuk menyulap area yang tak tergambar menjadi warna yang sama dengan 'undercolor' yang dipakai.
echo " Hello Cruel World " |\
magick -background none -undercolor lightblue -fill blue \
-pointsize 18 text:- -trim +repage \
-bordercolor lightblue -border 3 \
-background lightblue -flatten text_box_trimmed.gif
Hasil di atas (kecuali "-border" yang ditambahkan) sebenarnya nyaris persis apa yang kini dihasilkan IM lewat "label:" yang membaca dari nama file ber-escape '@'. Namun "label:" melakukannya lebih cepat dan jauh lebih bersih (lewat pustaka "freetype" alih-alih konversi postscript). Ukuran "-page" yang lebih kecil bisa ditentukan, dalam piksel (lihat contoh berikutnya), atau dengan ukuran halaman media (seperti 'A5') lewat pengaturan "-density" alias resolusi piksel. Offset tempat mulai menggambar teks pada halaman, relatif terhadap pojok kiri atas, juga bisa ditentukan. Contohnya...
echo "This is a long line that shows that 'text:' does not word wrap." |\
magick -background lightblue -pointsize 18 \
-fill blue -page 320x95+50+10 text:-'[0]' +repage text_page.gif
| _Hampir semua operator pembuatan gambar lain memakai pengaturan "-page" untuk mengatur 'kanvas' virtual yang lebih besar dan 'offset' gambar pada kanvas itu, umumnya untuk keperluan pelapisan gambar atau pembuatan animasi. Karena itu sebaiknya pengaturan halaman direset dengan "+page" setelah operasi "text:" atau "ps:" apa pun; kalau tidak, hasil tak terduga bisa muncul pada gambar-gambar berikutnya yang dibaca di baris perintah yang sama.
Ini juga alasan saya menambahkan operator "+repage" pada contoh di atas; kalau tidak, teksnya tergeser, dan gambar yang dihasilkan pun ikut tergeser!
Untuk rincian pemakaian offset ini lihat atribut gambar halaman.
Perhatikan pada contoh terakhir, baris teks yang terlalu panjang untuk lebar halaman akan meluap keluar halaman, dan tidak 'dilipat'. Ini praktis memangkas dan membuang ujung baris-baris itu. Selain itu, jika barisnya terlalu banyak, "text:" akan menghasilkan _beberapa halaman dan dengan demikian beberapa gambar , satu untuk tiap halaman yang dihasilkan terjemahan postscript file teks itu. Jika hanya halaman teks pertama yang diminati, atau sekadar ingin menghindari kemungkinan banyak gambar, tambahkan '[0]' pada nama file "text:" untuk menyuruh IM membaca hanya halaman pertama yang dihasilkan setelah teks dikonversi menjadi gambar (lihat contoh sebelumnya).
Postscript/PDF - masukan teks dan grafik praformat (atau format gambar vektor lain)
Berikut ini teknik standar penanganan gambar vektor yang bisa dipakai bukan hanya untuk gambar "PS:" (postscript) tetapi semua gambar lain yang ditangani sebagai grafik vektor. Termasuk format gambar seperti: "PDF:" (portable document format), "TEXT:" (teks polos berhalaman), bahkan "SVG:" (scaled vector graphic) dan "WMF:". Metode ini bisa dikembangkan untuk memberi kendali sangat halus atas persis seperti apa teks akan tampil sebagai gambar. Misalnya, dengan filter 'teks ke postscript' yang tepat, Anda bisa mengendalikan pelipatan kata, perataan, penanganan banyak font, penebalan, border, judul, nama file, tanggal, dan pernak-pernik lain dalam gambar postscript. Namun karena bagian ini tentang teks-ke-gambar, artinya teks Anda perlu lebih dulu disulap menjadi file postscript berformat. Ada banyak program eksternal untuk itu. Misalnya "a2ps", "enscript", atau "pstext". Pada dasarnya Anda bisa memakai pengolah kata (seperti 'OpenOffice' atau 'Word', bahkan 'Notepad'), ATAU jika ingin sistem pemrosesan teks batch, 'TeX' dan 'LaTeX' bisa dipakai untuk membuat teks praformat (lihat Sistem pemrosesan teks lengkap di bawah). Program-program ini semuanya dirancang menangani rumitnya mencampur teks polos, tebal, beda ukuran, dan beda font, lengkap dengan kendali pelipatan kata, perataan, dan pemparagrafan. Keluaran program-program itu lalu bisa diserahkan ke IM untuk dikonversi menjadi gambar dengan ukuran dan kualitas yang diinginkan. Jadi mari kita buat dulu postscript-nya (mengonversi teks dari program fortune pribadi). |
mesgs LN-ManKzinWars | \
a2ps -q -1 --rows=10 --prologue=bold \
--center-title="Postscript via 'a2ps'" \
--header='' --left-footer='' --right-footer='' \
-o ps_version.ps
Sekarang kita bisa menyulapnya menjadi gambar, sambil memangkas hasilnya (seperti contoh "text:" di atas) untuk membuang area kosong berlebih dari halaman/kanvas default yang dihasilkan.
magick ps_version.ps'[0]' \
-trim +repage -bordercolor white -border 3 ps_version_raw.gif
Perhatikan pemakaian '[0]' untuk membatasi masukan ke halaman pertama saja. Jika gambar postscript menghasilkan banyak halaman, seluruhnya tetap diproses delegate "ghostscript", tetapi IM hanya membaca gambar pertama yang dikembalikan, alih-alih membuat banyak gambar, satu gambar per halaman. Jika postscript-nya sangat besar, Anda mungkin ingin memakai utilitas postscript lain untuk membatasi jumlah halaman sebelum memprosesnya dengan IM dan "ghostscript". Seperti terlihat, postscript yang dikonversi pada "-density" default 72 dpi sering tidak sebagus semestinya, dengan anti-aliasing yang minim. Ini terutama terasa pada font postscript, yang tidak dirancang bekerja di resolusi serendah itu. Untuk memperbaikinya, teknik super sampling bisa dipakai untuk menghasilkan gambar yang lebih baik. Dalam hal ini "ghostscript" diminta menggambar halaman pada resolusi (atau "-density" gambar) yang lebih tinggi. Lalu "-resample" (pengubahan ukuran khusus) dipakai untuk mengembalikan gambar besar itu ke densitas resolusi layar yang lebih 'normal'.
magick -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor white -border 3 ps_version.gif
Nilai '196' adalah 3 kali 72dpi akhir, artinya saat "-resample" dipakai, kira-kira 3×3 piksel dilebur menjadi tiap satu piksel. Ini menghasilkan piksel anti-aliasing yang lebih baik di sepanjang tepi teks, memperbaiki tampilan keseluruhan hasil. Perhatikan pula bahwa memakai densitas atau resolusi lebih besar tidak persis sama dengan sekadar memperbesar font. Definisi font bisa punya penyesuaian untuk menangani situasi resolusi rendah. Misalnya bandingkan lubang pada huruf 'e' di kedua gambar. Versi asli lebih tajam berkat penanganan khusus dalam fontnya, meski secara keseluruhan versi hasil super sampling lebih jernih. Untuk informasi lebih lanjut lihat Resolusi, pointsize, dan ukuran font sebenarnya di bawah. Nilai-nilai di atas tidak wajib; kadang nilai yang sedikit berbeda memberi hasil lebih baik atau lebih diinginkan. Tentu saja meminta "ghostscript" membuat gambar 2, 3, bahkan 4 kali lebih besar juga berarti IM butuh 4, 9, atau 16 kali lebih lama untuk membuat gambarnya! Memori dan ruang disk sementara yang dipakai pun sebanyak itu pula! Tetapi hasilnya umumnya sepadan. Cara terbaik adalah mencobanya langsung pada dokumen Anda sendiri dan melihat mana yang memberi hasil terbaik. Selain itu, jika butuh anti-aliasing lebih, alih-alih memakai resolusi masukan yang lebih besar lagi, Anda bisa mencoba mengaburkan gambar sebesar sub-piksel (misal '-blur 0x0.7') sebelum memperkecil ukurannya. Saya juga kadang mendapati bahwa sedikit saja penajaman (unsharp) setelah pengubahan ukuran (teknik photoshop yang umum) bisa memperbaiki hasil akhir keseluruhan.
magick -density 196 ps_version.ps'[0]' \
-blur 0x0.7 -resample 72 -unsharp 0x0.7 \
-trim +repage -bordercolor white -border 3 ps_unsharp.gif
Tetapi saya akan berhati-hati dengan penyesuaian-penyesuaian ini, karena bisa saja justru memperburuk keadaan.
Jika latar belakang transparan yang diinginkan alih-alih putih, pengaturan "-channel" bisa diberi nilai 'RGBA' agar kanal alpha ikut dalam gambar. Tentu formatnya harus format gambar yang bisa menangani warna semitransparan.
magick -channel RGBA -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor none -border 3 ps_transparent.png
Perhatikan bahwa banner tetap memakai warna putih pudar untuk latarnya, bukan ikut dibuat transparan atau semitransparan. Sebabnya, postscript yang dihasilkan memang menggambar latar itu, menggantikan latar belakang default halaman (entah putih entah transparan). Membuat latar belakang transparan seperti ini memungkinkan gambar postscript Anda ditumpangkan (overlay) di atas warna latar tertentu.
magick ps_transparent.png -background skyblue -flatten ps_bgnd_color.gif
Dengan metode komposisi alpha, ia bahkan bisa ditumpangkan ke gambar latar tertentu, atau latar yang di-tile.
magick composite -tile bg.gif ps_transparent.png -compose DstOver \
ps_bgnd_tiled.gif
Karena hampir semua printer postscript hanya bisa menggelapkan kertas atau transparansi overhead (termasuk printer warna), saat contoh di atas dicetak, banner otomatis menjadi semitransparan. Jika IM juga ingin disuruh melakukan hal yang sama seperti printer, komposisi alpha khusus 'Multiply' bisa dipakai untuk menumpangkan gambar 'berlatar putih' itu ke latar 'kertas' yang diinginkan.
magick composite -tile bg.gif ps_version.gif -compose Multiply ps_multiply.gif
Jika gambar postscript-nya berwarna, printer murni hitam-putih di atas kertas berwarna juga bisa disimulasikan dengan metode compose khusus 'BumpMap'. Metode ini mengubah gambar overlay sumber menjadi grayscale sebelum memakai multiply untuk mengomposisikan kedua gambar. Padanan grayscale dari slide transparansi overhead juga bisa dibuat. Pada dasarnya ini memakai gambar berlatar putih dan buram (dari atas) sebagai 'mask' untuk membuat gambar transparan berbentuk memakai operator alpha shape
magick ps_version.gif -negate -background black -alpha shape ps_overhead.png
Seperti pengonversi "text:" di atas, pengonversi "ps:" juga memakai pengaturan "-page" untuk mengatur ukuran kanvas 'media' gambar tempat halaman digambar. Meski offset yang diberikan akan diabaikan. Namun karena kebanyakan file postscript mendefinisikan sendiri ukuran media gambarnya secara internal, ini biasanya tidak perlu. | _Kebanyakan operator pembuatan gambar lain memakai pengaturan "-page" untuk mengatur 'kanvas virtual' dan offset pada kanvas virtual itu (misalnya untuk membuat animasi GIF). Karena itu sebaiknya ia direset dengan "+page" setelah dipakai untuk operasi baca gambar "text:" atau "ps:"; kalau tidak, hasil tak terduga bisa muncul pada gambar-gambar berikutnya.
Untuk rincian pemakaian offset ini lihat atribut gambar halaman._
Sebagai contoh praktis penutup, lihat gambar tetrahedron hasil ray tracing saya. Gambar serupa lain bisa dilihat di Studies into Polyhedra. Halaman latarnya dibuat dari data yang sama dengan yang dipakai menghasilkan objek matematis 3D yang ditampilkan. Data teksnya dikonversi dengan "a2ps", lalu IM dipakai untuk menyulapnya menjadi gambar. Ke gambar ini ditambahkan gambar-gambar garis lain, yang sudah disiapkan, dari objek matematis yang sama. Gambar akhir ini (disimpan dalam format 'targa' alias TGA) lalu diserahkan ke ray-tracer "PovRay" untuk disertakan dalam gambar akhir atau adegan hasil ray tracing.
Memakai GhostScript secara langsung
Meski ini tidak persis urusan IM, Richard Bollinger melaporkan bahwa menjalankan delegate "ghostscript" secara langsung jauh lebih efisien, menghasilkan pemrosesan satu orde besaran lebih cepat karena penanganan file oleh IM berkurang. Misalnya, alih-alih menjalankan...
magick -density 300x300 -compress Group4 file.ps file.tif
GhostScript bisa disuruh melakukannya langsung.
gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \
-sOutputFile=file.tif file.ps
Ini meniadakan kebutuhan IM membuat file sementara yang besar (demi keamanan dan penanganan gambar ber-pipeline). Hasilnya, pemakaian GhostScript langsung menghemat banyak penanganan file dan pemrosesan IO, dan bisa memberi lonjakan kinerja besar saat memproses file postscript dan PDF. Namun "ghostscript" tidak bisa mengubah ukuran gambar (selain menyetel densitas atau resolusi keluaran) dan kemungkinan tak bisa mengeluarkan gambar dalam format file yang Anda butuhkan, atau pada kualitas yang diinginkan. Tetapi keluaran GhostScript selalu bisa diumpankan ke ImageMagick untuk menuntaskan tugasnya. Terutama bila hasilnya ingin di-super-sample (masukan resolusi tinggi, keluaran diperkecil). GhostScript bisa jadi program yang sulit dipahami cara pakainya, atau sulit dibereskan untuk jenis postscript tertentu. Cristy terus bergulat dengan isu-isu ini demi para pengguna IM, dan di sini upayanya luar biasa. Sayangnya, dengan banyaknya hal yang bisa (dan memang) terjadi, IM tidak dapat menyediakan metode yang disederhanakan untuk postscript/PDF via GhostScript.
Draw - menggambar teks pada kanvas yang ada
Dengan memakai operator tingkat rendah "-draw" untuk menggambar font, kita mendapat kendali jauh lebih banyak, terutama atas posisi persis font dan ukuran gambar tempat ia digambar.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -draw "text 25,65 'Anthony'" text_draw.gif
Namun untuk memakainya kita perlu membuat gambar latar berukuran pas tempat font digambar, yang bisa merepotkan bila teksnya belum diketahui. Lihat pengukuran otomatis gambar font untuk cara mengatasi masalah ini. Banyak opsi ekstra, di luar opsi teks standar, juga memengaruhi bagaimana "-draw" benar-benar menggambar teks pada gambar. Bukan hanya warna "-fill" yang bisa ditentukan, tetapi juga "-undercolor", serta warna tepi alias "-stroke", yang keduanya mati secara default (diatur ke warna 'none'. Warna "-fill" juga bisa diganti pola gambar "-tile", sementara lebar tepi stroke bisa diubah dengan "-strokewidth". Lalu posisi relatif teks yang digambar bisa diubah dengan pengaturan "-gravity". Sebagai contoh, di sini saya memakai banyak fitur ekstra yang barusan disebut.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \
-gravity center -draw "text 0,0 'Anthony'" text_options.gif
| _Sejak IM versi 6.2.4, operasi "-draw text" tidak lagi memahami '\n' sebagai newline, maupun escape informasi gambar persen '%'. (Lihat bug menggambar persen).
Kemampuan-kemampuan itu, berikut masalahnya, tetap tersedia pada operator baru IM v6 "-annotate". Lihat operator penggambaran teks annotate di bawah._
Semua opsi di atas juga bisa dipakai di dalam string "-draw" (MVG - Magick Vector Graphic). Namun jika opsi tadi diatur di dalam argumen draw, opsi itu hanya berlaku untuk string MVG draw tersebut. Lebih dari itu, format MVG draw bisa jauh lebih banyak lagi, misalnya rotasi teks dan 'dekorasi' font, dan tentu berbagai bentuk seperti lingkaran juga bisa digambar ke gambar. Sebagai contoh, di sini kita menggambar teks bergaris bawah dan diputar, ditumpangkan di atas dua lingkaran latar.
magick -size 320x120 xc:lightblue \
-draw "fill tomato circle 250,30 310,30 \
fill limegreen circle 55,75 15,80 \
font Candice font-size 72 decorate UnderLine \
fill dodgerblue stroke navy stroke-width 2 \
translate 10,110 rotate -15 text 0,0 ' Anthony '" \
draw_mvg.gif
Jika benar-benar ingin memaksimalkan "-draw" untuk membuat gambar, saya sarankan melihat halaman contoh menggambar.
Kotak undercolor
Pengaturan warna "-undercolor", seperti diperagakan di atas dan nanti di bawah, mewarnai area gambar terdefinisi untuk karakter dan font itu. Umumnya area ini pas dengan karakter yang digambar. Terutama pada tepi kiri dan kanan font yang digambar, karena tepi atas dan bawah biasanya cukup besar menampung semua karakter. Area gambar pada dasarnya mewakili batas 'sel' karakter yang melingkupi area tempat font digambar. Kegunaan utama opsi "-undercolor" adalah sebagai cara sederhana dan cepat membersihkan latar 'ramai' di sekeliling teks. Misalnya lihat menganotasi di atas gambar. Namun dalam kasus itu disarankan juga menambahkan karakter spasi ekstra di awal dan akhir string yang digambar.
Luapan bounding box
Salah satu masalah terbesar yang mungkin Anda jumpai saat menggambar teks, atau menangani font pada umumnya, adalah tidak semua font menaati aturan normal. Perancang font bebas 'menggambar' tiap karakter (atau 'glyph') di mana pun relatif terhadap posisi teks saat itu (dikenal sebagai caret). Posisi font bahkan tak harus maju, dan pada sebagian font internasional malah bisa mundur!. Akibat kebebasan desain ini, sebagian 'glyph' tidak muat di dalam area gambar terdefinisi yang menurut deklarasi font memuat karakter itu, terutama pada font miring atau bergaya tulisan tangan yang sebagian hurufnya menjulur jauh keluar batas ke area yang dipakai karakter berikutnya (atau sebelumnya). Font terburuk yang pernah saya lihat dalam hal ini adalah 'LokiCola', yang menggambar sekitar separuh huruf kapitalnya dengan ekor panjang bergelombang, jauh melampaui batas sel karakter masing-masing. Font ini pada dasarnya berasumsi tiap huruf kapital akan diikuti 3 huruf kecil atau lebih. Untuk menunjukkannya, saya akan menggambar beberapa huruf kapital font itu secara terpisah, sehingga terlihat seberapa jauh huruf bisa menjulur melampaui 'undercolor' sel alias batas gambarnya. Saya juga memakai dua di antaranya untuk merangkai nama font itu, supaya terlihat persis sebagaimana mereka dirancang untuk dipakai, dan mengapa mereka meluap keluar bounding box-nya.
magick -size 500x200 xc:lightblue \
-font LokiCola -pointsize 72 -undercolor dodgerblue \
-draw "text 15,65 'L'" -draw "text 130,65 'C'" \
-draw "text 245,65 '1'" -draw "text 360,65 'H'" \
-gravity South -draw "text 0,10 'Loki Cola'" draw_undercolor.gif
Annotate - operator penggambaran teks
Bersama IM versi 6, operator penggambaran font baru "-annotate" tersedia. Operator ini dalam banyak hal jauh lebih sederhana daripada operasi "-draw text", tetapi karena memakai API (Application Program Interface) 'annotate()', ia juga lebih perkasa. Meski operator ini memang memakai primitif "-draw", ia melakukannya dengan cara lebih kompleks, misalnya mengembangkan karakter escape khusus untuk menambah informasi gambar ekstra bahkan beberapa baris, serta menerapkan transformasi sistem koordinat pada teks yang digambar untuk menghasilkan kemiringan dan rotasi. Karena itu operator ini kini menjadi operator penggambaran teks pilihan untuk semua penggambaran teks dan anotasi gambar ImageMagick, dan itu kini tercermin di halaman-halaman contoh ini. Berikut contoh dasar pemakaian operator ini.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -annotate +25+70 'Anthony' annotate.gif
Salah satu fitur ekstra operator "-annotate" adalah kemampuannya memutar sumbu X dan Y teks yang digambar sepenuhnya terpisah satu sama lain. Caranya dengan memberikan sudut rotasi tiap sumbu sebagai 'ukuran gambar' pada argumen operator. Sekadar menunjukkan betapa kompleksnya satu operasi "-annotate", berikut gambar yang diberi kotak, stroke, dan kemiringan...
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \
-annotate 0x20+20+67 'Anthony' annotate_opts.gif
Pada contoh ini keempat argumen annotate diberikan: rotasi sumbu X, rotasi sumbu Y, dan posisi X dan Y font pada gambar latar. Perhatikan pula bahwa pola fill (diatur dengan "-tile") ikut miring bersama fontnya. Sebabnya, ia digambar memakai sistem koordinat yang digeser/diputar, yang ikut menggeser pola fill yang di-tile di dalam teks yang digambar. Contoh lain kemampuan penggeseran ini adalah contoh font bayangan tergeser. Bandingkan dengan font miring yang dibuat dengan string MVG "-draw" yang setara. Untuk tabel ringkasan efek operasi penggeseran "-annotate", lihat pemakaian argumen annotate. Sebagai contoh, berikut teks yang sedikit diputar...
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-annotate 350x350+20+90 'Anthony' annotate_rotated.gif
| Perhatikan bahwa sudut yang diberikan ke "-annotate" harus positif agar IM memahaminya dengan benar). Pengecualiannya bila bentuk 4 angka berpisah koma dari argumen geometry dipakai. Misalnya "-annotate '-10,-10,20,90' 'Anthony'" bisa saja dipakai pada contoh terakhir.
Ini bisa dipakai membuat pelabelan miring yang rapat. Contohnya... |
magick -size 100x60 xc:skyblue \
-annotate 300x300+20+50 "First" \
-annotate 300x300+35+50 "Second" \
-annotate 300x300+50+50 "Third" \
-annotate 300x300+65+50 "Fourth" \
-annotate 300x300+80+50 "Fifth" \
annotated_labels.jpg
![[IM Output]](../static/img/text/annotated_labels.jpg)
Informasi lain tentang gambar saat itu juga bisa ditambahkan ke string annotate lewat karakter escape. Misalnya, mari kita timpa gambar bawaan "rose:" dengan informasi tentang ukuran gambarnya. Untuk memusatkan teks pada gambar kita pakai pengaturan "-gravity", dan matikan semua rotasi maupun offset dengan memberi argumen "-annotate" nilai '0'. |
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '%wx%h\nPixels' annotate_rose.gif
![[IM Output]](../static/img/text/annotate_rose.gif)
Untuk informasi lebih lanjut lihat Karakter escape khusus dalam argumen teks di bawah. Untuk contoh lain menganotasi teks ke gambar yang lebih besar dengan berbagai cara (misalnya terpusat di sisi, atau diputar di pojok kanan bawah) lihat contoh praktis anotasi teks.
Kanvas teks annotate berukuran otomatis
Sering kali dibutuhkan kendali jauh lebih banyak daripada yang bisa diberikan "label:". Misalnya Anda ingin memakai gambar tile atau gradien, yang mengharuskan teksnya di-annotate. Sayangnya Anda lalu perlu tahu lebih dulu ukuran kanvas yang dibutuhkan untuk teks annotate itu. Berikut contoh khas masalahnya. Saat pertama menyiapkan perintah ini saya mengatur ukurannya sesuai hasil yang saya mau, dan awalnya bekerja cukup baik. Tetapi kemudian saya mendapat ini...
magick -size 480x80 gradient:yellow-green \
-font ArialBkI -pointsize 70 -tile gradient:blue-red \
-annotate +10+65 'Gradient Fun' funfont_gradients.jpg
Sialnya, saat menerka ukuran kanvas itu saya salah mengeja kata 'Gradient' di atas (huruf 'i'-nya hilang). Tentu begitu ejaannya saya betulkan, ukuran gambar saya jadi keliru, menghasilkan keluaran salah seperti ditunjukkan di atas. Yang kita butuhkan: bisa memakai operator "-annotate", tetapi dengan kanvas berukuran pas dengan teks annotate-nya. Satu solusi adalah memakai kanvas jauh lebih besar, lalu "Trim" latarnya ke ukuran yang benar. Saya juga menambahkan "Border" untuk memberi sedikit ruang ekstra antara font dan tepi akhir gambar, agar tampak lebih baik.
magick -size 800x120 xc:black -font Corsiva -pointsize 100 \
-tile tile_disks.jpg -annotate +20+80 'Psychedelic!' \
-trim +repage -bordercolor black -border 10 funfont_groovy.jpg
Metode ini jauh lebih baik daripada menerka-nerka seberapa besar gambar akhir semestinya; namun "Canvas Trim" tidak akan memangkas latar berwarna-warni yang di-tile. Solusi yang lebih baik adalah membuat kanvasnya dengan "label:", untuk menghasilkan kanvas berukuran tepat. Isian warna draw lalu dipakai untuk men-tile sebuah gambar ke atas kanvas (dan teks labelnya), dan terakhir kita annotate teks kita dengan gambar tile yang lain.
magick -font Ravie -pointsize 72 label:'Get Wet!' -border 10 \
-tile tile_aqua.jpg -draw "color 0,0 reset" \
-tile tile_water.jpg -gravity center -annotate +0+0 'Get Wet!' \
autosize_wet.jpg
| Perhatikan bahwa posisi teks pada gambar "label:" terpusat mungkin tidak persis sama dengan posisi operasi "-annotate" terpusat. Kedua metode mengikuti algoritme pemrosesan yang sama sekali berbeda sehingga bisa tidak cocok, terutama bila font yang tak lazim terlibat.
Ukuran otomatis memakai 'kotak undercolor'
Alih-alih memakai gambar "label:", font bisa digambar pada kanvas besar memakai kotak undercolor dan strokewidth besar, sebelum kanvasnya dipangkas agar pas. Contohnya
magick -size 500x100 xc:lightblue -font SheerBeauty -pointsize 72 \
-gravity center -undercolor white -stroke none -strokewidth 3 \
-annotate +0+0 ' Invitation ' -trim +repage -shave 1x1 \
invitation_box.jpg
Banyaknya ruang di sekitar font bisa diatur lewat pengaturan "-strokewidth". Satu-satunya syarat penting: kanvas awal berwarna beda dari warna latar ('lightblue' dalam kasus ini) dan lebih besar dari hasil akhir. Sekadar peringatan, sebagian font menggambar karakter jauh di luar area gambar karakter masing-masing. (Misalnya lihat kotak undercolor di atas). Dalam kasus itu hasil di atas tetap bekerja, tetapi mungkin mengharuskan pemakaian kanvas transparan, lalu menumpangkan hasilnya di atas putih (misalnya dengan operasi seperti "-background white -flatten") untuk menyulap area tak terpakai yang masih transparan menjadi putih. Namun karakter itu kemungkinan akan menyentuh tepi gambar hasil. Pada dasarnya tak semua situasi bisa dimenangkan, jadi berusahalah sebaik mungkin.
Mewarnai gambar teks grayscale
Saya sengaja membuat gambar di atas sebagai gambar grayscale hitam-putih, karena bisa dipakai sebagai templat masking. Dari gambar murni seperti ini, latar belakang dan latar depan gambar bisa diwarnai terpisah maupun sekaligus. Di sini misalnya saya memakai operator level berdasarkan warna, "+level-color", untuk mengubah warna gambar secara global sehingga warna latar depan dan latar belakang diberi nilai tertentu.
magick invitation_box.jpg -colorspace sRGB \
+level-colors navy,lightblue invitation_colored.jpg
Sebagai contoh, di sini saya memakai masking komposit untuk mengganti latar belakang dan latar depan dengan gambar pola.
magick invitation_box.jpg -colorspace sRGB \
\( +clone -size 300x150 -tile gradient:LightYellow \
-draw "color 0,0 reset" \) \
\( +clone -size 300x150 -tile plasma:tomato \
-draw "color 0,0 reset" \) \
-reverse -composite invitation_rose.jpg
Operator reverse di atas dipakai untuk menyusun ulang gambar-gambar, sehingga gambar pertama menjadi gambar 'masking' ketiga dalam komposisi. Gambar latar depan ("plasma:") lalu jadi yang pertama, dan latar belakang di tengah. Untuk teknik lain mewarnai gambar grayscale seperti ini, lihat memakai mask untuk membatasi area komposisi. Lebih umum lihat memakai mask dengan gambar. Untuk metode lain membuat gradien untuk tiling lihat gradien warna, titik-titik warna jarang, dan kanvas acak.
Font
Sedang dikerjakan
Soal pengurutan path font, itu sekadar urutan font yang ditentukan di
file-file XML.
Titik awalnya adalah font sistem, disusul file "type.xml" yang terpasang
di sistem; di sistem saya, itu "/etc/ImageMagick-6/type.xml".
File "type.xml" bawaan sistem ini biasanya cuma daftar 'include' ke
file-file type-* lain. Dan urutan include itulah yang menentukan urutan
Font Sistem Ekstra versus Font Ghostscript.
Setelah file itu, file "type.xml" lain ikut dicari, misalnya di direktori
'home', bahkan direktori saat ini.
Font yang belakangan TIDAK menggantikan font yang lebih dulu; jadi bila dua
font bernama sama, hanya yang pertama yang dicatat IM. (langkah keamanan).
Untuk melihat font yang termuat, pakai
magick -list font
Perintah itu mencantumkan "Path:" file type tempat tiap daftar font ditemukan,
tetapi path-nya tercantum dalam urutan TERBALIK, dengan font sistem di akhir.
Saya misalnya punya Font pribadi bernama "Courier", tetapi ia tidak muncul
di daftar di atas karena didefinisikan setelah "Courier" yang ditemukan di
area "Font Sistem" (yang tercantum di ujung keluaran di atas).
Di sisi lain font pribadi saya "CourierNew" muncul, karena tidak bentrok
dengan font mana pun yang didefinisikan sistem atau konfigurasi sistem.
Untuk melihat file glyph font mana yang terpilih untuk permintaan tertentu,
pakai...
magick -debug annotate xc: -font Courier \
-annotate 0 'Test' null: 2>&1 |
grep '^ *Font '
Menentukan metrik font, tanpa memakai API
Sebuah font beserta tiap karakternya memuat banyak informasi. Informasi itu bisa sangat berguna, terutama jika IM ingin dipakai merangkai teks dari banyak font berbeda. Penting juga diingat bahwa kebanyakan font adalah font proporsional: tiap karakter punya lebar berbeda dan laju maju caret (atau titik asal) 'alami' yang berbeda. Karena itu tiap 'string' karakter tertentu akan dirender (digambar) dengan panjang berbeda tanpa benar-benar memedulikan jumlah karakter dalam string itu. Pengecualiannya adalah font 'lebar-tetap', seperti font "Courier", "Typewriter", atau "Terminal", yang semua karakternya sama lebar, sehingga kolom-kolom teks mudah dibuat. Pengaturan debugging "-debug annotate" bisa dipakai agar IM langsung melaporkan metrik font TTF untuk string tertentu. Contohnya...
magick -debug annotate xc: -font Candice -pointsize 24 \
-annotate 0 'Test' null: 2>&1 |\
grep Metrics: | fmt -w80
| Seperti terlihat, Anda mendapat aneka informasi yang bisa dipakai: dari batas terdeklarasi string yang digambar (yang belum tentu batas string sebenarnya), relatif terhadap titik asal; sampai seberapa jauh 'caret' (titik asal) harus maju sebelum menggambar string berikutnya. Keluaran debug lengkap (yang cukup panjang, dan tidak ditampilkan di atas) juga melaporkan file font yang benar-benar dipakai (dua kali), jadi bisa sekalian dipakai memeriksa bahwa fontnya sudah benar. | Metode "-debug annotate" ditambahkan pada IM v6.3.9-2 |
|---|---|
Teknik yang lebih lama
Namun keluaran debug ini bisa jadi tidak praktis, atau Anda harus menangani IM yang lebih tua dari versi tersebut. Berikut contoh-contoh yang lebih lama: teksnya benar-benar digambar dengan berbagai cara dan warna, lalu informasi (berupa bilangan bulat) diekstrak dari gambar hasil. Misalnya mari kita cari dimensi font 'Ravie' relatif terhadap baseline tetap, pada 72 poin. Berikut gambar yang akan kita telaah, sebagai rujukan. Gambar ini sebenarnya tak perlu digambar dan disimpan, karena kita hanya mengekstrak data, bukan gambar. Warna gambar ini akan diubah-ubah supaya bagian putih dan hitamnya bisa kita amati terpisah memakai "-trim" untuk mengekstrak metrik yang dipakai. |
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill black -undercolor white -annotate +20+100 'A' font_drawn.gif
![[IM Output]](../static/img/text/font_drawn.gif)
Untuk metrik font paling dasar, mula-mula kita gambar fontnya sendiri dengan warna transparan ('None'), supaya kita bisa mengukur dan menemukan ukuran serta lokasi bounding box alias area gambar karakter tertentu ini, untuk font ini. Perhatikan bahwa untuk informasi tinggi, apa pun boleh digambar.
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill none -undercolor white -annotate +20+100 'A' -trim info:
Dari hasil di atas kita bisa lihat font 'Ravie' pada 72 poin punya tinggi bounding box total 74 piksel. Bagian atas kotak berjarak 42 piksel dari bagian atas gambar; karena baseline diletakkan pada koordinat y 100 piksel, kotak dimulai 100 - 42 atau 58 piksel di atas baseline. Tersisa 74 - 58 atau 16 piksel bounding box di bawah baseline untuk descender. |
Perhatikan, tidak semua font membatasi gambarnya di dalam bounding box gambar yang mereka definisikan! Sebagian huruf bisa menjulur jauh keluar batas itu. Itulah sebabnya contoh di atas mengatur warna "-fill" ke 'none'. Dengan begitu font yang berkelakuan buruk tidak akan memengaruhi pengukuran di atas. |
|---|---|
Perhatikan pula bahwa jarak antarbaris (tepatnya antar-baseline) semestinya murni ditentukan pointsize font, dan tak ada hubungannya dengan bagaimana font digambar. Pada contoh kita, karena fontnya berukuran 72 poin, dan satu poin didefinisikan 1/72 inci, baseline-baseline itu semestinya berjarak 1 inci. Dengan resolusi keluaran (densitas) saat ini 72 piksel per inci, berarti baseline berjarak 72 piksel. Menariknya, itu berarti untuk font ini, dengan bounding box 74 piksel, area gambar font ini bertindihan dua piksel di antara baris-baris teks berspasi tunggal yang benar! Dari pengukuran di atas juga terlihat bahwa saat menggambar string "A" dengan font ini pada pointsize ini, karakter berikutnya semestinya digambar 66 piksel di kanan titik awal (dikenal sebagai caret). Inilah panjang 'logis' string itu. Yakni, 'caret' alias titik awal karakter berikutnya semestinya mulai di 20 + 66, atau di '+86+100' (baseline tidak berubah secara vertikal). Hati-hati: sebagian font Arab justru menggambar dari kanan ke kiri, sehingga offset 'caret'-nya negatif. Itu memberi kita metrik font untuk karakter 'A'; tetapi bagaimana dengan dimensi fisik 'A' yang tergambar relatif terhadap 'caret' alias titik awal? Cukup tukar kedua pengaturan warnanya... |
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill black -undercolor none -annotate +20+100 'A' -trim info:
| Dari sisi tinggi, karakter itu berada dalam batas gambar yang didefinisikannya: tingginya membentang dari 100 - 43 atau 57 piksel di atas baseline (rapat pada bounding box-nya) sampai 60 - 57 atau hanya 3 piksel di bawah baseline font. Dengan kata lain huruf ini tidak punya 'descender' yang digambar di area bawah baseline. Dari sini terlihat bahwa 'A' menggambar mulai 3 piksel sebelum caret (diposisikan di +20, tetapi gambar akhir ada di +17), sampai 70 - 3 atau 67 piksel setelah posisi caret. Dengan kata lain font ini sedikit lebih lebar dari bounding box horizontalnya saat digambar. Perhatikan bahwa meski ini memberi panjang string tergambar yang sebenarnya, itu berbeda dari offset caret yang dibutuhkan saat menyambung teks (yang ditentukan bounding box string, bukan panjang gambarnya). Dengan kata lain teks semestinya disambung memakai bounding box-nya, bukan panjang gambar sebenarnya seperti yang kita lakukan di contoh-contoh lain. Tentu bila bertemu font yang sangat berkelakuan buruk, ada baiknya memeriksa seberapa jauh string tertentu menggambar melampaui batasnya, supaya ruangnya tetap bisa disediakan, misalnya di ujung baris. | Dimensi yang diekstrak dari font juga berubah mengikuti "-strokewidth" yang sedang dipakai untuk menggambar font. Jika ukuran stroke garis luar diperbesar, dimensi (dan ukuran bounding box) yang dibutuhkan untuk menggambar font ikut membesar sebanyak itu untuk menampung garis luar yang lebih tebal. |
|---|---|
| Dimensi juga bervariasi menurut sistem operasi (jenis dan versinya) serta versi pustaka penggambaran font delegate yang dipakai IM pada sistem itu, bahkan ketika pustaka font dan versi IM-nya persis sama dan tidak berubah. Berhati-hatilah bila komputer yang berbeda bisa dipakai untuk menggambar teks, karena hasil bisa berbeda bahkan untuk font yang sama. | |
| --- | --- |
| Untuk informasi lebih lanjut lihat dokumen TrueType Fundamentals (PDF). Dokumen itu menunjukkan bahwa bahkan generalisasi saya di atas tidak selalu berlaku, meski umumnya demikian. Perhatikan bahwa contoh-contoh di atas hanya mengembalikan dimensi dalam piksel bulat, padahal semua dimensi yang dipakai font adalah bilangan pecahan. Bahkan apakah font digambar dari titik awal (caret) piksel bulat pun bisa bergantung aplikasi, dan memengaruhi tampilan akhir font. |
Membuat baris dengan gaya font campuran
Membuat satu baris dengan beberapa font, pointsize, dan gaya bukanlah hal yang benar-benar dirancang untuk dilakukan IM. Makin parah bila mulai memikirkan hal seperti perataan teks, pelipatan kata, dan pembungkusan di sekeliling gambar dan lain-lain. Ini jenis pekerjaan yang dilakukan sangat baik oleh program seperti pengolah kata, peramban web, dan pencetak dokumen, biasanya di bawah interaksi pengguna, tetapi sedikit yang bisa melakukannya sebaik itu di bawah kendali program. Satu pengecualian adalah "TeX" dan keluarga programnya (lihat Sistem pemrosesan teks lengkap di bawah); jadi jika Anda serius memproses teks secara grafis, saya sarankan menengok keluarga program ini. Alternatif lain: lihat berbagai program pencetak 'cantik' dokumen seperti konverter HTML. Program-program ini bisa dipakai menyulap dokumen buatan program menjadi postscript, yang lalu dengan senang hati dipascaproses IM menjadi format atau gaya gambar apa pun yang Anda mau. Solusi API (memakai antarmuka C MagickWand API) telah dibuat "El Supremo" (dari forum diskusi IM) dalam programnya FontMetrics. dan ini contoh keluaran "FontMetrics".
Nah, meski baris perintah IM tidak dirancang untuk 'pengolahan kata', bukan berarti tak bisa dipakai untuk itu. Hanya lebih sulit. Di sini saya akan memberi beberapa contoh mencampur teks berbeda font dan gaya, sebagai titik awal. Solusi paling sederhana yang biasanya terpikir adalah sekadar menyambung gambar-gambar "label:"...
magick -font LokiCola -pointsize 36 label:'LokiCola ' \
-font Candice -pointsize 24 label:'Candice ' \
-font SheerBeauty -pointsize 48 label:'SheerBeauty' \
+append wp_label_append.jpg
Namun seperti terlihat, semua gambar terjajar vertikal ke bagian atas gambar, dan kecuali font-font yang mirip yang dipakai, hasilnya tidak akan terlalu bagus. Sebagai alternatif, trik perataan append bisa dipakai untuk menjajarkannya di sepanjang dasar.
magick -size 1x50 xc:none +size \
\( -background white -font LokiCola -pointsize 36 \
label:'LokiCola ' \
-clone 0 +swap -background none -append \) \
\( -background white -font Candice -pointsize 24 \
label:'Candice ' \
-clone 0 +swap -background none -append \) \
\( -background white -font SheerBeauty -pointsize 48 \
label:'SheerBeauty' \
-clone 0 +swap -background none -append \) \
-delete 0 -gravity South -crop 0x50+0+0 +append \
-bordercolor none -border 1 -trim +repage \
-background white -flatten wp_label_bottom.jpg
Yang dilakukan di sini: menambahkan pelapik ekstra di bagian atas tiap label, lalu memangkas semuanya ke tinggi yang sama sebelum disambung horizontal. Setelah itu "-trim" sederhana dan "-flatten" dipakai untuk mengatur tinggi baris ke label tertinggi dan mengisi latarnya. Seperti terlihat hasilnya lebih baik, tetapi font kecil cenderung tampak seperti subskrip, alih-alih teks yang terjajar semestinya. Yang benar-benar kita butuhkan adalah menjajarkan semua string teks pada 'baseline'-nya, dan itu sangat sulit tanpa akses ke informasi teks lebih banyak. Informasi ini mudah didapat lewat API program, tetapi jauh lebih sulit dari baris perintah. Satu metodenya ditunjukkan di bagian contoh sebelumnya. Namun mungkin saja menjajarkan kata-kata pada baseline-nya tanpa benar-benar mengumpulkan informasi baseline. Meski gambar teks "label:" tidak memberi petunjuk apa pun tentang baseline gambarnya, Anda bisa dengan sengaja menggambar gambar pada baseline tetap. Tanpa API Anda juga tak bisa langsung tahu seberapa panjang atau tinggi teks yang digambar, jadi mula-mula perlu kanvas yang cukup besar untuk memastikan tak ada informasi gambar teks yang hilang. Lalu untuk mempertahankan spasi akhir dan tinggi teks, Anda juga harus memanfaatkan fitur ("-undercolor") yang tersedia pada anotasi teks dan menyediakan batas untuk pemangkasan gambar. Jadi mari kita lihat bagaimana melakukannya dari baris perintah.
magick -size 500x100 xc:none -fill blue -draw 'line 15,0 15,99' \
-undercolor white -fill black \
\( -clone 0 -font LokiCola -pointsize 36 \
-annotate +5+60 'Loki Cola ' \) \
\( -clone 0 -font Candice -pointsize 24 \
-annotate +5+60 'Candice ' \) \
\( -clone 0 -font SheerBeauty -pointsize 48 \
-annotate +5+60 'Sheer Beauty' \) \
-delete 0 -trim +repage +append \
-transparent blue -trim +repage \
-background white -flatten wp_draw_baseline.jpg
Seperti sebelumnya, pemangkasan gambar dilakukan dua tahap. Pertama, gambar teksnya pada gambar dasar yang memuat garis biru vertikal. Dengan begitu saat teks dipangkas, hanya lebar gambar teks yang terpangkas, menyisakan semua kata pada tinggi baseline yang sama. Setelah disambung, garis konstruksi biru bisa kita buang dengan membuatnya transparan penuh. Jika yang dibuat hanya gambar hitam-putih, cara lebih baik adalah mengekstrak salah satu kanal non-biru saja, yang memastikan seluruh garis konstruksi benar-benar terambil. Trim kedua lalu memangkas bagian atas dan bawah, menyusutkannya ke bounding box terbesar. Flatten terakhir ke warna yang sama dengan bounding box lalu menghapus semua jejak pemakaiannya dalam membangun baris itu. Seperti terlihat, semua teks kini terjajar baseline dengan benar, apa pun font atau pointsize yang dipakai. Tentu pada contoh-contoh ini saya hanya memakai teks hitam di atas putih. Warna lain bisa dipakai, selama tidak mengganggu garis konstruksi dan latar transparan yang dipakai untuk penjajaran teks. Dengan teknik ini Anda kini bisa membuat baris-baris teks campuran font, dan menyambung semuanya secara vertikal menjadi dokumen lebih besar. Terlihat pula bahwa semua ini banyak pekerjaan, pekerjaan yang biasanya disembunyikan dari pengguna oleh pengolah kata dan peramban web. Jika memang berencana banyak melakukan hal semacam ini, saya sarankan menengok alternatif-alternatif yang saya sebut sebelumnya.
Mengisi formulir
Anda punya gambar formulir isian standar dan ingin mengisi kolom-kolom yang posisinya sudah diketahui pasti. Jadi Anda punya file data seperti "text_data.txt" yang ditampilkan di sini...
Kolom-kolomnya berupa lebar teks, gravity (perataan), warna, posisi x, y, dan teks sebenarnya yang akan ditempatkan untuk kolom itu. Sekarang skrip shell berulang sederhana bisa dipakai untuk membuat label teks seperti dijabarkan di atas, menempatkan teks yang sesuai pada posisi-posisi teks yang didefinisikan di sebuah gambar formulir (latar).
cat text_data.txt |
while read width gravity color pointsize x y text
do
magick -size ${width}x -gravity $gravity -fill $color -background wheat \
-pointsize $pointsize -page +${x}+${y} label:"${text}" miff:-
done |
magick -size 200x100 xc: - -flatten text_layered.jpg
'Gambar formulir' dalam kasus ini cuma gambar kosong, tetapi sebenarnya bisa apa saja. Saya juga mengatur warna latar label ke 'wheat' supaya area yang terisi terlihat, tetapi normalnya ini diatur ke none. Contoh di atas tidak memakai file sementara, melainkan pipeline gambar format MIFF. Ini contoh pemakaian format streaming gambar: gambar-gambar individual sekadar disambung berurutan, satu demi satu, dalam file atau pipeline. Ini baru titik awal. Kolom formulir bisa datang dari file definisi, sementara teks isiannya dari basis data atau sumber data lain. Atribut lain juga bisa diatur, misalnya font yang dipakai, rotasi teks, dan sebagainya. Anda juga bisa menyertakan lebar sekaligus tinggi, atau bila teksnya harus dilipat kata, Caption yang dipakai alih-alih Label. Lihat juga pin di peta untuk contoh lain teknik ini, mirip dengan di atas.
Alternatif pemrosesan teks
| Cara ideal menghasilkan file teks dan dokumen berformat penuh adalah memakai ImageMagick sebagai bagian dari sistem pemrosesan gambar dan teks yang lebih besar. Alat | dipakai untuk... |
|---|---|
| ImageMagick | Pemrosesan batch dan penyiapan gambar |
| Gimp | Penyuntingan gambar GUI untuk pembenahan masalah sekali jalan |
| LyX | Pengolah kata GUI, dibangun untuk menghasilkan... |
| LaTeX | Pemroses teks untuk dokumen, dan buku... |
| TeX | Format teks yang mendasarinya |
| (menempatkan simbol dan font pada halaman) | |
| Metafont | Generator font TeX |
| Pada dasarnya ImageMagick bisa melakukan banyak hal; bukan berarti ia alat terbaik untuk semuanya. Untuk penyiapan dokumen yang lebih besar, lebih baik perlakukan ia hanya sebagai satu bagian dari keseluruhan yang lebih besar. Aneka alat 'TeX' di atas biasanya terpasang standar di kebanyakan sistem Linux, dan bisa memadukan teks dan gambar menjadi satu kesatuan. Lebih penting lagi, teks tetap dijaga sebagai teks, dan diformat semestinya, sesuai yang Anda tentukan, mengerjakan hampir semua kerja berat pelipatan kata dan halaman serta penataan dengan gambar. Tetapi tanpa memenuhi file 'doc' dengan sampah pemformatan tak berguna. Anda pegang kendali penuh, atau bisa menyerahkan keputusannya. Alat-alat itu menyediakan cara membuat dokumen jenis apa pun, dari halaman sederhana, buletin, bahkan buku utuh. Jika Anda serius soal pembuatan dokumen, alat-alat ini sangat layak ditengok dan dipelajari. | |
| Pango (hanya Linux dan MacOSX) juga menyediakan alternatif. Ia menyediakan banyak fitur pemrosesan teks-ke-gambar yang tak tersedia di ImageMagick. Misalnya TAB, perataan kiri-kanan, margin, header, dan sebagainya. Ia bahkan punya semacam bahasa markup yang memungkinkan pergantian font di tengah teks. | |
| Solusi lain juga mencakup banyak program konversi teks-ke-postscript, seperti "a2ps" yang saya peragakan saat membuat contoh file postscript di penanganan Postscript di atas. Program ini mengonversi dan memformat banyak jenis file teks, dengan pelipatan kata, penebalan, dan kendali tab, plus opsi header, footer, border, dan multi-halaman yang cukup rapi. Tentu ini pemrosesan gambar tak langsung lewat bahasa perantara Postscript atau PDF. Cara lain: tata teksnya memakai SVG, atau perintah menggambar ImageMagick, meski tata letaknya lalu harus Anda urus sendiri. Ada banyak sekali alat di luar sana untuk menyulap teks menjadi gambar, dan kebanyakan bisa dipadukan dengan ImageMagick untuk memproses lanjut gambar teks itu dan meleburkannya ke gambar Anda. Ini membiarkan ImageMagick mengerjakan yang paling dikuasainya: pemrosesan gambar. |
![[IM Output]](../static/img/text/label.gif)
![[IM Output]](../static/img/text/label_file.gif)
![[IM Output]](../static/img/text/label_file_multiline.gif)
![[IM Output]](../static/img/text/caption.gif)
![[IM Output]](../static/img/text/caption_centered.gif)
![[IM Output]](../static/img/text/caption_height.gif)
![[IM Output]](../static/img/text/caption_height_toosmall.gif)
![[IM Output]](../static/img/text/caption_filled.gif)
![[IM Output]](../static/img/text/caption_multi_line.gif)
![[IM Output]](../static/img/text/caption_file.gif)
![[IM Output]](../static/img/text/caption_one_line.gif)
![[IM Output]](../static/img/text/caption_manual.gif)
![[IM Output]](../static/img/text/label_i8n.gif)
![[IM Output]](../static/img/text/label_utf8.gif)
![[IM Output]](../static/img/text/label_quotes.gif)
![[IM Output]](../static/img/text/label_unifun.gif)
![[IM Output]](../static/img/text/label_dingbats.gif)
![[IM Output]](../static/img/text/label_misc.gif)
![[IM Output]](../static/img/text/label_lspace_off.gif)
![[IM Output]](../static/img/text/label_lspace_5.gif)
![[IM Output]](../static/img/text/label_lspace_10.gif)
![[IM Output]](../static/img/text/label_lspace_20.gif)
![[IM Output]](../static/img/text/label_lspace-5.gif)
![[IM Output]](../static/img/text/label_lspace-10.gif)
![[IM Output]](../static/img/text/pango_span.gif)
![[IM Output]](../static/img/text/pango_test.png)
![[IM Text]](../static/img/text/page_size.txt.gif)
![[IM Output]](../static/img/text/text_trimmed.gif)
![[IM Output]](../static/img/text/text_boxed.gif)
![[IM Output]](../static/img/text/text_box_trimmed.gif)
![[IM Output]](../static/img/text/text_page.gif)
![[IM Output]](../static/img/text/ps_version_raw.gif)
![[IM Output]](../static/img/text/ps_version.gif)
![[IM Output]](../static/img/text/ps_unsharp.gif)
![[IM Output]](../static/img/text/ps_transparent.png)
![[IM Output]](../static/img/text/ps_bgnd_color.gif)
![[IM Output]](../static/img/text/ps_bgnd_tiled.gif)
![[IM Output]](../static/img/text/ps_multiply.gif)
![[IM Output]](../static/img/text/ps_overhead.png)
![[IM Output]](../static/img/text/text_draw.gif)
![[IM Output]](../static/img/text/text_options.gif)
![[IM Output]](../static/img/text/draw_mvg.gif)
![[IM Output]](../static/img/text/draw_undercolor.gif)
![[IM Output]](../static/img/text/annotate.gif)
![[IM Output]](../static/img/text/annotate_opts.gif)
![[IM Output]](../static/img/text/annotate_rotated.gif)
![[IM Output]](../static/img/text/funfont_gradients.jpg)
![[IM Output]](../static/img/text/funfont_groovy.jpg)
![[IM Output]](../static/img/text/autosize_wet.jpg)
![[IM Output]](../static/img/text/invitation_box.jpg)
![[IM Output]](../static/img/text/invitation_colored.jpg)
![[IM Output]](../static/img/text/invitation_rose.jpg)
![[IM Text]](../static/img/text/font_metrics.txt.gif)
![[IM Text]](../static/img/text/font_boxinfo.txt.gif)
![[IM Text]](../static/img/text/font_drawn.txt.gif)
![[IM Output]](../static/img/text/wp_label_append.jpg)
![[IM Output]](../static/img/text/wp_label_bottom.jpg)
![[IM Output]](../static/img/text/wp_draw_baseline.jpg)
![[IM Text]](../static/img/text/text_data.txt.gif)
![[IM Output]](../static/img/text/text_layered.jpg)