图片添加水印

/**
 * 添加水印的接口
 * @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;
}
}
参考慕课网教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值