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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。