图片增加水印,可以使用 JDK 自带的原生方法来添加水印,如果是远程的图片,需要将远程图片下载到本地,然后对本地图片进行操作。
代码结构如下:
package net.haicoder.watermark;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
/**
* @author 嗨客网
* @description 图片渲染水印
*/
public class PictureWaterMarkUtil {
/**
* 图片水印,远程的图片打印不了,需要将图片下载
*
* @param filePath 需要被打印的图片
* @param outputFile 被水印渲染后的图片存储地址
* @param waterMarkContent 水印的内容
* @param fileType 图片类型,比如 jpeg,png 等等
* @param remotePicFlag 是否是本地图片
*/
public static void imageWaterMark(String filePath, String outputFile, String waterMarkContent, String fileType, Boolean remotePicFlag) {
InputStream inputStream = null;
try {
if (remotePicFlag) {
URL url = new URL(filePath);
BufferedImage bufferedImage = ImageIO.read(url);
//把远程的文件下载到本地服务器
ImageIO.write(bufferedImage, fileType, new File(outputFile));
//读取下载到到本地图片信息
File file = new File(outputFile);
inputStream = new FileInputStream(file);
} else {
//读取下载到到本地图片信息
File file = new File(filePath);
inputStream = new FileInputStream(file);
}
Image srcImg = ImageIO.read(inputStream);
int srcImgWidth = srcImg.getWidth(null);
int srcImgHeight = srcImg.getHeight(null);
// 加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
//取画笔
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
Font font = new Font("思源黑体", Font.PLAIN, 35);
g.setColor(Color.gray); // 根据图片的背景设置水印颜色
g.setFont(font);
//将画笔旋转一定弧度
g.rotate(Math.toRadians(-10), srcImgWidth / 2, srcImgHeight / 2);
FontMetrics metrics;
JLabel label = new JLabel();
label.setText(waterMarkContent);
metrics = label.getFontMetrics(label.getFont());
int textH = metrics.getHeight();
int textW = metrics.stringWidth(label.getText());
// 水印文字成30度角倾斜
//你可以随心所欲的改你自己想要的角度
for (int height = -5 + textH; height < srcImgHeight; height = height + textH * 10) {
for (int width = textW + 20; width < srcImgWidth + textW; width = width + textW * 3) {
g.drawString(waterMarkContent, width - textW, height);
}
}
g.dispose();
// 输出图片
File outFile = new File(outputFile);
ImageIO.write(bufImg, fileType, outFile);
} catch (Exception e) {
System.out.println("图片水印处理异常,异常信息");
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
System.out.println("图片打印水印,关闭流异常,异常信息");
e.printStackTrace();
}
}
}
}
}
import net.haicoder.watermark.PictureWaterMarkUtil;
/**
* @author 嗨客网
* @description
*/
public class TestMain {
public static void main(String[] args) {
PictureWaterMarkUtil.imageWaterMark("/Users/haicoder/Documents/code/haicoder/javautil/src/main/java/testpic.png",
"/Users/haicoder/Documents/code/haicoder/javautil/src/main/java/testpic1.png",
"嗨客网", "png", false);
PictureWaterMarkUtil.imageWaterMark("https://haicoder.net/static/imgs/logo.png",
"/Users/haicoder/Documents/code/haicoder/javautil/src/main/java/testpic2.png",
"嗨客网", "png", true);
}
}
运行后效果如下
JDK 自带的方法就可以支持图片打水印了,它会生成一张新的图片,用户在使用的时候,如果图片给前端展示过后,可以考虑将临时生成的图片给删除掉。
有些小伙伴会发现在自己本地测试的时候没有问题,但是在服务器上面运行的时候,中文水印就变成了方块乱码,这个是因为服务器上面没有设置水印时的字体,如果想要支持,那么就需要在服务器上面安装相应的字体了。