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

javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG) javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV) javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG) javaCV开发详解之4:转流器实现(也可作... 阅读详情

javaCV图像处理系列:

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, 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、添加图片水印

[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, 0, 0, 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", 40, 20, 0, 14);  
  7.     }  
简直棒极了,至此我们可以随意的给图片任意位置添加任意文字或者图片水印了。

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

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制 本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。 阅读详情

相关推荐

概率论基础-严士健 第二版 习题与补充1.6答案

概率论基础-严士健 第二版 习题与补充1.6答案 1.不独立。 设有一均匀正八面体,其第1,2,3,4面染红色,第1,2,3,5面染白色,第1,6,7,8面染黑色,现在以A,B,C分别表示投一次正八面体出现红、白、黑的事件,则 P(A)=P(B)=P(C)=12.P(A) = P(B) = P(C) = \frac{1}{2}.P(A)=P(B)=P(C)=21​. P(ABC)=18=P(A)P...

weixin_42341993的博客 2515

java 针对图片 视频添加水印

【代码】java 针对图片 视频添加水印。

nullsheep的博客 690

龙头复盘神器/复盘于导出工具最新版5.6

龙头复盘神器,复盘于导出工具

初入python踩过的坑 8234

java 用javacv给视频加图片水印

可以使用JavaCV库中的FFmpegFrameGrabber和FFmpegFrameRecorder类实现在视频中添加图片水印。具体实现步骤如下: 使用FFmpegFrameGrabber类打开视频文件。 使用CanvasFrame类在视频帧上绘制图片水印。 使用FFmpegFrameRecorder类保存带水印的视频。 这里有一个简单的样例: public static void main...

weixin_42612405的博客 945

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5124

Claude Code vs Codex

Claude Code 提供了一个生产就绪(production-ready)的实现,包含良好的错误处理、优雅的关闭逻辑、详细注释和文档,以及内置测试。Claude Code 输出了一个可运行的 Next.js + TypeScript 前端,但错过了一些设计里的黄色主题元素;Codex 则生成自己的版本,没有导出设计中的图片,也没严格遵照设计主题。Codex 完成同样功能,但更简洁直接,文档和注释少一些但功能达标。任务都用同样的提示,使用 TypeScript 实现,并在一天内完成。

weixin_49869937的博客 2387

java给视频添加字幕_JavaCV本地视频流通过帧图片添加文本进行字幕合成

JavaCV本地视频流通过帧图片添加文本进行字幕合成音视频的Java框架找了一大圈,除了JavaCV,目前找不到其他的。JavaCV封装了对底层C的调用,最终实际上执行的都是FFMPEG的函数。现在有个头疼的问题,FFMPEG的字幕合成用命令行一敲就完事了,比如想往input.mkv里合入字幕subtitles.srt,输出到output.mkv,简单的很:ffmpeg -i input.mkv ...

weixin_33345090的博客 2486

(8)(8.19) GPIOs

Ardupilot官网关于《Copter》的翻译 —《(8.19) GPIOs》。

无人机开发(开源Ardupilot) 1万+

Java-编辑图片,添加文字

无 package com.example.studybase._03_文件操作; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import javax.image

记录者的博客 1万+

chromium通信系统-ipcz系统(二)-ipcz系统代码实现-同Node通信

在chromium通信系统-mojo系统(一)-ipcz系统基本概念一文中我们介绍了ipcz的基本概念。 本章我们来通过代码分析它的实现。 handle系统 为了不对上层api暴露太多细节,实现解耦,也方便于传输,ipcz系统使用handle表示一个对象,handle类似于文件描述符,用IpczHandle类型表示ipcz系统内的一个对象。一个可以用IpczHandle 句柄表示的对象必须是APIObject子类。APIObject数据结构如下 class APIObject : public RefCou

woai110120130的专栏 1775

YOLOv8 交通违规检测各个场景的实际应用

本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。

u010117029的博客 299

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

这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为实现功能:①给图片增加文字水印②给图片增加图片水印一、核心功能实现:1、添加文字水印// 加文字水印public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {...

weixin_42509833的博客 1744

10天冲刺国自然基金!用这套实战AI提示词指令教程,助你中标率翻倍!亲测DeepSeek和ChatGPT不好用

虽然以上国自然提示词指令经过反复实测,但并不是万能无脑帮你搞定所有,大模型AI的特性是你专业领域能力越强,它的智商表现就会更加强大,通过以上提示词教程的使用,大大提升中标概率是肯定的。还有就是大模型的使用上,不是市面上大家都说好的就一定适用,目前来看,Gemini和Claude的两个模型是非常适合国自然本子的修改的。在使用大模型进行国自然本子撰写修改时,首先是角色的设定,然后是目标和背景的描述,好用的提示词指令都是要经过无数次的实测,比对输出结果后又反复调整,达到最佳的效果状态的提示词指令。

智能AI让学术科研更容易 1245

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

javaCV图像处理系列:前言:这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为实现功能:①给图片增加文字水印②给图片增加图片水印一、核心功能实现:1、添加文字水印//加文字水印publicvoidmark(BufferedImagebufImg,Imageimg,Stringtext,Fontfont,Colorcolor,in...

weixin_39576751的博客 362

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为实现功能:①给图片增加文字水印②给图片增加图片水印一、核心功能实现:1、添加文字水印// 加文字水印public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {...

weixin_42662605的博客 417

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 视频抽帧_opencv3.2.0实现视频抽帧,并保存成图片

.实现指定帧数的抽取、和全部帧数的抽取,并保存到指定目录。在QT新建一个控制台程序,程序源码如下:(程序实现每十帧获取一次帧)#include #include #include #include #include using namespace std;using namespace cv;int main(){/******** 获取视频文件(实例化的同时进行初始化)*******/Video...

weixin_34475212的博客 1682

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

javacv实现实时视频截图和录像服务easyCV,支持png,jpg截图以及gif,apng动态图片录制

本项目维护于github:https://github.com/eguid/easyCV 2019年4月更新: 1、新增两个springboot+postgre的演示demo 2、去除了corelib录像API中不合理的持久层接口 1、介绍 本项目的截图库基于ffmpeg,录像库基于javaCV1.4.x。 其中实现了 (1)实时视频截图服务(支持rtsp/rtmp/http-flv...

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 8444

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

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

weixin_30437847的博客 335

视频网站开发

https://blog.youkuaiyun.com/eguid_1/article/details/51725970 群号:371249677 (点击这里进群) 一、本地推送端 1、本地:采用javaCV(安卓和java平台推荐javaCV)、ffmpeg、openCV或者jmf可以很方便的获取到本地摄像头流媒体 javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于java...

u010451780的专栏 1941

javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)...

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

weixin_30838873的博客 423

只知道用c++搞音视频?来来来,javacv了解一下

javacv是什么?javacv技术栈能做什么? 大家肯定对javacv很感兴趣,恰巧博主对javacv稍有涉猎,这就来给各位小伙伴们安利一番,javacv到底可以做什么,可以在哪些领域独领风骚。 javacv凭借强大的跨平台性和快速开发,既降低了跨平台要求,又提高了开发速度。不管你是Windows,Mac,Linux,树莓派嵌入式,javacv都可以随心所欲。 音视频处理(ffmpeg) 首先是音视频处理,编解码,装封装,只要ffmpeg可以的javacv就可以,他们没有什么不同。 图像处理和图像识别

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 1927

java 多媒体流_流媒体服务 javaCV-4 转流

转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)基于javaCV实现转流器和收流器功能,测试采用监控rtsp地址转发至rtmp服务器地址,openCV保存图片功能作为转流器可以轻松实现rtsp/rtmp/本地文件/本地摄像头推送到rtmp流媒体服务器;作为收流器可以用来把流...

weixin_29216957的博客 580
上一篇: java实现给图片添加水印
下一篇: 什么是 JWT -- JSON WEB TOKEN
ldear
博客等级 码龄10年 80粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值