Menambahkan Teks ke Gambar di Java

1. Ikhtisar

Terkadang kita perlu menambahkan beberapa teks ke gambar atau sekumpulan gambar. Melakukan ini secara manual mudah menggunakan alat pengeditan gambar. Tetapi ketika kita ingin menambahkan teks yang sama dengan cara yang sama ke sejumlah besar gambar, akan sangat berguna untuk melakukan ini secara terprogram.

Dalam tutorial singkat ini, kita akan belajar bagaimana menambahkan beberapa teks ke gambar menggunakan Java.

2. Menambahkan Teks ke Gambar

Untuk membaca gambar dan menambahkan beberapa teks, kita dapat menggunakan kelas yang berbeda. Di bagian selanjutnya, kita akan melihat beberapa opsi.

2.1. ImagePlus dan ImageProcessor

Pertama, mari kita lihat cara menggunakan kelas ImagePlus dan ImageProcessor yang tersedia di pustaka ImageJ. Untuk menggunakan perpustakaan ini kita perlu memasukkan ketergantungan ini dalam proyek kita:

 net.imagej ij 1.51h 

Untuk membaca gambar kita akan menggunakan metode statis openImage . Hasil dari metode ini akan disimpan di memori menggunakan objek ImagePlus :

ImagePlus image = IJ.openImage(path);

Setelah gambar dimuat ke dalam memori, mari tambahkan beberapa teks ke dalamnya menggunakan kelas ImageProcessor :

Font font = new Font("Arial", Font.BOLD, 18); ImageProcessor ip = image.getProcessor(); ip.setColor(Color.GREEN); ip.setFont(font); ip.drawString(text, 0, 20);

Dengan kode ini, yang kami lakukan adalah menambahkan teks yang ditentukan dalam warna hijau di kiri atas gambar. Perhatikan bahwa kami mengatur posisi menggunakan argumen kedua dan ketiga dari metode drawString yang masing-masing mewakili jumlah piksel dari kiri dan atas.

2.2. BufferedImage dan Graphics

Selanjutnya, kita akan melihat bagaimana kita dapat mencapai hasil yang sama menggunakan kelas BufferedImage dan Graphics . Build standar Java menyertakan kelas-kelas ini, jadi tidak perlu perpustakaan tambahan.

Dengan cara yang sama kami menggunakan openImage dari ImageJ , kami akan menggunakan metode baca yang tersedia di ImageIO :

BufferedImage image = ImageIO.read(new File(path));

Setelah kita memuat gambar ke dalam memori, mari tambahkan beberapa teks ke dalamnya menggunakan kelas Graphics :

Font font = new Font("Arial", Font.BOLD, 18); Graphics g = image.getGraphics(); g.setFont(font); g.setColor(Color.GREEN); g.drawString(text, 0, 20);

Seperti yang bisa kita lihat, kedua alternatif sangat mirip dalam cara penggunaannya. Dalam kasus ini, argumen kedua dan ketiga dari metode drawString ditentukan dengan cara yang sama seperti yang kita lakukan untuk metode ImageProcessor .

2.3. Gambar Berdasarkan AttributedCharacterIterator

Metode drawString yang tersedia di Grafik memungkinkan kita mencetak teks menggunakan AttributedCharacterIterator . Ini berarti bahwa alih-alih menggunakan String biasa , kita dapat menggunakan teks dengan beberapa properti terkait. Mari kita lihat contohnya:

Font font = new Font("Arial", Font.BOLD, 18); AttributedString attributedText = new AttributedString(text); attributedText.addAttribute(TextAttribute.FONT, font); attributedText.addAttribute(TextAttribute.FOREGROUND, Color.GREEN); Graphics g = image.getGraphics(); g.drawString(attributedText.getIterator(), 0, 20);

Cara mencetak teks ini memberi kita kesempatan untuk mengaitkan format secara langsung dengan String , yang lebih bersih daripada mengubah properti objek Grafik setiap kali kita ingin mengubah format.

3. Perataan Teks

Sekarang setelah kita belajar bagaimana menambahkan teks sederhana di kiri atas gambar, mari kita lihat sekarang bagaimana kita bisa menambahkan teks ini pada posisi tertentu .

