吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 645|回复: 20
收起左侧

[C&C++ 原创] C#实现水印功能分享

  [复制链接]
zhaozengliang 发表于 2024-3-14 09:29
本帖最后由 zhaozengliang 于 2024-3-14 14:39 编辑

一、废话不多说,直接上源码,主窗口调用水印窗口方法
        private void CheckScreen()
        {
            if (_screenNum == Screen.AllScreens.Length)
                return;
            if (Screen.AllScreens.Length >= 1)
            {
                // 屏幕数目发生变化
                if (_screenNum != Screen.AllScreens.Length)
                {
                    // 移除之前的水印窗口
                    for (int iIndex = _watermarkWinList.Count - 1; iIndex >= 0; iIndex--)
                    {
                        _watermarkWinList[iIndex].Dispose();
                        _watermarkWinList.RemoveAt(iIndex);
                    }
                    _screenNum = Screen.AllScreens.Length;
                }
                // 设置显示内容
                SetShowContent();
            }
        }
        private void SetShowContent()
        {
            // 遍历所有屏幕
            foreach (Screen sc in Screen.AllScreens)
            {
                // 创建水印窗口
                WaterMarkWin watermarkWin = new WaterMarkWin(sc, currentUser);
                // 显示水印窗口
                watermarkWin.Show();
                _watermarkWinList.Add(watermarkWin);
            }
        }

二、主窗口加载时开始调用,主程序窗体最小化及设置窗口为最小化,用户名只是例子显示本机Windows的用户名,根据需要自动调整
public Form1()
{
    InitializeComponent();

    // 不在任务栏中显示
    this.ShowInTaskbar = false;
    // 设置窗口为最小化
    this.WindowState = FormWindowState.Minimized;
    // 获取当前登录用户名
    currentUser = System.Environment.GetEnvironmentVariable("USERNAME");

    //开启画水印
    CheckScreen();
}


三、水印窗口就是一个原始窗口加一个pictureBox就行,代码直接贴下面,开始没贴,忘了
image.png


using System;
using System.Drawing;
using System.Windows.Forms;

namespace TestUSB2
{
    public partial class WaterMarkWin : Form
    {
                public Screen _sc;
                public string _userName;

        public WaterMarkWin()
        {
            InitializeComponent();
        }

                public WaterMarkWin(Screen sc, string UserName)
                {
                        _sc = sc;
                        _userName = UserName;
                        InitializeComponent();

                        // 最顶层现实窗口
                        this.TopMost = true;
                        // 窗口不再任务栏中显示
                        this.ShowInTaskbar = false;
                        // 设置透明区域颜色
                        this.TransparencyKey = Color.Lime;
                        // 设置窗口的边框样式
                        this.FormBorderStyle = FormBorderStyle.None;
                        // 设置窗口最大化
                        this.WindowState = FormWindowState.Maximized;
                        // 设置窗口背景色
                        this.BackColor = Color.Lime;
                        // 设置水印
                        CreateWatermark();
                }


