用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-03-15 15:32:09

    内网打洞以及代码实现

    假设内网的多个ip或者同一ip的不同port,都要访问同一个(外网ip:port)。对NAT来说,从外网接收的包它的(srcIp:srcPort)==(serverIp,serverPort),它的dstIp==natIp,所以NAT只能用dstPort来决定把这个包转发给哪一个(内网Ip:port)

  • 2019-03-15 15:33:08

    Xshell不能按退格、删除键的解决方案

    在使用xshell时,由于每个服务器不同,一些无法使用Backspace键向后删除字符。针对这个问题,本文为大家解答下退格键无法识别如何设置?

  • 2019-03-15 15:49:28

    win10远程桌面连接不上解决方法

    有朋友就感叹电脑的世界真的是很神奇,可以将整个世界连接在一起。如果别人想要摆弄你的电脑,即使不在一个地方也可以利用远程桌面来控制。而这就是所谓的远程控制操作了,大部分人都知道它的作用,不过这也不排除会遇到一些突发情况的时候,例如win10远程桌面连接不上,这该怎么去解决呢?为此,小编给大家带来了解决的图文操作。

  • 2019-03-15 16:49:18

    Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”怎么办

     家庭组是家庭网络上可以共享文件和打印机的一组计算机,可以方便用户们共享文件或者视频等,可是最近有win7纯净版系统用户却发现无法进入家庭组,提示“您的系统管理员不允许访问家庭组”,该怎么办呢?现在给大家分享一下Win7无法进入家庭组提示“您的系统管理员不允许访问家庭组”的解决方法。

  • 2019-03-17 22:19:28

    动态更新Toolbar Menu以及Menu中同时显示文字和图标

    我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptionsMenu方法只在创建Activity的时候调用一次,以后就不再调用了,所以就不能在onCreateOptionsMenu中做处理了。 不过系统提供了另外的一个方法onPrepa

  • 2019-03-26 19:25:01

    Android studio 打包后安装闪退 Fatal Signal 6(SIGABRT)...

    项目上线前打包安装后闪退,查了很多原因,比如混淆文件的内容,第三方库不加入混淆等等,均未成功,后来关闭混淆打包后运行成功,原因可能是依赖工程中的库文件不能被混淆,关闭本工程混淆开关后,依赖工程的混淆开关也要关闭,关闭混淆后如果怕被反编译,可使用百度开发平台的app加固,加固的同时还能使用多渠道打包工具。

  • 2019-03-26 19:29:05

    Android NDK开发Crash错误定位

     在Android开发中,程序Crash分三种情况:未捕获的异常、ANR(Application Not Responding)和闪退(NDK引发错误)。其中未捕获的异常根据logcat打印的堆栈信息很容易定位错误。ANR错误也好查,Android规定,应用与用户进行交互时,如果5秒内没有响应用户的操作,则会引发ANR错误,并弹出一个系统提示框,让用户选择继续等待或立即关闭程序。并会在/data/anr目录下生成一个traces.txt文件,记录系统产生anr异常的堆栈和线程信息。如果是闪退,这问题比较难查, --------------------- 作者:xyang0917 来源:CSDN 原文:https://blog.csdn.net/xyang81/article/details/42319789 版权声明:本文为博主原创文章,转载请附上博文链接!