屏幕水印添加

C++ 实现屏幕水印 使用C++实现的屏幕水印效果。实现中考虑了多显示屏幕的问题,代码简单易懂,通过完整的封装可实现快速移植。 立即下载
    @Resource
    private ActionManageConfig actionManageConfig;

    private ArrayList<WatermarkFrame> fullScreenWatermarks = new ArrayList<>();

    @Value("${work-unit.watermark.text}")
    private String defaultWatermarkText;

    @Value("${work-unit.watermark.color}")
    private String defaultColor;

    /**
     * 初始屏幕水印
     */
    @PostConstruct
    public void watermark() {
        ClientInfo baseInfo = baseService.getBaseInfo();
        HashMap<String, Object> map = new HashMap<String, Object>() {{
            put("clientId", baseInfo.getClientId());
        }};

        String jsonString = null;
        try {
            jsonString = HttpUtil.get(actionManageConfig.getIp() + ":" + actionManageConfig.getPort() + "/watermark/getByClientId", map);
        } catch (Exception e) {
            return;
        }
        JSONObject jsonObject = new JSONObject(jsonString);

        JSONObject object = jsonObject.getJSONObject("data");
        if (object != null) {
            String fontType = object.getStr("fontType");
            String color = object.getStr("color");
            String watermarkText = object.getStr("watermarkText");
            Integer offset = object.getInt("offset");
            Integer angle = object.getInt("angle");
            Integer fontSize = object.getInt("fontSize");

            // 1、获取所有屏幕设备
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice[] screens = ge.getScreenDevices();


            // 遍历每个屏幕设备并创建全屏水印窗口
            fullScreenWatermarks.clear();
            for (GraphicsDevice screen : screens) {
                fullScreenWatermarks.add(new WatermarkFrame(screen, watermarkText, angle, fontSize, fontType, color, offset));
            }
        } else {
            String fontType = "黑体";
            String color = defaultColor;
            String watermarkText = defaultWatermarkText;
            Integer offset = 200;
            Integer angle = 30;
            Integer fontSize = 36;
            // 1、获取所有屏幕设备
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice[] screens = ge.getScreenDevices();


            // 遍历每个屏幕设备并创建全屏水印窗口
            fullScreenWatermarks.clear();
            for (GraphicsDevice screen : screens) {
                fullScreenWatermarks.add(new WatermarkFrame(screen, watermarkText, angle, fontSize, fontType, color, offset));
            }
        }

import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.geom.AffineTransform;



public class WatermarkFrame extends Frame {
    private static final int WHITE_COLOR_KEY = 0xFF0000; // White color RGB value


    private String watermarkText;

    private Integer angle;

    private Integer fontSize;

    private String fontType;

    private String color;

    private Integer offset;

    private Rectangle screenBounds;

    public WatermarkFrame(GraphicsDevice screen, String watermarkText, Integer angle, Integer fontSize, String fontType, String color, Integer offset) {
        this.angle = angle;
        this.fontSize = fontSize;
        this.fontType = fontType;
        this.color = color;
        this.watermarkText = watermarkText;
        this.offset = offset;
        setUndecorated(true); // 无边框
        setAlwaysOnTop(true); // 始终在最前面
        setType(Window.Type.UTILITY); // 不在任务栏展示窗口

        // 获取屏幕的大小
        screenBounds = screen.getDefaultConfiguration().getBounds();
        setSize(screenBounds.width, screenBounds.height); // 设置窗口宽高
        setLocation(screenBounds.x, screenBounds.y);// 将窗口定位到屏幕的左上角
        setBackground(new Color(0, 0, 0, 0)); // 白色透明背景,最后一个参数是透明度
        // 添加窗口事件
        addComponentListener(new ComponentAdapter() {
            // 窗口展示后触发事件
            @Override
            public void componentShown(ComponentEvent e) {
                // 为窗口透传鼠标交互事件,用的是JNI调用 Windows 的API
                makeClickThrough(WatermarkFrame.this);
            }
        });
        // 设置窗口可见
        setVisible(true);
    }

    @Override
    public void paint(Graphics gra) {
        super.paint(gra);
        Graphics2D g2d = (Graphics2D) gra;

        // 设置水印文本属性
        Font watermarkFont = new Font(fontType, Font.PLAIN, fontSize);
        g2d.setFont(watermarkFont);
        int r = Integer.parseInt(color.substring(0, 2), 16);
        int g = Integer.parseInt(color.substring(2, 4), 16);
        int b = Integer.parseInt(color.substring(4, 6), 16);

        g2d.setColor(new Color(r, g, b, 100));

        // 计算水印文本的宽度和高度
        FontMetrics fontMetrics = g2d.getFontMetrics();
        int textWidth = fontMetrics.stringWidth(watermarkText);
        int textHeight = fontMetrics.getHeight();

        // 设置水印倾斜角度
        double shearAngle = Math.toRadians(-angle); // 设置倾斜角度为30度

        // 计算水印在屏幕上的均匀分布位置
        int offsetX = offset; // 水印之间的水平间距
        int offsetY = offset; // 水印之间的垂直间距
        int rows = screenBounds.height / offsetY;
        int cols = screenBounds.width / offsetX;
        // 绘制水印
        for (int row = 0; row <= rows; row++) {
            for (int col = 0; col <= cols; col++) {
                int x = col * offsetX;
                int y = row * offsetY;

                // 创建 AffineTransform 对象,用于设置倾斜
                AffineTransform orig = g2d.getTransform();
                AffineTransform at = new AffineTransform();
                at.setToRotation(shearAngle, x, y);
                g2d.setTransform(at);
                g2d.drawString(watermarkText, x, y);

                // 恢复原始的 AffineTransform
                g2d.setTransform(orig);
            }
        }

    }

    public static void makeClickThrough(Window window) {
        WinDef.HWND hwnd = new WinDef.HWND(Native.getWindowPointer(window));
        User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE,
                User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE) | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT);
        // 这段 WinUser.LWA_COLORKEY 代表指定颜色透明、WHITE_COLOR_KEY 就是前面定义的白色、 0 就是透明度,表示完全透明
        User32.INSTANCE.SetLayeredWindowAttributes(hwnd, WHITE_COLOR_KEY, (byte) 0, WinUser.LWA_COLORKEY);
    }
}

