java实现图片加水印效果
图片加水印代码,这些代码不常用,但是用到的时候需要注意的地方也挺多的,每次都重写比较麻烦,记下来备忘。代码是图片加水印的一般流程,可根据实际项目需要自行修改。
注:代码在JPG和PNG格式图片下测试通过,其他图片格式请自行测试和修改
importjava.awt.AlphaComposite;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.FontMetrics;
importjava.awt.Graphics2D;
importjava.awt.RenderingHints;
importjava.awt.geom.AffineTransform;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.util.Iterator;
importjavax.imageio.IIOImage;
importjavax.imageio.ImageIO;
importjavax.imageio.ImageReader;
importjavax.imageio.ImageWriteParam;
importjavax.imageio.ImageWriter;
importjavax.imageio.stream.FileImageInputStream;
importjavax.imageio.stream.FileImageOutputStream;
importorg.junit.Test;
publicclassWjt{
@Test
publicvoidt3()throwsException{
FilerootDir=newFile("C:/Users/Administrator/Desktop/tem1");
String[]fa={"1.png","2.jpg"};
for(Strings:fa){
Stringf=s;
{
FileImageInputStreamfileImageInputStream=newFileImageInputStream(newFile(rootDir,f));
IteratorimageReaders=ImageIO.getImageReaders(fileImageInputStream);//根据图片文件获取读取器
ImageReaderimageReader=imageReaders.hasNext()?imageReaders.next():null;//检测读取器是否存在
imageReader.setInput(fileImageInputStream);//设置读取器输入流
BufferedImagebufferedImage=imageReader.read(0);//从读取器取BufferedImage,这里只有一个,所以可以直接写0
{//开始加水印
Graphics2Dgraphics2d=bufferedImage.createGraphics();//取画笔
graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//设置画笔文字抗锯齿
graphics2d.transform(AffineTransform.getTranslateInstance(bufferedImage.getWidth()/2,bufferedImage.getHeight()/2));//将画笔移动到图片中央
graphics2d.transform(AffineTransform.getRotateInstance(Math.toRadians(45)));//将画笔旋转一定弧度
floatradius=Double.valueOf(Math.sqrt(bufferedImage.getWidth()*bufferedImage.getWidth()+bufferedImage.getHeight()*bufferedImage.getHeight())/2).floatValue();//计算图片外切圆半径
FontwaterMarkerFont=newFont("微软雅黑",Font.PLAIN,bufferedImage.getHeight()/25);//设置画笔要用的字体,这里可以设置字体样式和大小
graphics2d.setFont(waterMarkerFont);//设置画笔字体
graphics2d.setColor(Color.WHITE);//设置画笔颜色
graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.3F));//设置画笔操作透明度
FontMetricsfontMetrics=graphics2d.getFontMetrics();//取画笔字体信息
StringwaterMarker="THISISWATERMARK.";//水印文字
intstringWidth=fontMetrics.stringWidth(waterMarker);//计算水印文字宽度,很多人卡在了这一步
for(floati=-radius;i<=radius;i+=(stringWidth+bufferedImage.getHeight()/25)){//循环添加水印,这里可以设置水印水平距离,单位:px
for(floatj=-radius;j<=radius;j+=(fontMetrics.getHeight()+bufferedImage.getHeight()/25)){//这里可以设置水印垂直距离,单位:px
graphics2d.drawString(waterMarker,i,j);//画水印
}
}
graphics2d.dispose();//释放画笔资源
}
ImageWriterimageWriter=ImageIO.getImageWriter(imageReader);//根据图片文件读取器获取图片文件写入器
String[]split=f.split("\\.");
FileImageOutputStreamfileOutputStream=newFileImageOutputStream(newFile(rootDir,split[0]+"r."+split[1]));//生成目标图片文件路径
imageWriter.setOutput(fileOutputStream);//设置写入器输出流
IIOImageiioImage=newIIOImage(bufferedImage,null,null);
ImageWriteParamimageWriteParam=imageWriter.getDefaultWriteParam();
if(imageReader.getFormatName().equals("JPEG")){//jpg格式图片可设置输出图片文件的质量
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);//这一行固定这样写,跟下一行搭配
imageWriteParam.setCompressionQuality(0.947F);//跟上一行搭配,设置输出图片文件的质量
}
imageWriter.write(null,iioImage,imageWriteParam);//写文件
imageWriter.dispose();//关闭写入器
imageReader.dispose();//关闭读取器
}
}
}
}
代码流程在注释中写的很详细了,不多做解释。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。