javaCV图像处理系列:

前言:

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

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

一、核心功能实现:

1、添加文字水印

  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, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
  5. g.setColor(color);
  6. g.setFont(font);
  7. g.drawString(text, x, y);
  8. g.dispose();
  9. }

2、添加图片水印

  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, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
  5. g.drawImage(markImg, x, y, width, height, null);
  6. g.dispose();
  7. }

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

补充:

为什么要这么写?

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

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

二、功能性实现

1、给图片增加文字水印

  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、给图片增加图片水印

  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轴等于字体的大小,也就是图片的左上角。

  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", 40, 20, 0, 14);
  7. }

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

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

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

  1. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  2. java常用开发工具类之 图片水印,文字水印,缩放,补白工具类

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  3. PHP给图片加上图片水印和文字水印实例

    下面给大家分享一下PHP给图片加上图片水印和文字水印实例,这也是网站经常用到的功能,把代码加上去,调用就很简单了. 核心代码: function imageWaterMark($groundImage ...

  4. Java给图片和PDF文件添加水印(图片水印和文字水印)

    有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...

  5. Thinkphp图片水印和文字水印

    1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图 ...

  6. 利用iTextSharp组件给PDF文档添加图片水印,文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为:   using S ...

  7. PHP 使用gd库给图片加图片水印,文字水印,并返回路径

    //图片水印 $mark_filename = './02.jpg'; //获取图片信息 $info = getimagesize($mark_filename); //获取图片的后缀 $type = ...

  8. Java 给Word每一页设置不同文字水印效果

    Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法.下面,将以Ja ...

  9. php使用GD库实现图片水印和缩略图——给图片添加图片水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

随机推荐

  1. [bug] Cannot proceed because system tables used by Event Scheduler were found damaged at server start

    本地:mac 10.12.3  mysql 5.6 远程:linux 7.3    mysql 5.7.18.  (远程数据库yum安装,又5.6升级到5.7) 步骤:从本地数据库导出数据到远程数据库 ...

  2. C语言学习第七章

    今天开始学习指针,指针在C语言中具有很重要的地位,按照老师所说,学C学不好指针跟没学一样,可见指针在C语言中的重要地位.废话不多说,首先我们先要知道什么是指针. 指针:指针是一个变量,它存储另一个对象 ...

  3. IO流程中IO向量iovec

    作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 为了提高从磁盘读取数据到内存的效率,引入了IO向量机制,IO向量即struct ...

  4. 软件开发的一些"心法"

    从事软件开发也有好几年了,和一开始那个懵懵懂懂的小菜鸟相比,自己也感觉到了一些变化. 也许是熟能生巧, 趟过很多坑,但核心的绝不是这些细节的东西. 打个比方,如果说对某种语言的特性和技巧的掌握属于身法 ...

  5. C#基础知识-流程控制的应用(四)

    流程控制我们在编程中运用到的地方非常的多,在上篇中仅仅只是简单的介绍每一种的使用,并没有运用到实例中,很难去理解它真正的作用.下面我们将实际的运用流程控制的代码写一些实例相关的程序,加深对流程控制的理 ...

  6. RocketMQ 介绍与基本使用

    介绍 RocketMQ是阿里巴巴自研的第三代分布式消息中间件,是阿里系下开源的一款分布式.队列模型的消息中间件,原名Metaq,3.0 版本名称改为RocketMQ,是阿里参照kafka设计思想使用J ...

  7. ST-1之乱码bug

    我印象最深刻的一个错误就是乱码.上学期末做web期末作业时候,我就遇到了好多乱码问题.乱码问题并不是程序本身的逻辑错误,但是却让程序的可用性非常的差.只有输入英文时才能判断结果的正确与否.而且编译器又 ...

  8. Python实现脚本锁功能,同时只能执行一个脚本

    1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件. 通过文件的判断来确定脚本是否正在执行. 方法实现也比较简单,这里以python脚本为例 #coding= ...

  9. 在QT中创建文件

    最近在做QT东西时遇到在指定路径下创建文件,发现qt中没有直接用的. 主要通过自定义一个createFile()函数来实现,其中需要用到<QFile> <QDir> <Q ...

  10. 建造者(Builder)模式

    建造者模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的 ...