python实现电脑屏幕水印加开机自启功能 屏幕显示文字类透明水印,数量及透明度等可控,可以简单打为exe可以实现有所位数的 windwos 64,XP 32 等系统上运行,加上域控可以完美显示公司任何人的桌面 而不受影响。 立即下载

相关推荐

新手网工别慌!手把手带你搞定华为OLT开局配置(从登录到业务下发全流程)

本文为新手网络工程师提供华为OLT设备开局配置的详细指南,涵盖从设备登录、基础配置到业务部署的全流程。通过实战案例和常见问题排查,帮助读者快速掌握华为OLT配置技巧,确保业务顺利开通。

weixin_33721344的博客 481

屏幕水印显示组件(窗口水印显示组件)

 开发背景 功能特性 l  水印显示 在特定文档打开时,在顶层窗口显示特定字符信息。警示用户使用文件时小心操作。水印窗口透明,不影响软件正常使用。 其效果如下图所示。 l  操作系统支持 XP、Win7 Win8 Win10 (X86/X64) l  应用软件支持 TXT、Office系列 更多产品请访问 http://www.byte2code

Byte2Code的博客 2835

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 414

谈谈水印实现的几种方式

点击上方前端瓶子君,关注公众号回复算法,加入前端编程面试算法每日一题群遇到问题日常工作中,经常会遇到很多敏感的数据,为防止数据的泄露,我们要在数据上做一些”包装“。目的就是让那些有心泄露...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 549

NVIDIA NCCL 源码解析:从XML拓扑到高性能通信图的构建

本文深入解析了NVIDIA NCCL如何将XML硬件拓扑文件转化为高性能通信图的核心过程。详细阐述了从创建CPU、GPU、NIC等节点,到建立PCIe、NVLink连接,再到计算链路带宽并进行关键排序的完整建图流程。该图是NCCL实现最优通信路径规划、充分发挥NVLink等高速互联性能的基石,直接影响分布式深度学习训练的效率。

convnet3designer的博客 307

基于文件通信的QMT量化交易信号桥接方案设计与实现

在量化交易系统开发中,进程间通信(IPC)是连接不同计算模块、实现策略逻辑与交易执行解耦的关键技术。其核心原理在于允许运行于独立环境或进程的程序安全、可靠地交换数据。文件系统通信作为一种经典的IPC方法,因其实现简单、跨平台兼容性好且数据可持久化,在非高频场景下具有重要技术价值。它尤其适用于需要将外部复杂计算环境(如配备丰富数据科学库的Python环境)与专用交易终端(如迅投QMT)集成的应用场景。通过约定文件路径与数据格式,外部程序可将包含交易指令的JSON信号文件写入特定目录,而交易终端通过轮询或监听机

