用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

2018-06-19 16:38:06

javaCV图像处理系列:

javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

javaCV图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制

  

前言:

这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为

实现功能:①给图片增加文字水印②给图片增加图片水印

一、核心功能实现:

1、添加文字水印

[java] view plain copy

  1. // 加文字水印  

  2.     public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {  

  3.         Graphics2D g = bufImg.createGraphics();  

  4.         g.drawImage(img, 00, bufImg.getWidth(), bufImg.getHeight(), null);  

  5.         g.setColor(color);  

  6.         g.setFont(font);  

  7.         g.drawString(text, x, y);  

  8.         g.dispose();  

  9.     }  

2、添加图片水印


[java] view plain copy

  1. // 加图片水印  

  2.     public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) {  

  3.         Graphics2D g = bufImg.createGraphics();  

  4.         g.drawImage(img, 00, bufImg.getWidth(), bufImg.getHeight(), null);  

  5.         g.drawImage(markImg, x, y, width, height, null);  

  6.         g.dispose();  

  7.     }  



以上两个方法实现了最核心的功能:给图片添加水印。

补充:

为什么要这么写?

考虑到该方法不仅可以用于给图片文件增加水印,而且还可以给视频的每一帧图像也添加,所以为了方便不同场合重复使用,去除了不必要的依赖关系。

有了核心的两个方法就我们可以给图片文件增加水印了

二、功能性实现

1、给图片增加文字水印

[java] view plain copy

  1. /** 

  2.      * 给图片增加文字水印 

  3.      *  

  4.      * @param imgPath 

  5.      *            -要添加水印的图片路径 

  6.      * @param outImgPath 

  7.      *            -输出路径 

  8.      * @param text-文字 

  9.      * @param font 

  10.      *            -字体 

  11.      * @param color 

  12.      *            -颜色 

  13.      * @param x 

  14.      *            -文字位于当前图片的横坐标 

  15.      * @param y 

  16.      *            -文字位于当前图片的竖坐标 

  17.      */  

  18.     public void mark(String imgPath, String outImgPath, String text, Font font, Color color, int x, int y) {  

  19.         try {  

  20.             // 读取原图片信息  

  21.             File imgFile = null;  

  22.             Image img = null;  

  23.             if (imgPath != null) {  

  24.                 imgFile = new File(imgPath);  

  25.             }  

  26.             if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) {  

  27.                 img = ImageIO.read(imgFile);  

  28.             }  

  29.             int imgWidth = img.getWidth(null);  

  30.             int imgHeight = img.getHeight(null);  

  31.             // 加水印  

  32.             BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);  

  33.             mark(bufImg, img, text, font, color, x, y);  

  34.             // 输出图片  

  35.             FileOutputStream outImgStream = new FileOutputStream(outImgPath);  

  36.             ImageIO.write(bufImg, "jpg", outImgStream);  

  37.             outImgStream.flush();  

  38.             outImgStream.close();  

  39.         } catch (Exception e) {  

  40.             e.printStackTrace();  

  41.         }  

  42.     }  




2、给图片增加图片水印