3.1. Teks Tengah

Jenis perataan pertama yang akan kita tangani adalah memusatkan teks . Untuk secara dinamis mengatur posisi yang benar di mana kita ingin menulis teks, kita perlu mencari tahu beberapa informasi:

  • Ukuran gambar
  • Ukuran huruf

Informasi ini dapat diperoleh dengan sangat mudah. Dalam kasus ukuran gambar, data ini dapat diakses melalui metode getWidth dan getHeight dari objek BufferedImage . Di sisi lain, untuk mendapatkan data yang terkait dengan ukuran font kita perlu menggunakan objek FontMetrics .

Mari kita lihat contoh di mana kita menghitung posisi yang benar untuk teks kita dan menggambarnya:

Graphics g = image.getGraphics(); FontMetrics metrics = g.getFontMetrics(font); int positionX = (image.getWidth() - metrics.stringWidth(text)) / 2; int positionY = (image.getHeight() - metrics.getHeight()) / 2 + metrics.getAscent(); g.drawString(attributedText.getIterator(), positionX, positionY);

3.2. Teks Rata di Kanan Bawah

Jenis perataan berikutnya yang akan kita lihat adalah kanan bawah . Dalam hal ini, kita perlu secara dinamis mendapatkan posisi yang benar:

int positionX = (image.getWidth() - metrics.stringWidth(text)); int positionY = (image.getHeight() - metrics.getHeight()) + metrics.getAscent();

3.3. Teks Terletak di Kiri Atas

Terakhir, mari kita lihat cara mencetak teks kita di kiri atas :

int positionX = 0; int positionY = metrics.getAscent();

Penjajaran lainnya dapat disimpulkan dari tiga yang telah kita lihat.

4. Mengadaptasi Ukuran Teks Berdasarkan Gambar

Saat kita menggambar teks pada gambar, kita mungkin menemukan bahwa teks ini melebihi ukuran gambar. Untuk mengatasi ini, kita harus menyesuaikan ukuran font yang kita gunakan berdasarkan ukuran gambar.

Pertama, kita perlu mendapatkan lebar dan tinggi teks yang diharapkan menggunakan font dasar. Untuk mencapai ini, kita akan menggunakan kelas FontMetrics , GlyphVector, dan Shape .

FontMetrics ruler = graphics.getFontMetrics(baseFont); GlyphVector vector = baseFont.createGlyphVector(ruler.getFontRenderContext(), text); Shape outline = vector.getOutline(0, 0); double expectedWidth = outline.getBounds().getWidth(); double expectedHeight = outline.getBounds().getHeight(); 

Langkah selanjutnya adalah memeriksa apakah pengubahan ukuran font diperlukan. Untuk tujuan ini, mari bandingkan ukuran teks yang diharapkan dan ukuran gambar:

boolean textFits = image.getWidth() >= expectedWidth && image.getHeight() >= expectedHeight;

Terakhir, jika teks kita tidak sesuai dengan gambar, kita harus mengurangi ukuran font. Kami akan menggunakan metode deriveFont untuk itu:

double widthBasedFontSize = (baseFont.getSize2D()*image.getWidth())/expectedWidth; double heightBasedFontSize = (baseFont.getSize2D()*image.getHeight())/expectedHeight; double newFontSize = widthBasedFontSize < heightBasedFontSize ? widthBasedFontSize : heightBasedFontSize; newFont = baseFont.deriveFont(baseFont.getStyle(), (float)newFontSize);

Perhatikan bahwa kita perlu mendapatkan ukuran font baru berdasarkan lebar dan tinggi dan menerapkan yang terendah.

5. Ringkasan

Di artikel ini, kami telah melihat cara menulis teks dalam gambar menggunakan metode berbeda.

Kami juga telah belajar bagaimana mendapatkan posisi secara dinamis di mana kami ingin mencetak teks kami berdasarkan ukuran gambar dan properti font.

Akhirnya, kita telah melihat bagaimana menyesuaikan ukuran font teks jika itu melebihi ukuran gambar tempat kita menggambarnya.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.