java怎么实现添加图片水印和文字水印
作者
这篇文章主要介绍java怎么实现添加图片水印和文字水印,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
我们经常会在一些图片或者图片上看到某某公司或品牌的水印,那么我们可不可以自己在喜欢的图片或文件上添加水印呢?答案当然是没问题。
我们先来看看图片水印:
----------------------------图片水印----------------------------
1、添加文字水印
importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics2D; importjava.awt.Image; importjava.awt.image.BufferedImage; importjava.io.File; importjava.io.FileOutputStream; importjavax.imageio.ImageIO; /** *給图片添加文字水印 * *@authorliqiang * */ publicclassWaterMarkUtils{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //原图位置,输出图片位置,水印文字颜色,水印文字 newWaterMarkUtils().mark("C:/Users/liqiang/Desktop/图片/kdmt.jpg","C:/Users/liqiang/Desktop/图片/kdmt1.jpg", Color.red,"圖片來源:XXX"); } /** *图片添加水印 * *@paramsrcImgPath *需要添加水印的图片的路径 *@paramoutImgPath *添加水印后图片输出路径 *@parammarkContentColor *水印文字的颜色 *@paramwaterMarkContent *水印的文字 */ publicvoidmark(StringsrcImgPath,StringoutImgPath,ColormarkContentColor,StringwaterMarkContent){ try{ //读取原图片信息 FilesrcImgFile=newFile(srcImgPath); ImagesrcImg=ImageIO.read(srcImgFile); intsrcImgWidth=srcImg.getWidth(null); intsrcImgHeight=srcImg.getHeight(null); //加水印 BufferedImagebufImg=newBufferedImage(srcImgWidth,srcImgHeight,BufferedImage.TYPE_INT_RGB); Graphics2Dg=bufImg.createGraphics(); g.drawImage(srcImg,0,0,srcImgWidth,srcImgHeight,null); //Fontfont=newFont("CourierNew",Font.PLAIN,12); Fontfont=newFont("宋体",Font.PLAIN,20); g.setColor(markContentColor);//根据图片的背景设置水印颜色 g.setFont(font); intx=srcImgWidth-getWatermarkLength(waterMarkContent,g)-3; inty=srcImgHeight-3; //intx=(srcImgWidth-getWatermarkLength(watermarkStr,g))/2; //inty=srcImgHeight/2; g.drawString(waterMarkContent,x,y); g.dispose(); //输出图片 FileOutputStreamoutImgStream=newFileOutputStream(outImgPath); ImageIO.write(bufImg,"jpg",outImgStream); outImgStream.flush(); outImgStream.close(); }catch(Exceptione){ e.printStackTrace(); } } /** *获取水印文字总长度 * *@paramwaterMarkContent *水印的文字 *@paramg *@return水印文字总长度 */ publicintgetWatermarkLength(StringwaterMarkContent,Graphics2Dg){ returng.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(),0,waterMarkContent.length()); } }
结果:
2、给图片添加图片水印
importjava.awt.AlphaComposite; importjava.awt.Graphics2D; importjava.awt.Image; importjava.awt.RenderingHints; importjava.awt.image.BufferedImage; importjava.io.File; importjava.io.FileOutputStream; importjava.io.OutputStream; importjavax.imageio.ImageIO; importjavax.swing.ImageIcon; /** *給图片添加图片 * *@authorliqiang * */ publicclassWaterMarkUtils{ /** *@paramargs */ publicstaticvoidmain(String[]args){ StringsrcImgPath="C:/Users/liqiang/Desktop/图片/kdmt.jpg"; StringiconPath="C:/Users/liqiang/Desktop/图片/qlq.jpeg"; StringtargerPath="C:/Users/liqiang/Desktop/图片/qlq1.jpeg"; StringtargerPath3="C:/Users/liqiang/Desktop/图片/qlq2.jpeg"; //给图片添加水印 WaterMarkUtils.markImageByIcon(iconPath,srcImgPath,targerPath); //给图片添加水印,水印旋转-45 WaterMarkUtils.markImageByIcon(iconPath,srcImgPath,targerPath3,-45); } /** *给图片添加水印 * *@paramiconPath *水印图片路径 *@paramsrcImgPath *源图片路径 *@paramtargerPath *目标图片路径 */ publicstaticvoidmarkImageByIcon(StringiconPath,StringsrcImgPath,StringtargerPath){ markImageByIcon(iconPath,srcImgPath,targerPath,null); } /** *给图片添加水印、可设置水印图片旋转角度 * *@paramiconPath *水印图片路径 *@paramsrcImgPath *源图片路径 *@paramtargerPath *目标图片路径 *@paramdegree *水印图片旋转角度 */ publicstaticvoidmarkImageByIcon(StringiconPath,StringsrcImgPath,StringtargerPath,Integerdegree){ OutputStreamos=null; try{ ImagesrcImg=ImageIO.read(newFile(srcImgPath)); BufferedImagebuffImg=newBufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); //得到画笔对象 //Graphicsg=buffImg.getGraphics(); Graphics2Dg=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的,这样可设置透明度 ImageIconimgIcon=newImageIcon(iconPath); //得到Image对象。 Imageimg=imgIcon.getImage(); floatalpha=0.5f;//透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha)); //表示水印图片的位置 g.drawImage(img,150,300,null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g.dispose(); os=newFileOutputStream(targerPath); //生成图片 ImageIO.write(buffImg,"JPG",os); System.out.println("图片完成添加Icon印章。。。。。。"); }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(null!=os) os.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
效果展示:
------------------------------PDF水印(itext添加水印)----------------------------
在这里就同时给PDF添加文字水印和图片水印(每一页都添加一个文字水印和图片水印)
依赖的包:
<dependencies> <dependency> <groupId>com.lowagie</groupId> <artifactId>itextasian</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency> </dependencies>
具体代码:
importjava.awt.Color; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjava.text.SimpleDateFormat; importjava.util.Calendar; importcom.lowagie.text.DocumentException; importcom.lowagie.text.Element; importcom.lowagie.text.Image; importcom.lowagie.text.pdf.BaseFont; importcom.lowagie.text.pdf.PdfContentByte; importcom.lowagie.text.pdf.PdfGState; importcom.lowagie.text.pdf.PdfReader; importcom.lowagie.text.pdf.PdfStamper; publicclassTestWaterPrint{ publicstaticvoidmain(String[]args)throwsDocumentException,IOException{ //要输出的pdf文件 BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(newFile("E:/abc.pdf"))); Calendarcal=Calendar.getInstance(); SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss"); //将pdf文件先加水印然后输出 setWatermark(bos,"G:/1.pdf",format.format(cal.getTime())+"下载使用人:"+"测试user",16); } /** * *@parambos输出文件的位置 *@paraminput *原PDF位置 *@paramwaterMarkName *页脚添加水印 *@parampermission *权限码 *@throwsDocumentException *@throwsIOException */ publicstaticvoidsetWatermark(BufferedOutputStreambos,Stringinput,StringwaterMarkName,intpermission) throwsDocumentException,IOException{ PdfReaderreader=newPdfReader(input); PdfStamperstamper=newPdfStamper(reader,bos); inttotal=reader.getNumberOfPages()+1; PdfContentBytecontent; BaseFontbase=BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.EMBEDDED); PdfGStategs=newPdfGState(); for(inti=1;i<total;i++){ content=stamper.getOverContent(i);//在内容上方加水印 //content=stamper.getUnderContent(i);//在内容下方加水印 gs.setFillOpacity(0.2f); //content.setGState(gs); content.beginText(); content.setColorFill(Color.LIGHT_GRAY); content.setFontAndSize(base,50); content.setTextMatrix(70,200); content.showTextAligned(Element.ALIGN_CENTER,"公司内部文件,请注意保密!",300,350,55); Imageimage=Image.getInstance("G:/2.jpeg"); /* img.setAlignment(Image.LEFT|Image.TEXTWRAP); img.setBorder(Image.BOX);img.setBorderWidth(10); img.setBorderColor(BaseColor.WHITE);img.scaleToFit(100072);//大小 img.setRotationDegrees(-30);//旋转 */ image.setAbsolutePosition(200,206);//setthefirstbackground //imageoftheabsolute image.scaleToFit(200,200); content.addImage(image); content.setColorFill(Color.BLACK); content.setFontAndSize(base,8); content.showTextAligned(Element.ALIGN_CENTER,"下载时间:"+waterMarkName+"",300,10,0); content.endText(); } stamper.close(); } }
效果展示:
补充:关于字体的用法
1、使用iTextAsian.jar中的字体
BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
2、使用Windows系统字体
BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
3、使用资源字体(ClassPath) ,也就是将ttf字体拷贝到src目录
BaseFont.createFont("/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
三种方法亲测有效,而且使用itext自带的字体就够用了,可以正确的处理中文。
补充:关于获取PDF页面高度、宽度然后进行动态定位,比如说根据页面宽度实现平铺水印:
packagecn.xm.exam.test; importjava.awt.FontMetrics; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjavax.swing.JLabel; importcom.itextpdf.text.DocumentException; importcom.itextpdf.text.Element; importcom.itextpdf.text.Rectangle; importcom.itextpdf.text.pdf.BaseFont; importcom.itextpdf.text.pdf.PdfContentByte; importcom.itextpdf.text.pdf.PdfGState; importcom.itextpdf.text.pdf.PdfReader; importcom.itextpdf.text.pdf.PdfStamper; publicclassTestWaterPrint{ publicstaticvoidmain(String[]args)throwsDocumentException,IOException{ //要输出的pdf文件 BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(newFile("F:/test1.pdf"))); //将pdf文件先加水印然后输出 setWatermark(bos,"F:/test.pdf","测试user"); } /** * *@parambos输出文件的位置 *@paraminput *原PDF位置 *@paramwaterMarkName *页脚添加水印 *@throwsDocumentException *@throwsIOException */ publicstaticvoidsetWatermark(BufferedOutputStreambos,Stringinput,StringwaterMarkName) throwsDocumentException,IOException{ PdfReaderreader=newPdfReader(input); PdfStamperstamper=newPdfStamper(reader,bos); //获取总页数+1,下面从1开始遍历 inttotal=reader.getNumberOfPages()+1; //使用classpath下面的字体库 BaseFontbase=null; try{ base=BaseFont.createFont("/calibri.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); }catch(Exceptione){ //日志处理 e.printStackTrace(); } //间隔 intinterval=-5; //获取水印文字的高度和宽度 inttextH=0,textW=0; JLabellabel=newJLabel(); label.setText(waterMarkName); FontMetricsmetrics=label.getFontMetrics(label.getFont()); textH=metrics.getHeight(); textW=metrics.stringWidth(label.getText()); System.out.println("textH:"+textH); System.out.println("textW:"+textW); //设置水印透明度 PdfGStategs=newPdfGState(); gs.setFillOpacity(0.4f); gs.setStrokeOpacity(0.4f); RectanglepageSizeWithRotation=null; PdfContentBytecontent=null; for(inti=1;i<total;i++){ //在内容上方加水印 content=stamper.getOverContent(i); //在内容下方加水印 //content=stamper.getUnderContent(i); content.saveState(); content.setGState(gs); //设置字体和字体大小 content.beginText(); content.setFontAndSize(base,20); //获取每一页的高度、宽度 pageSizeWithRotation=reader.getPageSizeWithRotation(i); floatpageHeight=pageSizeWithRotation.getHeight(); floatpageWidth=pageSizeWithRotation.getWidth(); //根据纸张大小多次添加,水印文字成30度角倾斜 for(intheight=interval+textH;height<pageHeight;height=height+textH*3){ for(intwidth=interval+textW;width<pageWidth+textW;width=width+textW*2){ content.showTextAligned(Element.ALIGN_LEFT,waterMarkName,width-textW,height-textH,30); } } content.endText(); } //关流 stamper.close(); reader.close(); } }
结果展示:
补充:关于itext添加倾斜字体的水印
上面使用的是BaseFont,无法添加样式,Font可以添加样式,但是setFontAndSize方法不接受Font参数。所以只能变通实现:
例如:在每页右下角生成倾斜水印
packagecn.xm.exam.test; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importcom.itextpdf.text.DocumentException; importcom.itextpdf.text.Rectangle; importcom.itextpdf.text.pdf.BaseFont; importcom.itextpdf.text.pdf.PdfContentByte; importcom.itextpdf.text.pdf.PdfGState; importcom.itextpdf.text.pdf.PdfReader; importcom.itextpdf.text.pdf.PdfStamper; publicclassTestWaterPrint{ publicstaticvoidmain(String[]args)throwsDocumentException,IOException{ //要输出的pdf文件 BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(newFile("F:/test2.pdf"))); //将pdf文件先加水印然后输出 setWatermark(bos,"F:/test.pdf","测试user123456789"); } /** * *@parambos输出文件的位置 *@paraminput *原PDF位置 *@paramwaterMarkName *页脚添加水印 *@throwsDocumentException *@throwsIOException */ publicstaticvoidsetWatermark(BufferedOutputStreambos,Stringinput,StringwaterMarkName) throwsDocumentException,IOException{ PdfReaderreader=newPdfReader(input); PdfStamperstamper=newPdfStamper(reader,bos); //获取总页数+1,下面从1开始遍历 inttotal=reader.getNumberOfPages()+1; //使用classpath下面的字体库 BaseFontbase=null; try{ base=BaseFont.createFont("/calibri.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); }catch(Exceptione){ //日志处理 e.printStackTrace(); } //设置水印透明度 PdfGStategs=newPdfGState(); gs.setFillOpacity(0.4f); gs.setStrokeOpacity(0.4f); PdfContentBytecontent=null; for(inti=1;i<total;i++){ //在内容上方加水印 content=stamper.getOverContent(i); //在内容下方加水印 //content=stamper.getUnderContent(i); content.saveState(); content.setGState(gs); //设置字体和字体大小 content.beginText(); content.setFontAndSize(base,10); //设置字体样式 floatta=1F,tb=0F,tc=0F,td=1F,tx=0F,ty=0F; //设置加粗(加粗) ta+=0.25F; td+=0.05F; ty-=0.2F; //设置倾斜(倾斜程序自己改) tc+=0.8F; content.setTextMatrix(ta,tb,tc,td,tx,ty); //设置相对于左下角位置(向右为x,向上为y) content.moveText(300F,5F); //显示text content.showText(waterMarkName); content.endText(); content.stroke(); content.restoreState(); } //关流 stamper.close(); reader.close(); } }
结果展示:
以上是“java怎么实现添加图片水印和文字水印”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~