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 참고