이미지에 워터마크를 삽입하면 사진의 무단 사용을 막고 저작권을 보호하거나 브랜드를 알리는 데 큰 도움이 됩니다. 이 글에서는 자바의 BufferedImage와 Graphics 클래스를 활용해 주어진 이미지 위에 "Hello"라는 워터마크를 그리고, 결과물을 새 파일로 저장하는 방법을 단계별로 살펴봅니다.
워터마크 구현 순서
1. 원본 이미지 불러오기
ImageIO.read() 메서드를 사용해 디스크에 있는 이미지 파일을 읽어 BufferedImage 객체로 변환합니다.
2. 출력용 빈 이미지 생성
원본과 같은 크기의 새로운 BufferedImage를 만들어 워터마크가 적용된 결과를 담을 공간을 준비합니다.
3. Graphics 객체 얻기
getGraphics()로 그래픽 객체를 가져온 뒤, drawImage()를 호출해 원본 이미지를 새 이미지 위에 그립니다.
4. 폰트와 색상 지정
Font 객체로 글꼴·스타일·크기를 정하고, setColor()에 RGBA 값을 넣어 반투명한 색상의 워터마크를 만듭니다.
5. 워터마크 그리기 및 저장
drawString()으로 원하는 위치에 텍스트를 그린 후, ImageIO.write()를 이용해 결과 이미지를 JPG 파일로 저장합니다.
전체 예제 코드
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class WaterMarkExample {
public static void main(String[] args) throws IOException {
// 이미지 파일 읽기
File file = new File("D:\\Images\\test1.jpg");
BufferedImage img = ImageIO.read(file);
// 출력용 빈 이미지 생성
int height = img.getHeight();
int width = img.getWidth();
BufferedImage res = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// Graphics 객체 생성 후 원본 이미지 그리기
Graphics graphics = res.getGraphics();
graphics.drawImage(img, 0, 0, null);
// 워터마크에 사용할 폰트 설정
Font font = new Font("Arial", Font.PLAIN, 45);
graphics.setFont(font);
graphics.setColor(new Color(255, 150, 200, 30));
// 이미지 위에 워터마크 텍스트 그리기
graphics.drawString("Hello", width / 7, height / 5);
// 그래픽 리소스 해제
graphics.dispose();
// 결과 이미지 저장
file = new File("D:\\Images\\watermark.jpg");
ImageIO.write(res, "jpg", file);
}
}
실행 결과 확인
입력 이미지

출력 이미지

마무리 및 활용 팁
위 예제처럼 Graphics의 좌표 값(width/7, height/5)을 조절하면 워터마크의 위치를 자유롭게 변경할 수 있습니다. 또한 setColor()의 마지막 알파 값(투명도)을 높이면 워터마크를 더 진하게, 낮추면 더 은은하게 표현할 수 있습니다. 여러 위치에 반복해서 텍스트를 그리면 타일 형태의 워터마크도 손쉽게 구현할 수 있으니, 실제 서비스에서는 이미지 크기에 비례해 폰트 크기를 계산하는 방식도 함께 고려해 보시기 바랍니다.