zhaozengliang 发表于 2024-3-14 09:29

C#实现水印功能分享

本帖最后由 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.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就行,代码直接贴下面,开始没贴,忘了



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;
                }


    }
}
结束

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


flyer_2001 发表于 2024-5-20 14:06

Maxmeteor 发表于 2024-3-18 10:53
感谢楼主,测试了下可用的
不过我测试的代码,我怀疑文字绘制区域宽度可能不够,会导致水印内容缺少最后一 ...

            // 测量出字体的宽高
            SizeF sf = grph.MeasureString(text, font);
            width = (int)Math.Ceiling(sf.Width);
            height = (int)Math.Ceiling(sf.Height);
把测量字体的代码改成上述即可

dingstudio 发表于 2024-4-9 20:38

请问楼主或各路大神 有人能实现全屏盲水印吗 现在我有几台win系统的个人vdi系统打算对外开放 想要使用这个技术 网上看到只有python相关的盲水印实现 而且也只是图片相关的处理 有相关的案例吗

Chui2i 发表于 2024-3-14 11:18

收藏收藏学到了!:$qqq

wasd12 发表于 2024-3-14 11:23

感谢分享,收藏夹里待着吧

河洲雎鸠 发表于 2024-3-14 11:25

感谢分享,收藏夹里待着吧

TENTICE 发表于 2024-3-14 11:38


感谢分享{:1_927:}

柊痕 发表于 2024-3-14 11:48

感谢分享

ThemanRonin 发表于 2024-3-14 12:07

发个效果图啊,有效果图吗??

zhaozengliang 发表于 2024-3-14 14:41

ThemanRonin 发表于 2024-3-14 12:07
发个效果图啊,有效果图吗??

已修改,贴出来了,等审核

careyyu 发表于 2024-3-14 14:58

感谢分享

roncis 发表于 2024-3-14 15:22

感谢分享,支持一下!
页: [1] 2 3
查看完整版本: C#实现水印功能分享