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添加文字水印和图片水印(每一页都添加一个文字水印和图片水印)

依赖的包:



com.lowagie
itextasian
1.0


com.lowagie
itext
2.1.7

具体代码:

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

效果展示:

补充:关于字体的用法

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

结果展示:

补充:关于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

结果展示:

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

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

    忘记密码?

    图形验证码