用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。- -!

  • 2020-04-14 15:35:52

    caniuse前端兼容性检查和使用

    相信大家都曾用caniuse网站查询过css、js的一些兼容性问题,并且都从它反馈的兼容性数据中获益,让我们的线上项目更加稳定、和谐的跑在用户电脑里。不过对于caniuse页面上的一些细节,我们可能会感到困惑或者模棱两可,今天就带着大家一起来重新认识caniuse这个网站,并对它的原理和细节做些探究。

  • 2020-04-15 17:00:07

    export和import的理解,这一篇问扎根就够了

    在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

  • 2020-04-15 21:14:13

    .d.ts与.ts的区别 .d.ts怎么用

    在TypeScript项目中直接引入Javascript包是不能使用的,因为包中缺少TypeScript类型声明,如果是自己写的包,可以考虑自己增加一个.d.ts类型声明文件,如果代码比较多或者使用的是第三方的包,自己写就比较麻烦了。第三方的包首先考虑找一个别人写好的声明文件,如果没有可以使用一些自动生成声明文件的工具。

  • 2020-04-17 09:27:38

    推荐一个老前端开发者的博客

    前端修炼场,首页标签大全greenSock前端研究VUE研究我们的作品flash技术探讨开发心得个人档案培训与招聘服务报价

  • 2020-04-17 09:41:47

    前端css博客推荐

    这个博客有大量的css内容,有svg,TweenMax等教程,抽空通读一下

  • 2020-04-17 10:20:47

    GreenSocks Animation Platform详细工作机制以及TweenMax用法

    GSAP(GreenSocks Animation Platform)是一个性能较好的前端动画库。最近在写一个前端SVG动画编辑器时选择了它作为底层的动画库。为了减少踩坑,我大致浏览了它的源代码,这篇文章主要是对我的理解进行记录。 我会先简单介绍一下这个动画库的API,再介绍它的插件机制,最后会从一个用例出发跟踪其运行机制。