Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

среда, 6 мая 2009 г.

Создание водяных знаков на изображениях

Здесь речь пойдет о создании водяных знаков (watermarks) на изображениях. Водяные знаки (чаще всего это Copyright) часто размещают на фотографиях с целью предотвратить их незаконное копирование. Это достаточно распространенный прием, и он может быть проделан без привлечения дополнительных библиотек, средствами одного только JDK 1.6. Вот пример фотографии с надписью "Copyright (C) 2009":



Последовательность действия такая:

  1. Создаем объект класса javax.swing.ImageIcon, в который загружаем файл с изображением.
  2. Создаем java.awt.image.BufferedImage, размеры которого устанавливаем равными размеру загруженного изображения. Цветовая модель изображения устанавливается RGB. Пока что это пустое изображение. Нам надо разместить на нем картинку, а также надпись. Для рисования получаем объект класса java.awt.Graphics2D.
  3. Размещаем изображение, это делает следующая строка кода:
    g2d.drawImage(photo.getImage(), 0, 0, null);

  4. Затем устанавливаем настройки для надписи, и рисуем саму надпись.
  5. После чего освобождаем графические ресурсы, сохраняем получившийся файл на диск. Все.

Пример кода:

import java.io.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import java.awt.geom.Rectangle2D;

public class Watermark {

public static void main(String[] args) {
try {
final String filenameIn = args[0];
final String filenameOut = args[1];

ImageIcon image = new ImageIcon(filenameIn);
BufferedImage bufferedImage = new BufferedImage(
image.getIconWidth(),
image.getIconHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
g2d.drawImage(image.getImage(), 0, 0, null);

AlphaComposite alpha =
AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f);
g2d.setComposite(alpha);

g2d.setColor(Color.white);
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

g2d.setFont(new Font("Arial", Font.BOLD, 30));
String copyright = "Copyright (C) 2009";

FontMetrics fontMetrics = g2d.getFontMetrics();
Rectangle2D rect = fontMetrics.getStringBounds(copyright, g2d);
g2d.drawString(copyright,
(image.getIconWidth() - (int) rect.getWidth()) / 2,
(image.getIconHeight() - (int) rect.getHeight()) / 2);

g2d.dispose();

OutputStream out = new PrintStream(filenameOut);
ImageIO.write(bufferedImage, "jpg", out);
out.close();
} catch (IOException ioe) {
System.err.println(ioe);
}
}
}

Выполняем следующей командой:

java Watermark 1.jpg 2.jpg

Изображение с водяными знаками будет записано в файл "2.jpg".

Для создания полноценной утилиты следует добавить задание самой надписи через параметр командной строки, а также обработку расширений файлов, в текущей версии жестко задан формат "jpg":

ImageIO.write(bufferedImage, "jpg", out);

Комментариев нет:

Отправить комментарий

Постоянные читатели