weixin_28678151的博客 419

Windows10 屏幕水印系统实现

Windows10 屏幕水印系统研究

云天天的专栏 2430

OAI数据集申请下载全攻略:从个人NDA账号注册到数据包下载的保姆级避坑指南

本文提供OAI数据集申请下载的完整指南,涵盖从个人NDA账号注册到数据包下载的全流程。重点解析login.gov验证陷阱、浏览器兼容性问题、NDA权限申请技巧及nda-tools高效使用方法,帮助医学影像研究者避开常见技术障碍,快速获取全球骨关节炎研究数据库OAI的宝贵数据资源。

weixin_28698059的博客 752

数字水印技术

数字水印技术需求背景,原理以及基于dct的代码实践(在matlab中实现数字数字水印的嵌入和提取)

m0_69801999的博客 903

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 734

Windows/Linux双平台指南:3种方法快速释放被占用的GPU内存(含任务管理器替代方案)

本文详细介绍了在Windows和Linux双平台下快速释放被占用GPU内存的3种方法,包括任务管理器替代方案。从基础操作到高阶技巧,帮助用户彻底解决GPU内存驻留问题,提升计算资源利用率。特别适用于深度学习开发者和服务器管理员处理显存泄漏等常见问题。

j0k1l2m3n的博客 262

C# 实现水印

直接上源码 public class WaterTextBox : TextBox     {         //private const int EM_SETCUEBANNER = 0x1501;         //[DllImport("user32.dll", CharSet = CharSet.Auto)]         //private static extern Int32...

xiao521shitou的博客 610

Hermes 教程 05:多 Agent 编排

本文介绍了Hermes v0.13.0中的四种多Agent协作模式:1)delegate_task快速子任务模式,适合2-3个独立并行任务;2)spawn子Agent模式,实现零成本并行多步流水线;3)tmux交互子Agent模式,支持长期自主任务;4)全新Kanban看板系统,提供持久化AI团队协作框架。各模式在隔离级别、时长、工具访问和适用场景上存在差异,其中spawn模式通过独立上下文窗口实现零上下文成本。文章详细说明了每种模式的使用方法、限制条件和典型应用场景,并提供了具体代码示例和可视化流程图。K

程序猿_三产 537

电脑屏幕怎么添加水印

在锁屏界面中,点击“屏幕保护程序”选项,选择一个屏保样式,并在其设置中找到“水印”或“文字”选项,然后输入水印内容并调整相关参数。在这里,您可以设计自己的水印模板,包括选择水印形式(文字、点阵、图片、二维码等)、设置字体、颜色、透明度、位置等参数。这通常涉及到选择“桌面管理”或类似选项,并勾选“显示屏幕水印”或类似选项,然后选择您刚刚设计好的水印模板。如果您的Windows版本支持直接在锁屏界面设置水印,您可以在此界面找到相关选项并输入水印内容,调整字体、颜色和透明度等参数。

shunyou0526的博客 1182

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android 添加水印, 以及屏幕存取

/** * 获取水印 */ try { String s = CustomPreferences.getUserInfo().getAccountNo().substring(7,11); View view = getWindow().getDecorView(); Bitmap bitmap = Bitmap.createBitmap(350, 350, Bi...

dicui3942的博客 273

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

为什么很多公司会强行给员工电脑加屏幕水印?添加水印的五个妙招分享!(企业安全篇)

这些设置将直接影响水印的隐蔽性和可检测性。而在空白或信息密度较低的区域,则可以增加水印的密度,以提高水印的可见度(尽管是隐形的,但在检测时更易识别)。只需打开需要添加水印的文档,点击“插入”选项卡,然后选择“水印”按钮,根据提示进行更多设置,选择系统提供的样式或自定义水印内容即可。在设计水印时,请注意字体的大小、颜色和透明度,确保水印既清晰可见,又不会影响文本的阅读,使其与背景更好地融合。能够快速添加和去除水印,您只需上传需要添加水印的图片,根据提示设置水印的位置、大小和样式,完成后保存图片即可。

2401_86434954的博客 3080

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

如何添加天锐绿盾屏幕水印

希望实现office或者指定进程打开文件的时候,能显示指定的水印内容,该如何设置?1)可自定义设置屏幕水印的类型,支持进程水印和桌面水印。2)可自定义设置屏幕水印的形式,支持文字水印和点阵水印。3)可自定义水印内容、字体大小、颜色和透明度等。控制台添加下权限即可。

