您的位置:首页 > 其它

图片添加水印

2016-01-27 14:36 573 查看
/**

* 添加水印的接口

* @author navy

*/

public interface IWaterMarkService {

public static final String MARK_TEXT="源辰信息";//水印文本

public static final String FONT_NAME="微软雅黑";//水印字体

public static final int FONT_STYLE=Font.BOLD;//字体

public static final int FONT_SIZE=120;//字体大小 像素

public static final Color FONT_COLOR=Color.green;//字体颜色

public static final int X=10; //水印的X轴坐标

public static final int Y=10; //水印的Y轴坐标

public static float ALPHA=0.5F; //透明度

public static final String LOGO="../logo/logo.gif";

/**

* 添加水印

* @param pic:要添加水印的图片

* @param picFileName:图片的名称

* @param uploadPath:图片上传到相对路径

* @param realUploadPath:图片上传到绝对路径

* @return:添加完水印后的图片路径

*/

public String waterMark(File pic,String picFileName,String uploadPath,String realUploadPath);

}

右下角文字水印

/**
* 添加文本水印
* @author navy
*/
public class TextWaterMarkServiceImpl implements IWaterMarkService{
@Override
public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
FileOutputStream fos=null; //将内存中的图片写出到磁盘
String newFileName = ""; //添加水印后的图片

try {
Image image=ImageIO.read(pic); //获取图片信息
int width=image.getWidth(null);//获取图片的大小
int height=image.getHeight(null);//获取图片的大小

//1.创建图片缓存对象 高度、宽度和图片颜色
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//2.创建Java绘图工具对象
Graphics2D gp=bufferedImage.createGraphics();

/*
* 3.使用绘图工具对象将原图绘制到缓存图片对象
* 绘制图片 要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
* 绘制图片的高度和宽度
*/
gp.drawImage(image,0,0,width,height,null);

//4.添加文字水印
//(1)设置显示文本的样式
gp.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
//(2)设置显示文本的颜色
gp.setColor(FONT_COLOR);

//(3)计算文本的显示位置
int x=width-FONT_SIZE*getTextLength(MARK_TEXT);
int y=height-FONT_SIZE;

//(4)设置透明度
gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));

//(5)绘制文本水印
gp.drawString(MARK_TEXT,x,y+FONT_SIZE);

//(6)释放工具
gp.dispose();

//5.创建图像编码工具类,对图片对象进行编码处理 JPEGImageEncoder
newFileName="text_"+picFileName;
fos=new FileOutputStream(realUploadPath+"/"+newFileName);
JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
//6.使用图像编码工具类,输出缓存图像到目标图片文件
jie.encode(bufferedImage);

} catch (IOException e) {
e.printStackTrace();
} finally{
//7.关闭流
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath+"/"+newFileName;
}

/**
* 计算文本的长度
* 如果是中文则就是文本长度值,如果是英文或数字,则是一半其长度的一半
* 两个英文的长度跟一个汉字的长度一样
* @param text:要计算的文本
* @return
*/
public int getTextLength(String text){
int length=text.length();
String temp;
for(int i=0;i<text.length();i++){
temp=String.valueOf(text.charAt(i));
if(temp.getBytes().length>1){ //如果是汉字,则加1
length++;
}
}
length=length%2==0?length/2:length/2+1;
return length;
}
}

右下角添加图片水印

/**
* 添加图片水印
* @author navy
*/
public class ImageWaterMarkServiceImpl implements IWaterMarkService{
@Override
public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
FileOutputStream fos=null; //将内存中的图片写出到磁盘
String newFileName = ""; //添加水印后的图片

try {
Image image=ImageIO.read(pic); //获取图片信息
int width=image.getWidth(null);//获取图片的大小
int height=image.getHeight(null);//获取图片的大小

//1.创建图片缓存对象 高度、宽度和图片颜色
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//2.创建Java绘图工具对象
Graphics2D gp=bufferedImage.createGraphics();

/*
* 3.使用绘图工具对象将原图绘制到缓存图片对象
* 绘制图片 要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
* 绘制图片的高度和宽度
*/
gp.drawImage(image,0,0,width,height,null);

//4.添加图片水印
//(1)获取水印图片路径
String logoPath=realUploadPath+"/"+LOGO;

//(2)创建文件对象,去指向这个文件
File logo=new File(logoPath);

//(3)使用Image这个类去操作这个文件
Image imageLogo=ImageIO.read(logo);

//(4)计算文本的显示位置
int x=width-imageLogo.getWidth(null);
int y=height-imageLogo.getHeight(null);

//(5)设置透明度
gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));

//(6)绘制文本水印
gp.drawImage(imageLogo,x,y,null);

//(7)释放工具
gp.dispose();

//5.创建图像编码工具类,对图片对象进行编码处理 JPEGImageEncoder
newFileName="logo_"+picFileName;
fos=new FileOutputStream(realUploadPath+"/"+newFileName);
JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
//6.使用图像编码工具类,输出缓存图像到目标图片文件
jie.encode(bufferedImage);
} catch (IOException e) {
e.printStackTrace();
} finally{
//7.关闭流
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath+"/"+newFileName;
}
}

添加多文本水印

