null

Как добавить текст на изображение в java

Допустим, вам понадобилось добавлять на изображение дату. Или не дату, а какой-то любой другой текст. Как это можно сделать?  (Буду использовать дату в качестве примера.)

 

1. Готовим холст

 

Воспользуемся возможностями из пакета java.awt.

Заметка. Не каждая версия java может работать с графикой и если у вас возникают ошибки о том, что при работе невозможно достучаться до какого-то системного пакета, то первое на что стоит обратить внимание -- это версия java. Так openjdk:11-jre-slim нужно будет заменить на openjdk:11-jre
 

Для начала изображение нужно прочитать из файла или создать  пустой холст. Тип изображения, с которым мы будем работать -- BufferedImage.

Давайте прочитаем из файла:
 

BufferedImage image =
   ImageIO.read(new File("project/images/simple-esign-en.png"))

Заметка: Также можно передать файл в виде URL или передать InputStream, если у вас уже есть загруженное изображение.

Для создания пустого изображения в конструктор BufferedImage нужно передать размеры в пикселях и цветовую модель.
 

BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);

Примеры самых используемых цветовых моделей:

TYPE_INT_RGB - 8-битные цветовые компоненты RGB, упакованные в целые пиксели, не поддерживает прозрачность.
TYPE_INT_ARGB - 8-битные цветовые компоненты RGB, упакованные в целые пиксели, с поддержкой прозрачности.
 

Подробнее можно посмотреть в https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html
 

2. Готовим инструменты и краски

 

Когда холст готов, нужно подготовить все инструменты. 
 

Graphics g = image.graphics

Чаще всего нужно настраивать цвет, размер и шрифт текста, давайте посмотрим, как это делается.
 

Цвет: 
Можно задать, используя RGB палитру
 

g.color = new Color(0x00, 0x80, 0x00);

Или использовать предопределенные цвета:
 

g.color = Color.BLACK

Шрифт:
Тут тоже можно использовать файл шрифта
 

g.font = Font.createFont(new File("fonts/pt-sans-all-700-normal.ttf"))

Либо использовать уже готовые: 
 

g.font = Font.getFont("Arial")

Размер:
 

g.font = g.font.deriveFont(Font.PLAIN, 14f)

Здесь можно задать размер и тип шрифту: курсив, подчеркнутый, жирный.
 

3. Рисование

Когда холст, инструменты и краски готовы можно начинать творить.
 

g.drawString(LocalDate.now(), 400, 88)

Задаем что нужно написать и где (в пикселях по координатам x, y. Точка 0, 0 находится в левом верхнем углу)

После того, как задали всю информацию необходимо ее отрисовать

g.dispose()

И сохранить в файл
 

ImageIO.write(image, "png", new File(“image/new-file.png”))

Заметка: ImageIO.write позволяет записывать результат не только в файл, но и ByteArrayOutputStream, это может позволить переслать изображение куда-либо не сохраняя промежуточный файл.
 

ByteArrayOutputStream baos = new ByteArrayOutputStream()
ImageIO.write(image, "png", baos)