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());
}
}

结果:

java怎么实现添加图片水印和文字水印

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();
}
}
}
}

效果展示:

java怎么实现添加图片水印和文字水印

java怎么实现添加图片水印和文字水印

------------------------------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();
}
}

效果展示:

java怎么实现添加图片水印和文字水印

补充:关于字体的用法

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();
}
}

结果展示:

java怎么实现添加图片水印和文字水印

补充:关于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怎么实现添加图片水印和文字水印

以上是“java怎么实现添加图片水印和文字水印”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-03-13 15:40:37
收藏
分享
海报
0 条评论
162
上一篇:计算机网络中软件的增量更新指的是什么 下一篇:ThinkPHP 5.1修改Cache源码的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码