Java图片增加水印

Java图片增加水印教程

图片增加水印,可以使用 JDK 自带的原生方法来添加水印,如果是远程的图片,需要将远程图片下载到本地,然后对本地图片进行操作。

代码结构如下:

05 图片水印.png

PictureWaterMarkUtil

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

运行后效果如下

06 图片水印效果.png

07 图片水印效果.png

Java图片增加水印总结

JDK 自带的方法就可以支持图片打水印了,它会生成一张新的图片,用户在使用的时候,如果图片给前端展示过后,可以考虑将临时生成的图片给删除掉。

有些小伙伴会发现在自己本地测试的时候没有问题,但是在服务器上面运行的时候,中文水印就变成了方块乱码,这个是因为服务器上面没有设置水印时的字体,如果想要支持,那么就需要在服务器上面安装相应的字体了。