qwswuzk的专栏 552

android 添加水印适配,Android 添加水印, 以及屏幕存取

/*** 獲取水印*/try {String s = CustomPreferences.getUserInfo().getAccountNo().substring(7,11);View view = getWindow().getDecorView();Bitmap bitmap = Bitmap.createBitmap(350, 350, Bitmap.Config.ARGB_8888);...

weixin_30641597的博客 358

截当前屏幕/保存图片/添加水印/文件复制

截取当前屏幕内容 int SH = Screen.PrimaryScreen.Bounds.Height;//获取当前屏幕高度 int SW = Screen.PrimaryScreen.Bounds.Width;//获取当前屏幕宽度 Bitmap bit = new Bitmap(SW, SH); Graphics g = Graphics.FromImage(bit); Point point = new Point(0, 0); g.CopyFromScreen(point, new Point.

Tiger_shl的博客 548

Captura屏幕录制水印功能详解:如何添加文字和图片叠加效果

Captura是一款功能强大的开源屏幕录制工具,能够捕获屏幕、网络摄像头、音频、光标、鼠标点击和按键操作。其中,水印叠加功能是Captura最实用的特性之一,允许用户在录制的视频或截图中添加自定义文字和图片水印。本文将详细介绍Captura屏幕录制的水印功能,教你如何轻松添加专业的文字和图片叠加效果。 ## 什么是Captura水印功能? Captura的水印功能(Overlay)允许用户在录

gitblog_00663的博客 710

iOS屏幕截图,裁切图片(制作头像),添加图片水印(Quarz2D)

屏幕截图 //扩展分类使用 @implementation UIImage (Clip) + (instancetype)captureWithView:(UIView *)view { // 1.开启上下文 UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0); // 2.将控制器

邦Ben的专栏 831

JAVA屏幕截图与水印添加程序-HEHEHEScreenshot

为什么80%的码农都做不了架构师?>>> ...

weixin_34168700的博客 408

c++ 屏幕 添加水印_【安卓】视频压缩,倒放,去水印,无水印下载视频的黑科技神器...

小编看到最近许多小伙伴都想要关于短视频解析和图片去水印,添加水印,视频压缩的软件,今天小编就给大家分享出来吧,一款关于图片,视频水印和解析的一切的软件,非常的好用,绝对是黑科技我们看一下软件的主页面,功能非常的齐全,解析视频,屏幕录制,压缩转换添加水印和视频倒放功能应有尽有,而且免费无广告呢首先我们来测试下第一个功能--云端提取,就是短视频无水印解析软件,我们这里以快手短视频平台来测试,...

weixin_34093995的博客 322

电脑屏幕加动态水印软件 ,支持任意位置和添加文字图片

这款电脑屏幕移动水印软件支持文字和图片水印,专为Windows系统设计。用户只需双击安装包即可使用,通过简单的界面设置水印参数(包括文字或图片选择),就能在屏幕上显示移动水印效果。软件完全免费无广告,特别适合需要在录屏时添加水印的用户。注意:它是直接在屏幕上显示水印,而非编辑视频文件。下载链接已提供。

qq_54693727的博客 551

屏幕水印软件怎么给电脑添加水印?先用免费软件试试!

屏幕水印是防止信息泄露的有效工具,可阻止他人随意截屏或拍照传播敏感内容。Curtain MonGuard是一款免费的屏幕水印软件,支持全屏和应用程序水印,操作简单,完全免费且兼容性强,适合企业和个人使用。

2403_88807515的博客 900

批量给员工统一添加屏幕水印?方便管理层的水印工具推荐

本文将详细介绍如何设置Curtain MonGuard屏幕水印,以确保在在线会议中同样显示水印,从而提升企业的数据保护能力。通过简单的步骤,IT专业人员和决策者可以学会如何为屏幕添加水印,并自定义水印内容,确保企业在面对数据泄露风险时能够做到有备无患。

2403_88807515的博客 475
上一篇: office文件加水印(可重复)
下一篇: java实现监听USB(监听器无法生效,估计还是需要通过jna实现)
yhx_java
博客等级 码龄5年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值