Menambah Teks ke Gambar di Java

1. Gambaran keseluruhan

Kadang kala kita perlu menambahkan sedikit teks pada gambar atau sekumpulan gambar. Melakukan ini secara manual adalah mudah menggunakan alat penyuntingan gambar. Tetapi apabila kita ingin menambahkan teks yang sama dengan sebilangan besar gambar, sangat berguna untuk melakukan ini secara teratur.

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

2. Menambah Teks ke Gambar

Untuk membaca gambar dan menambahkan beberapa teks, kita boleh menggunakan kelas yang berbeza. Pada bahagian seterusnya, kita akan melihat beberapa pilihan.

2.1. ImagePlus dan ImageProcessor

Pertama, mari kita lihat bagaimana untuk menggunakan kelas ImagePlus dan ImageProcessor yang terdapat di perpustakaan ImageJ itu. Untuk menggunakan perpustakaan ini, kita perlu memasukkan kebergantungan ini dalam projek kita:

 net.imagej ij 1.51h 

Untuk membaca gambar, kami akan menggunakan kaedah statik openImage . Hasil kaedah ini akan disimpan dalam memori menggunakan objek ImagePlus :

ImagePlus image = IJ.openImage(path);

Setelah gambar dimuatkan ke dalam memori, mari tambahkan beberapa teks padanya 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 kod ini, apa yang kita lakukan ialah menambahkan teks yang ditentukan dengan warna hijau di kiri atas gambar. Perhatikan bahawa kami menetapkan kedudukan menggunakan argumen kedua dan ketiga kaedah drawString yang masing-masing mewakili bilangan piksel dari kiri dan atas.

2.2. Gambar dan Grafik Buffered

Seterusnya, kita akan melihat bagaimana kita dapat mencapai hasil yang sama menggunakan kelas BufferedImage and Graphics . Pembinaan standard Java merangkumi kelas-kelas ini, jadi tidak perlu perpustakaan tambahan.

Dengan cara yang sama kita menggunakan openImage of ImageJ , kita akan menggunakan kaedah baca yang terdapat di ImageIO :

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

Setelah gambar dimuatkan dalam memori, mari tambahkan beberapa teks padanya menggunakan kelas Grafik :

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 kita lihat, kedua-dua alternatif sangat serupa dengan cara yang digunakan. Dalam kes ini, argumen kedua dan ketiga kaedah drawString ditentukan dengan cara yang sama seperti yang telah kita lakukan untuk kaedah ImageProcessor .

2.3. Lukis Berdasarkan AttabledCharacterIterator

Kaedah kolor tersedia di Graphics membolehkan kita untuk mencetak teks yang menggunakan AttributedCharacterIterator . Ini bermaksud bahawa daripada menggunakan String biasa , kita dapat menggunakan teks dengan beberapa sifat yang berkaitan. Mari lihat contoh:

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 peluang untuk mengaitkan format secara langsung dengan String , yang lebih bersih daripada mengubah sifat objek Grafik setiap kali kita ingin mengubah formatnya.

3. Penjajaran Teks

Sekarang setelah kita belajar bagaimana menambahkan teks sederhana di kiri atas gambar mari kita lihat sekarang bagaimana kita dapat menambahkan teks ini pada kedudukan tertentu .

3.1. Teks Berpusat

Jenis penjajaran pertama yang akan kita atasi ialah memusatkan teks . Untuk menetapkan kedudukan yang betul secara dinamis di mana kita ingin menulis teks, kita perlu mengetahui beberapa maklumat:

  • Saiz gambar
  • Saiz huruf

Maklumat ini dapat diperoleh dengan mudah. Sekiranya ukuran gambar, data ini dapat diakses melalui metode getWidth dan getHeight dari objek BufferedImage . Sebaliknya, untuk mendapatkan data yang berkaitan dengan ukuran fon kita perlu menggunakan objek FontMetrics .

Mari lihat contoh di mana kita mengira kedudukan yang betul untuk teks kita dan melukisnya:

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 Sejajar di Bahagian Bawah Kanan

Jenis penjajaran seterusnya yang akan kita lihat adalah bahagian bawah kanan . Dalam kes ini, kita perlu memperoleh kedudukan yang betul secara dinamik:

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

3.3. Teks Terletak di Kiri Atas

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

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

Keselarasan selebihnya dapat disimpulkan dari tiga penjelasan yang telah kita lihat.

4. Mengadaptasi Saiz Teks Berdasarkan Gambar

Semasa kita melukis teks dalam gambar, kita mungkin mendapati bahawa teks ini melebihi ukuran gambar. Untuk menyelesaikannya, kita harus menyesuaikan ukuran fon yang kita gunakan berdasarkan ukuran gambar.

Pertama, kita perlu memperoleh lebar dan tinggi teks yang diharapkan menggunakan fon asas. Untuk mencapai ini, kami 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 seterusnya adalah untuk memeriksa apakah ukuran fon diperlukan. Untuk tujuan ini, mari kita bandingkan ukuran teks yang diharapkan dan ukuran gambar:

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

Akhirnya, jika teks kita tidak sesuai dengan gambar, kita harus mengurangkan ukuran fon. Kami akan menggunakan kaedah 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 bahawa kita perlu memperoleh ukuran fon baru berdasarkan lebar dan tinggi dan menerapkannya yang paling rendah.

5. Ringkasan

Dalam artikel ini, kita telah melihat cara menulis teks dalam gambar menggunakan kaedah yang berbeza.

Kami juga telah belajar bagaimana mendapatkan kedudukan secara dinamis di mana kami ingin mencetak teks kami berdasarkan ukuran gambar dan sifat fon.

Akhirnya, kami telah melihat cara menyesuaikan ukuran fon teks sekiranya melebihi ukuran gambar tempat kami melukisnya.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.