给互联网的图片增加水印,参考代码如下:
这里使用了httpclient、hutool工具包,可自行添加maven引用配置。
/**
* 图片加水印
*
* @param filePath 图片路径
* @param response 响应体
*/
@GetMapping("/getWatermarkImg")
@ResponseBody
public void getEncryptAlarmImg(String filePath, HttpServletResponse response) throws IOException {
InputStream fis = null;
OutputStream os = null;
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(filePath);
HttpResponse imgResponse = httpClient.execute(httpGet);
if (imgResponse.getStatusLine().getStatusCode() != 200) {
response.sendRedirect("获取图片失败!");
return;
}
HttpEntity entity = imgResponse.getEntity();
fis = entity.getContent();
os = response.getOutputStream();
BufferedImage originalImage = ImgUtil.read(fis);
// 这里是图片水印文字,可根据自己需求修改
String content = "张三 " + DateUtil.now();
ImgUtil.pressText(markImageByText(originalImage, content),
ImgUtil.getImageOutputStream(os),
"本图片仅供系统内部使用,请勿转载,泄露引发的一切责任由个人承担",
Color.WHITE, new Font("黑体", Font.BOLD, 15), originalImage.getWidth() / 4, originalImage.getHeight() / 2, 0.5f);
} catch (Exception e) {
e.printStackTrace();
} finally {
assert fis != null;
fis.close();
assert os != null;
os.close();
}
}
/**
* 给图片添加水印文字、可设置水印文字的大小、旋转角度、透明度
*
* @param originalImage 原始图片
* @param watermarkText 水印文字
* @return 水印图片
*/
public BufferedImage markImageByText(BufferedImage originalImage, String watermarkText) {
// 1、获取源图片的宽度和高度
int width = originalImage.getWidth(null);
int height = originalImage.getHeight(null);
// 2、创建一个大小和原始图片相同的 BufferedImage 对象,用来绘制水印
BufferedImage watermarkedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 3、得到画笔对象
Graphics2D graphics = watermarkedImage.createGraphics();
// 4、设置对线段的锯齿状边缘处理
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics.drawImage(originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
// 5、设置水印倾斜度,这里是在图片的对角线上
// 对角线长度lengthOfDiagonal
double lengthOfDiagonal = Math.sqrt(Math.pow(watermarkedImage.getWidth(), 2) + Math.pow(watermarkedImage.getHeight(), 2));
double v = (Math.pow(watermarkedImage.getWidth(), 2) + Math.pow(lengthOfDiagonal, 2) - Math.pow(watermarkedImage.getHeight(), 2)) / (2 * watermarkedImage.getWidth() * lengthOfDiagonal);
// get到了一个弧度数
double acos = Math.acos(v);
double myDegree = Math.toDegrees(acos);
// 这里的负号决定对角线-Math.toRadians(myDegree)
graphics.rotate(-Math.toRadians(myDegree),
(double) watermarkedImage.getWidth() / 2,
(double) watermarkedImage.getHeight() / 2);
// 6、设置水印文字颜色、字体
graphics.setColor(Color.WHITE);
graphics.setFont(new Font("黑体", Font.BOLD, 30));
// 7、设置透明度
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.3f));
// 8、设置文字位置
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(graphics.getFont());
// 获取文字宽度
int strWidth = metrics.stringWidth(watermarkText);
int xNum = width / strWidth + 1;
int yNum = height / 50 + 1;
int split = 50;
for (int i = 1; i <= 2 * yNum; i++) {
int y = -height + 50 * i + 5 * split * i;
for (int j = 0; j < xNum; j++) {
int x = strWidth * j + 3 * split * j;
graphics.drawString(watermarkText, x, y);
}
}
// 9、释放资源
graphics.dispose();
return watermarkedImage;
}