                private void CreateWatermark()
                {
                        // 清除所有水印
                        pictureBox1.Controls.Clear();
                        // 水印内容
                        string watermarkContent = Environment.MachineName + " " + System.Environment.UserDomainName;
                        // 创建水印图片
                        Image img = CreateImage(watermarkContent, 20);
                        // 工作区域宽度
                        int maxWidth = _sc.WorkingArea.Width;
                        int maxHeight = _sc.WorkingArea.Height;
                        // 可以绘制的列数
                        int cols = maxWidth / img.Width;
                        // 可以位置的行数
                        int rows = maxHeight / img.Height;

                        for (int col = 0; col <= cols; col++)
                        {
                                for (int row = 0; row <= rows; row++)
                                {
                                        // 创建图片对象
                                        PictureBox pic = new PictureBox();
                                        // 要绘制的图片
                                        pic.Image = img;
                                        // 图片宽度
                                        pic.Width = img.Width;
                                        // 图片高度
                                        pic.Height = img.Height;
                                        // 图片显示的位置
                                        pic.Left = col * pic.Width;
                                        pic.Top = row * pic.Height;

                                        pictureBox1.Controls.Add(pic);
                                }
                        }
                        // 主动回收内存
                        GC.Collect();
                }
                /// <summary>
                /// 生成文字图片
                /// </summary>
                /// <param name="text"></param>
                /// <param name="isBold"></param>
                /// <param name="fontSize"></param>
                public Image CreateImage(string text, int fontSize)
                {
            // 宽度
            int width = 40;
            // 高度
            int height = 20;
                        Font font = new Font("微软雅黑", fontSize, FontStyle.Regular);
                        //Font font = new Font("微软雅黑", fontSize, (FontStyle)0x6);

                        // 定义单色画笔
                        SolidBrush brush = new SolidBrush(Color.Gray);
            //SolidBrush brush = new SolidBrush(Color.FromArgb(255,));
            // 设置显示字符串格式
            StringFormat format = new StringFormat(StringFormatFlags.NoClip);
                        // 字符串水平对齐方式
                        format.Alignment = StringAlignment.Center;
                        // 字符串垂直对齐方式
                        format.LineAlignment = StringAlignment.Center;
                        // 创建Graphics对象
                        Graphics grph = Graphics.FromImage(new Bitmap(1, 1));
                        // 解决绘制闪烁
                        grph.Clear(this.BackColor);
                        // 测量出字体的宽高
                        SizeF sf = grph.MeasureString(text, font);
                        width = Convert.ToInt32(sf.Width);
                        height = Convert.ToInt32(sf.Height);
                        int bitmapWidth = height > width ? height : width;
                        bitmapWidth = (int)(bitmapWidth * 1.2);
                        // 创建位图对象(此处按照最大的宽或高进行设置,是为防止在进行字符串旋转后,字符串显示区域不够)
                        Bitmap image = new Bitmap(bitmapWidth, bitmapWidth);
                        // 根据实际的位图对象创建
                        grph = Graphics.FromImage(image);
                        // 将绘制原点偏移到(0,width),不进行偏移,则以(0,0)点作为绘制原点
                        grph.TranslateTransform(0, width);
                        // 旋转绘制的图形以(0,width)为圆心
                        grph.RotateTransform(-45);
                        // 指定文本的呈现模式
                        /*
                        * ClearType: 由美国微软公司在其Windows操作系统中提供的荧幕字体平滑工具,让Windows字体更加漂亮。ClearType主要是针对LCD 液晶 显示器设计,
                        * 可提高文字的清晰度。基本原理是,将显示器的R, G, B各个次像素也发光,让其色调进行微妙调整,可以达到实际分辨率以上(横方向分辨率的三倍)
                        * 的纤细文字的显示效果
                        */
                        grph.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
                        // 用于渲染抗锯齿和 ClearType 文本的伽马校正值(32是随便写的)
                        // grph.TextContrast = 32;
                        // 指定直线、 曲线和已填充区域的边缘是否使用平滑处理(也称为抗锯齿).当是路径渐变画笔不遵守平滑模式
                        // grph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        // InterpolationMode的指决定了如何计算两点之间的插补值
                        // grph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        // 指定如何将合成图像绘制到此 Graphics。复合模式确定从源映像的像素是覆盖(SourceCopy)还是组合(SourceOver, 需要使用半透明、混合叠加效果时使用)使用背景像素。默认值为 SourceOver。
                        // grph.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
                        // 设置绘制到此 Graphics 的合成图像的呈现质量
                        // grph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

                        // 实际要绘制的区域的大小
                        RectangleF rect = new RectangleF(0, 0, width, height);
                        // 绘制字符串
                        grph.DrawString(text, font, brush, rect, format);
                        // 释放对象
                        grph.Dispose();
                        // 返回绘制好的image对象
                        return image;
                }


    }
}
结束

有要效果图的,贴一下,颜色,字体,大小,倾斜,等都可以改


1710398104887.jpg

免费评分

参与人数 5吾爱币 +4 热心值 +4 收起 理由
dingstudio + 1 + 1 用心讨论,共获提升!
wuchen9527 + 1 + 1 我很赞同!
AK471 + 1 用心讨论,共获提升!
柊痕 + 1 + 1 我很赞同!
tianyu925 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dingstudio 发表于 2024-4-9 20:38
请问楼主或各路大神 有人能实现全屏盲水印吗 现在我有几台win系统的个人vdi系统打算对外开放 想要使用这个技术 网上看到只有python相关的盲水印实现 而且也只是图片相关的处理 有相关的案例吗
 楼主| zhaozengliang 发表于 2024-4-11 15:13
dingstudio 发表于 2024-4-9 20:38
请问楼主或各路大神 有人能实现全屏盲水印吗 现在我有几台win系统的个人vdi系统打算对外开放 想要使用这个 ...

这个方面我也在研究,隐形水印在图片方面还是还是比较成熟的,但是作为一个屏保水印还是有很大难度的,而且想要还原出水印内容也很困难,截屏的还好,拍照的更难。
Chui2i 发表于 2024-3-14 11:18
wasd12 发表于 2024-3-14 11:23
感谢分享,收藏夹里待着吧
河洲雎鸠 发表于 2024-3-14 11:25
感谢分享,收藏夹里待着吧
TENTICE 发表于 2024-3-14 11:38

感谢分享
柊痕 发表于 2024-3-14 11:48
感谢分享
eric5315 发表于 2024-3-14 11:58
收藏收藏学到了!
ThemanRonin 发表于 2024-3-14 12:07
发个效果图啊,有效果图吗??
 楼主| zhaozengliang 发表于 2024-3-14 14:41
ThemanRonin 发表于 2024-3-14 12:07
发个效果图啊,有效果图吗??

已修改,贴出来了,等审核
careyyu 发表于 2024-3-14 14:58
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 00:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表