개발

이미지에 워터마크 넣기

에드몽단테스 2010. 8. 30. 12:45

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public final static void markImage(String srcImg, String markImg, float alpha, int mark_position)
  {
    try
    {
      File _file = new File(srcImg);
      if(!_file.exists()) return;
     
      Image src = ImageIO.read(_file);
      int width = src.getWidth(null);
      int height = src.getHeight(null);
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      Graphics2D g = image.createGraphics();
      g.drawImage(src, 0, 0, width, height, null);

      // watermark image file
      File markFile = new File(markImg);
      if(!markFile.exists()) return;
     
      Image mark_img = ImageIO.read(markFile);
      int mark_img_width = mark_img.getWidth(null);
      int mark_img_height = mark_img.getHeight(null);
      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

      // 우측 하단에 워터마크 표시
      g.drawImage(mark_img, (width - mark_img_width - 10), (height - mark_img_height - 10), mark_img_width, mark_img_height, null);
      g.dispose();

      FileOutputStream out = new FileOutputStream(srcImg);
      JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
      encoder.encode(image);
      out.close();
    } catch (Exception e)
    {
      e.printStackTrace();
    }
  }

이미지 크기와 동일한 BufferedImage 를 만든다.
그리고 워터마크를 위에 덮을 것이기 때문에 그래픽 모드를 변경한다.
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
워터마크를 이미지의 우측 하단에 넣는다.

이미지를 겹치는 것은 어려운 것이 아닌데, 워터마트의 특징을 살리기 위해 워터마트가 투명일 경우 이미지와 잘 매치가 되는 것이 중요하다. 이 역할을 setComposite() 메소드가 담당한다.
알파속성을 가진 인스턴트를 생성해야 하는데 여기에서는 AlphaComposite.SRC_ATOP 를 이용했다.
이 속성에 대해서는 java api 를 참조할 수 있다.
alpha 값은 0 ~ 1까지 설정할 수 있는데, 0은 투명, 1은 불투명을 나타난다.

완전한 코드는 http://freecode-freecode.blogspot.com/2008/06/how-to-add-watermark-to-images-in-java.html 참고

반응형