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