一 点睛
给图片加水印是一种常见的防伪技术,在此提供一个图片水印工具类。
二 代码
package com.imooc.demo.common.util;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;/** * @className: ImagemarkUtils * @description: 图片水印工具类 * @date: 2020/8/20 * @author: cakin */public class ImagemarkUtils { // 水印透明度 private static float alpha = 0.5f; // 水印横向地位 private static int positionWidth = 150; // 水印纵向地位 private static int positionHeight = 300; // 水印文字字体 private static Font font = new Font("宋体", Font.BOLD, 72); // 水印文字色彩 private static Color color = Color.red; /** * @param alpha 水印透明度 * @param positionWidth 水印横向地位 * @param positionHeight 水印纵向地位 * @param font 水印文字字体 * @param color 水印文字色彩 */ public static void setImageMarkOptions(float alpha, int positionWidth, int positionHeight, Font font, Color color) { if (alpha != 0.0f) ImagemarkUtils.alpha = alpha; if (positionWidth != 0) ImagemarkUtils.positionWidth = positionWidth; if (positionHeight != 0) ImagemarkUtils.positionHeight = positionHeight; if (font != null) ImagemarkUtils.font = font; if (color != null) ImagemarkUtils.color = color; } /** * 给图片增加水印图片 * * @param iconPath 水印图片门路 * @param srcImgPath 源图片门路 * @param targerPath 指标图片门路 */ public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath) { markImageByIcon(iconPath, srcImgPath, targerPath, null); } /** * 给图片增加水印图片、可设置水印图片旋转角度 * * @param iconPath 水印图片门路 * @param srcImgPath 源图片门路 * @param targerPath 指标图片门路 * @param degree 水印图片旋转角度 */ public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) { OutputStream os = null; try { Image srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 1、失去画笔对象 Graphics2D g = buffImg.createGraphics(); // 2、设置对线段的锯齿状边缘解决 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); // 3、设置水印旋转 if (null != degree) { g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 4、水印图片的门路 水印图片个别为gif或者png的,这样可设置透明度 ImageIcon imgIcon = new ImageIcon(iconPath); // 5、失去Image对象。 Image img = imgIcon.getImage(); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 6、水印图片的地位 positionWidth = srcImg.getWidth(null) - imgIcon.getIconWidth() > 0 ? srcImg.getWidth(null) - imgIcon.getIconWidth() : 0; positionHeight = srcImg.getHeight(null) - imgIcon.getIconHeight() > 0 ? srcImg.getHeight(null) - imgIcon.getIconHeight() : 0; g.drawImage(img, positionWidth, positionHeight, null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); // 7、开释资源 g.dispose(); // 8、生成图片 os = new FileOutputStream(targerPath); ImageIO.write(buffImg, "JPG", os); System.out.println("图片实现增加水印图片"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 给图片增加水印文字 * * @param logoText 水印文字 * @param srcImgPath 源图片门路 * @param targerPath 指标图片门路 */ public static void markImageByText(String logoText, String srcImgPath, String targerPath) { markImageByText(logoText, srcImgPath, targerPath, null); } /** * 给图片增加水印文字、可设置水印文字的旋转角度 * * @param logoText 水印文字 * @param srcImgPath 源图片门路 * @param targerPath 指标图片门路 * @param degree 水印图片旋转角度 */ public static void markImageByText(String logoText, String srcImgPath, String targerPath, Integer degree) { InputStream is = null; OutputStream os = null; try { // 1、源图片 Image srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 2、失去画笔对象 Graphics2D g = buffImg.createGraphics(); // 3、设置对线段的锯齿状边缘解决 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); // 4、设置水印旋转 if (null != degree) { g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 5、设置水印文字色彩 g.setColor(color); // 6、设置水印文字Font g.setFont(font); // 7、设置水印文字透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 8、第一参数->设置的内容,前面两个参数->文字在图片上的坐标地位(x,y) g.drawString(logoText, positionWidth, positionHeight); // 9、开释资源 g.dispose(); // 10、生成图片 os = new FileOutputStream(targerPath); ImageIO.write(buffImg, "JPG", os); System.out.println("图片实现增加水印文字"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != is) is.close(); } catch (Exception e) { e.printStackTrace(); } try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 性能形容:给图片 c1.png 增加水印 c30.png * * @param args 参数 * @author cakin * @date 2020/8/20 */ public static void main(String[] args) { String srcImgPath = "G:/photo/c1.png"; String iconPath = "G:/photo/c30.png"; System.out.println("给图片增加水印图片开始..."); ImagemarkUtils.setImageMarkOptions(0.3f, 1, 1, null, null); // 给图片增加水印图片 ImagemarkUtils.markImageByIcon(iconPath, srcImgPath, srcImgPath); // 给图片增加水印图片,水印图片旋转-45 // markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45); System.out.println("给图片增加水印图片完结..."); }}