您的位置:首页 > 编程语言 > Java开发

Java实现给图片添加水印

2017-11-07 15:20 465 查看
原文转载自:http://blog.csdn.net/dy_smile/article/details/6722907 ,有做部分修改

给图片添加图片/文字水印(源图片必须要比水印图片大)

package com.demo.demo;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.font.TextAttribute;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

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

/**
* 图片水印Demo
* @author thinkpad
*
*/
public class ImageMarkLogoByIcon {

public static void main(String[] args) {
String srcImgPath = "C:\\Users\\thinkpad\\Desktop\\timg.jpg";
String iconPath = "C:\\Users\\thinkpad\\Desktop\\waterMarking.png";
String targerPath = "C:\\Users\\thinkpad\\Desktop\\水印测试.png";
String targerPath2 = "C:\\Users\\thinkpad\\Desktop\\img_mark_icon_rotate.jpg";
//水印内容
String waterMarkContent="图片来源:http://www.baidu.com";
//水印图片色彩以及透明度
Color color=new Color(255,255,255,128);
//水印字体
Font font = new Font("微软雅黑", Font.PLAIN, 35);
// 给图片添加水印
//        ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath);
// 给图片添加水印,水印旋转-45
//        ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath2,
//                -45);
//给图片添加文字水印
ImageMarkLogoByIcon.addTextWaterMark(srcImgPath,targerPath, waterMarkContent, color,font);

}

/**
* 给图片添加水印
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
*/
public static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath) {
markImageByIcon(iconPath, srcImgPath, targerPath, null);
}

/**
* 给图片添加水印、可设置水印图片旋转角度
* @param iconPath 水印图片路径
* @param srcImgPath 源图片路径
* @param targerPath 目标图片路径
* @param degree 水印图片旋转角度
*/
public static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath, Integer degree) {
OutputStream os = null;
try {
Image srcImg = ImageIO.read(new File(srcImgPath));

BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

// 得到画笔对象
// Graphics g= buffImg.getGraphics();
Graphics2D g = buffImg.createGraphics();

// 设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);

if (null != degree) {
// 设置水印旋转
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2, (double) buffImg
.getHeight() / 2);
}

// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);

// 得到Image对象。
Image img = imgIcon.getImage();

//            float alpha = 0.5f; // 透明度  (数值越大,透明度越小)
float alpha = 1f; // 透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));

// 表示水印图片的位置
int iconWidth = img.getWidth(null); //水印图片宽度
int iconHeight = img.getHeight(null);  //水印图片高度
// g.drawImage(img, 水印位置的横坐标, 水印位置的纵坐标,水印宽度, 水印高度, null);
g.drawImage(img, buffImg.getWidth() - iconWidth, buffImg.getHeight() -iconHeight ,
iconWidth, iconHeight, null);

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

g.dispose();

os = new FileOutputStream(targerPath);

// 生成图片
ImageIO.write(buffImg, "JPG", os);

System.out.println("图片完成添加Icon印章。。。。。。");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 给图片添加文字水印
* @param srcImgPath 源图片路径
* @param tarImgPath 保存的图片路径
* @param waterMarkContent 水印内容
* @param markContentColor 水印颜色
* @param font 水印字体
*/
public static void addTextWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent,Color markContentColor,Font font) {

try {
// 读取原图片信息
File srcImgFile = new File(srcImgPath);//得到文件
Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
int srcImgHeight = srcImg.getHeight(null);//获取图片的高
// 加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
g.setColor(markContentColor); //根据图片的背景设置水印颜色
g.setFont(font);              //设置字体

//设置水印的坐标
int x = srcImgWidth - 2 * getWatermarkLength(waterMarkContent, g);
int y = srcImgHeight - getWatermarkLength(waterMarkContent, g);
System.out.println("源图宽度:"+srcImgWidth+"   ,高度:"+srcImgHeight);
System.out.println("水印宽度:"+getWatermarkLength(waterMarkContent, g)+"   ,高度:"+getWatermarkLength(waterMarkContent, g));
System.out.println("水印坐标的X轴:"+x+"   ,Y轴:"+y);
g.drawString(waterMarkContent, x, y);  //画出水印
g.dispose();
// 输出图片
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, "jpg", outImgStream);
System.out.println("添加水印完成");
outImgStream.flush();
outImgStream.close();

} catch (Exception e) {
// TODO: handle exception
}
}
public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图片 水印