[java] view plain copy

  1. /** 

  2.      * 给图片增加图片水印 

  3.      *  

  4.      * @param inputImg 

  5.      *            -源图片,要添加水印的图片 

  6.      * @param markImg 

  7.      *            - 水印图片 

  8.      * @param outputImg 

  9.      *            -输出图片(可以是源图片) 

  10.      * @param width 

  11.      *            - 水印图片宽度 

  12.      * @param height 

  13.      *            -水印图片高度 

  14.      * @param x 

  15.      *            -横坐标,相对于源图片 

  16.      * @param y 

  17.      *            -纵坐标,同上 

  18.      */  

  19.     public void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) {  

  20.         // 读取原图片信息  

  21.         File inputImgFile = null;  

  22.         File markImgFile = null;  

  23.         Image img = null;  

  24.         Image mark = null;  

  25.         try {  

  26.             if (inputImg != null && markImg != null) {  

  27.                 inputImgFile = new File(inputImg);  

  28.                 markImgFile = new File(markImg);  

  29.             }  

  30.             if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) {  

  31.   

  32.                 img = ImageIO.read(inputImgFile);  

  33.   

  34.             }  

  35.             if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) {  

  36.   

  37.                 mark = ImageIO.read(markImgFile);  

  38.   

  39.             }  

  40.             int imgWidth = img.getWidth(null);  

  41.             int imgHeight = img.getHeight(null);  

  42.             BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);  

  43.             mark(bufImg, img, mark, width, height, x, y);  

  44.             FileOutputStream outImgStream = new FileOutputStream(outputImg);  

  45.             ImageIO.write(bufImg, "jpg", outImgStream);  

  46.             outImgStream.flush();  

  47.             outImgStream.close();  

  48.         } catch (IOException e) {  

  49.             e.printStackTrace();  

  50.         }  

  51.     }  


3、测试一下效果


文字水印的字体和颜色需要自行定义,这里我们使用宋体,14号字体,颜色选择橙色 - -!,坐标是x轴0,y轴等于字体的大小,也就是图片的左上角。

[java] view plain copy

  1. public static void main(String[] args) {  

  2.         Font font = new Font("宋体", Font.PLAIN, 14);  

  3.         // 原图位置, 输出图片位置, 水印文字颜色, 水印文字  

  4.         // new MarkText4J().mark("eguidMarkText2.jpg", "eguidMarkText2.jpg", "水印效果测试", font, Color.ORANGE, 0, 14);  

  5.         // 增加图片水印  

  6.         new MarkText4J().mark("eguidMarkText2.jpg""eguid.jpg""eguidMarkText3.jpg"4020014);  

  7.     }  

简直棒极了,至此我们可以随意的给图片任意位置添加任意文字或者图片水印了。

最后,额。。。导出的图片比原本图片还小是什么鬼?欢迎加入讨论群一起讨论:371249677。- -!

  • 2019-05-09 11:46:30

    Glide使用高级技巧(解决Glide生成缓存Key问题)

    虽说Glide将缓存功能高度封装之后,使得用法变得非常简单,但同时也带来了一些问题。 比如之前有一位群里的朋友就跟我说过,他们项目的图片资源都是存放在七牛云上面的,而七牛云为了对图片资源进行保护,会在图片url地址的基础之上再加上一个token参数。也就是说,一张图片的url地址可能会是如下格式:

  • 2019-05-13 14:34:42

    linux系统中清理MySql的日志文件,打印日志文件

    默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题。 首先要说明一下,这些文件都是mysql的日志文件,如果不做主从复制的话,基本上是没用的,虽然没用,但是不建议使用rm命令删除,这样有可能会不安全,正确的方法是通过mysql的命令去删除。

  • 2019-05-14 16:47:27

    数据库整理碎片

    最后还是用的ALTER TABLE来修改的,不知道为什么有时候管用,有时候不管用。

  • 2019-05-17 16:27:26

    在vue项目里面使用引入公共方法

    今天早上来到公司,没事看了一下别人的博客,然后试了一下,发现的确是可以的,在此记录一下,方便自己日后查阅。 首先新建一个文件夹:commonFunction ,然后在里面建立 一个文件common.js

  • 2019-05-18 12:37:39

    Android夜间模式的实现方案

    对于一款阅读类的软件,夜间模式是不可缺少的。最初看到这个需求时候觉得无从下手,没有一点头绪。后来通过查阅资料发现Android官方在Support Library 23.2.0中已经加入了夜间主题。也就是只需要通过更换主题便可实现日间模式和夜间模式的切换。下面截取项目实现的夜间模式效果图:

  • 2019-05-18 12:38:41

    android 快速实现夜间模式

    最近项目中遇到了一个问题,夜间模式在8.0以上的手机中不起作用,查看了一下原因,是夜间模式实现方法的问题。分两种情况介绍一下