package com.yc.utils; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; /** * 水印类 * @author heqing.hbs@gmail.com * @updatedBy * @updateTime 2011-8-11 上午11:17:07 */ public class Watermark{ /** * 需要添加水印时设置水印的位置 默认bottom_right(右下角) */ public static enum WatermarkPosition{ top_left, top_right, bottom_left, bottom_right, center }; private WatermarkPosition position = WatermarkPosition.bottom_right; private String words = null;//水印文字 private int fontSize = 12; private int color = 0; private boolean isItalic = false; private boolean isBold = false; private String procImageSrc;//文件路径 private String watermarkImageSrc;//水印图片路径 public void procc() { File file = new File(procImageSrc); try { BufferedImage bi = ImageIO.read(file); if(words!=null && !"".equals(words.trim())){ drawString(bi,procImageSrc); }else if(watermarkImageSrc!=null && !"".equals(watermarkImageSrc.trim())){ drawImage(bi, procImageSrc); } } catch (IOException e) { e.printStackTrace(); } } /** * 画文字 * @param g * @throws IOException */ private void drawString(BufferedImage bi,String outTargertUrl) throws IOException{ Graphics g = bi.getGraphics(); int fontStyle = Font.PLAIN; if(isBold&&isItalic){ fontStyle = Font.BOLD|Font.ITALIC; }else if(isBold){ fontStyle = Font.BOLD; }else if(isItalic){ fontStyle = Font.ITALIC; } if(color != 0){ Color newColor = new Color(color); g.setColor(newColor); } Font font = new Font("宋体",fontStyle, fontSize); g.setFont(font); FontMetrics fm = g.getFontMetrics(font); int tempFontWidth = fm.stringWidth(words); int tempFontHeight = fm.getHeight(); int y = bi.getHeight()-tempFontHeight; if(y<0)y=0; switch(position){ case bottom_right://水印在右下角 g.drawString(words,bi.getWidth()-10-tempFontWidth, y); break; case bottom_left://水印在左下角 g.drawString(words,10, y); break; case top_left://水印在左上角 g.drawString(words,10,tempFontHeight); break; case top_right://水印在右上角 g.drawString(words,bi.getWidth()-10-tempFontWidth,tempFontHeight); break; case center: g.drawString(words,bi.getWidth()/2-tempFontWidth/2,bi.getHeight()/2-tempFontHeight/2); break; } g.dispose(); BufferedOutputStream bf = new BufferedOutputStream(new FileOutputStream(procImageSrc)); ImageIO.write(bi, "jpeg",bf); bf.close(); } private void drawImage(BufferedImage bi,String outTargertUrl) throws IOException{ Graphics2D g = bi.createGraphics(); BufferedImage biWater = ImageIO.read(new File(watermarkImageSrc)); int tempWidth = biWater.getWidth(); int tempHeight = biWater.getHeight(); int y = bi.getHeight()-tempHeight; if(y<0)y=0; //可以设置图片透明度 //g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); switch(position){ case bottom_right://水印在右下角 g.drawImage(biWater,bi.getWidth()-10-tempWidth, y,null); break; case bottom_left://水印在左下角 g.drawImage(biWater,10, y ,null); break; case top_left://水印在左上角 g.drawImage(biWater,10,10,null); break; case top_right://水印在右上角 g.drawImage(biWater,bi.getWidth()-10-tempWidth,10,null); break; case center: g.drawImage(biWater,bi.getWidth()/2-tempWidth/2,bi.getHeight()/2-tempHeight/2,null); break; } g.dispose(); BufferedOutputStream bf = new BufferedOutputStream(new FileOutputStream(procImageSrc)); ImageIO.write(bi, "jpeg",bf); bf.close(); } public WatermarkPosition getPosition() { return position; } public void setPosition(WatermarkPosition position) { this.position = position; } public String getWords() { return words; } public void setWords(String words) { this.words = words; } public int getFontSize() { return fontSize; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } public boolean isItalic() { return isItalic; } public void setItalic(boolean isItalic) { this.isItalic = isItalic; } public boolean isBold() { return isBold; } public void setBold(boolean isBold) { this.isBold = isBold; } public String getProcImageSrc() { return procImageSrc; } public void setProcImageSrc(String procImageSrc) { this.procImageSrc = procImageSrc; } public String getWatermarkImageSrc() { return watermarkImageSrc; } public void setWatermarkImageSrc(String watermarkImageSrc) { this.watermarkImageSrc = watermarkImageSrc; } public static void main(String[] args) { // //文字水印 // Watermark wordsWatermark = new Watermark(); // wordsWatermark.setProcImageSrc("D:\\test\\imageSclae\\bigImage.png"); // wordsWatermark.setWords("www.heqing.org"); // wordsWatermark.setPosition(WatermarkPosition.center); // wordsWatermark.setFontSize(24); //// watermark.setColor(123); // wordsWatermark.setBold(true); // wordsWatermark.setItalic(true); // wordsWatermark.start(); // // //图片水印 // Watermark imageWatermark = new Watermark(); // imageWatermark.setProcImageSrc("D:\\test\\imageSclae\\bigImage.png"); // imageWatermark.setWatermarkImageSrc("D:\\test\\imageSclae\\bg.png"); // imageWatermark.setPosition(WatermarkPosition.center); // imageWatermark.start(); } }