/**
* 添加多文本水印
* @author navy
*/
public class TextMoreWaterMarkServiceImpl implements IWaterMarkService{
@Override
public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
FileOutputStream fos=null; //将内存中的图片写出到磁盘
String newFileName = ""; //添加水印后的图片

try {
Image image=ImageIO.read(pic); //获取图片信息
int width=image.getWidth(null);//获取图片的大小
int height=image.getHeight(null);//获取图片的大小

//1.创建图片缓存对象 高度、宽度和图片颜色
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//2.创建Java绘图工具对象
Graphics2D gp=bufferedImage.createGraphics();

/*
* 3.使用绘图工具对象将原图绘制到缓存图片对象
* 绘制图片 要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
* 绘制图片的高度和宽度
*/
gp.drawImage(image,0,0,width,height,null);

//4.添加文字水印
//(1)设置显示文本的样式
gp.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
//(2)设置显示文本的颜色
gp.setColor(FONT_COLOR);

//(3)计算文本的大小
int textWidth=FONT_SIZE*getTextLength(MARK_TEXT);
int textHeight=FONT_SIZE;

//(4)设置透明度
gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));

//(5)旋转图片 将角度转换为弧度 然后是旋转的中心
gp.rotate(Math.toRadians(30),bufferedImage.getWidth()/2,bufferedImage.getHeight()/2);

//(6)设置绘制坐标的起始值
int x=-width/2; //向左移动一半
int y=-height/2; //向上移动一半

//(7)循环绘制文本水印,此时绘制的区域会增大,我们这里直接扩大一倍
while(x<width*1.5){
y=-height/2; //y坐标要重置,以保证从上往下的添加
while(y<height*1.5){
gp.drawString(MARK_TEXT,x,y);//添加水印
y+=textHeight+200;
}
x+=textWidth+200; //200为文字与文字之间的间距
}

//(8)释放工具
gp.dispose();

//5.创建图像编码工具类,对图片对象进行编码处理 JPEGImageEncoder
newFileName="textmore_"+picFileName;
fos=new FileOutputStream(realUploadPath+"/"+newFileName);
JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
//6.使用图像编码工具类,输出缓存图像到目标图片文件
jie.encode(bufferedImage);

} catch (IOException e) {
e.printStackTrace();
} finally{
//7.关闭流
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath+"/"+newFileName;
}

/**
* 计算文本的长度
* 如果是中文则就是文本长度值,如果是英文或数字,则是一半其长度的一半
* 两个英文的长度跟一个汉字的长度一样
* @param text:要计算的文本
* @return
*/
public int getTextLength(String text){
int length=text.length();
String temp;
for(int i=0;i<text.length();i++){
temp=String.valueOf(text.charAt(i));
if(temp.getBytes().length>1){ //如果是汉字,则加1
length++;
}
}
length=length%2==0?length/2:length/2+1;
return length;
}
}

添加多图片水印

/**
* 添加图片水印
* @author navy
*/
public class ImageMoreWaterMarkServiceImpl implements IWaterMarkService{
@Override
public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
FileOutputStream fos=null; //将内存中的图片写出到磁盘
String newFileName = ""; //添加水印后的图片

try {
Image image=ImageIO.read(pic); //获取图片信息
int width=image.getWidth(null);//获取图片的大小
int height=image.getHeight(null);//获取图片的大小

//1.创建图片缓存对象 高度、宽度和图片颜色
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//2.创建Java绘图工具对象
Graphics2D gp=bufferedImage.createGraphics();

/*
* 3.使用绘图工具对象将原图绘制到缓存图片对象
* 绘制图片 要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
* 绘制图片的高度和宽度
*/
gp.drawImage(image,0,0,width,height,null);

//4.添加图片水印
//(1)获取水印图片路径
String logoPath=realUploadPath+"/"+LOGO;

//(2)创建文件对象,去指向这个文件
File logo=new File(logoPath);

//(3)使用Image这个类去操作这个文件
Image imageLogo=ImageIO.read(logo);

//(4)计算图片水印的大小
int imageWidth=imageLogo.getWidth(null);
int imageHeight=imageLogo.getHeight(null);

//(5)设置透明度
gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));

//(6)旋转图片 将角度转换为弧度 然后是旋转的中心
gp.rotate(Math.toRadians(30),bufferedImage.getWidth()/2,bufferedImage.getHeight()/2);

//(7)设置绘制坐标的起始值
int x=-width/2; //向左移动一半
int y=-height/2; //向上移动一半

//(8)循环绘制文本水印,此时绘制的区域会增大,我们这里直接扩大一倍
while(x<width*1.5){
y=-height/2; //y坐标要重置,以保证从上往下的添加
while(y<height*1.5){
gp.drawImage(imageLogo,x,y,null);
y+=imageWidth+300;
}
x+=imageHeight+300; //300为文字与文字之间的间距
}

//(9)释放工具
gp.dispose();

//5.创建图像编码工具类,对图片对象进行编码处理 JPEGImageEncoder
newFileName="logomore_"+picFileName;
fos=new FileOutputStream(realUploadPath+"/"+newFileName);
JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);

//6.使用图像编码工具类,输出缓存图像到目标图片文件
jie.encode(bufferedImage);
} catch (IOException e) {
e.printStackTrace();
} finally{
//7.关闭流
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath+"/"+newFileName;
}
}
参考慕课网教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: