C#实现给图片加透明度水印

C 给图片加水印 可设置透明度 阅读详情
首先我们强调一下opacity的概念,是“不透明度”,它表示的是两个图层之间的关系,即该属性隶属于本图层,它表示与本图层下面图层之间的像素合成关系,当opacity=100%时,表示本图层完全不透明,因此下面的像素完全被遮挡。当opacity=0时,表示本图层完全透明,即能看到下面的图层。这是photoshop中最基本的一个算法,表达如下:
        像素结果=底部图层*(1-opacity)+本图层*opacity;
        当有多个图层x0,x1,x2混合时,表达如下:(最底层的不透明度为1)
        x=((1-k1)x0+k1*x1)(1-k2)+k2*x2= (1-k1)(1-k2)x0 + k1(1-k2)x1 + k2*x2;

        那么绘制透明度水印的方法也就非常直观了,因为类库中的ImageAttributes属性里面并没有提供像素合成的绘制选项,因此我们自己实现上面的算法。方法是:首先准备一个小的水印图片,我们先把原图在水印下面的部分绘制上去,然后在吧水印的文本或图片绘制上去,然后把原图和水印图片的内存数据锁定(防止操作系统移动内存),然后直接用上面的算法改写原图的位图数据,解锁内存即得到最终加了水印的图片。

      代码如下:下面是绘制文本类型的水印,只需提供水印文本内容,绘制起始坐标即可。注意,为了简单直观起见,代码中都没有做参数验证,例如水印是否超出原图范围,如果超出范围将引发对超过内存边界的访问限制(引发异常)。下面使用了unsafe代码,因此项目属性->Build中,应勾选允许不安全代码,否则无法编译。 在下面代码中的定位方式是非常熟悉的。再次强调的是以下的概念:
      scan0:指针,内存数据的起始地址。(换句话说,就是指向第一个扫描行第一个像素的Blue)。
      bpp:bit per pixel。
      stride:扫描行宽度,=width*bpp/8 并在结尾补0~3个字节的0,以凑齐到4字节整数倍。
      之所以横坐标乘以3是因为我们锁定的方式是24bppRgb(最后一个参数指定了数据的bpp),这意味这每个像素占据了3个字节,因此i要乘以3来跳跃到下一个像素。如果用32bppRGB锁定,则每个像素在内存占据4字节,相应的i应该乘以4。
Code-文本水印
/// <summary>
/// 给一个位图绘制水印文字(没有验证水印是否超出图片边界!)
/// </summary>
/// <param name="text">水印文本</param>
/// <param name="x">起始点</param>
/// <param name="y">起始点</param>
/// <param name="opacity">不透明度,0~1</param>
private Bitmap DrawWatermark(Image image,string text, Font font,Brush brush,int x,int y,double opacity)
{
    Bitmap bm1
= new Bitmap(image);
    Graphics g1
=Graphics.FromImage(bm1);
   
//测量水印文字的大小,然后申请一个新的位图
    SizeF sizef=g1.MeasureString(text,font);
    Bitmap bm2
=new Bitmap((int)sizef.Width,(int)sizef.Height);
    Graphics g2
=Graphics.FromImage(bm2);
    g2.DrawImage(bm1,
0,0,new Rectangle(x, y, bm2.Width, bm2.Height),GraphicsUnit.Pixel);
    g2.DrawString(text,font,brush,
0,0);
    BitmapData data1
=bm1.LockBits(new Rectangle(0,0,bm1.Width,bm1.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
    BitmapData data2
=bm2.LockBits(new Rectangle(0,0,bm2.Width,bm2.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
   
unsafe
    {
       
byte* p1=(byte*)(void*)data1.Scan0;
       
byte* p2=(byte*)(void*)data2.Scan0;
       
for(int j=0;j<bm2.Height;j++)
        {
           
for(int i=0;i<bm2.Width*3;i++)
            {
                p1[(y
+j)*data1.Stride+i]=(byte)(p1[(y+j)*data1.Stride+i]*(1-opacity)+opacity*p2[j*data2.Stride+i]);
            }
        }
        bm1.UnlockBits(data1);
        bm2.UnlockBits(data2);
    }
   
return bm1;
}


还有一种情况是,我们事先做作好水印,它是一个图片,更多的人在photoshop中使用一个自己设计好的logo,保存为一个“画笔形状”,制作时只要选中此画笔一盖就好了。实际上这种类型的水印是一个图片,为了加这种类型的水印,引入下面的overload方法:指定水印图片和透明色。
Code-图片水印
/// <param name="image">原图</param>
/// <param name="wmImg">水印图片</param>
/// <param name="key">透明色</param>
/// <param name="x">起始点</param>
/// <param name="y"></param>
/// <param name="opacity">不透明度</param>
/// <returns></returns>
private Bitmap DrawWatermark(Image image, Bitmap wmImg, Color key,int x, int y, double opacity)
{
    Bitmap bm1
= new Bitmap(image);    //克隆原图,它也是我们的返回值
    Bitmap bm2
= new Bitmap(wmImg.Width, wmImg.Height);    //准备的水印图片
    Graphics g2
= Graphics.FromImage(bm2);
    ImageAttributes att
= new ImageAttributes();
    att.SetColorKey(key, key, ColorAdjustType.Bitmap);    //设定透明色
    g2.DrawImage(bm1,
0, 0, new Rectangle(x, y, bm2.Width, bm2.Height), GraphicsUnit.Pixel);
    g2.DrawImage(wmImg,
new Rectangle(0,0,bm2.Width,bm2.Height),0, 0,bm2.Width,bm2.Height,GraphicsUnit.Pixel,att);
    g2.Dispose();
    。。。。这里的代码和上面的方法代码相同,因此省略
   
return bm1;
}

以上两种效果的截图:
(1)     (2)
         
        源代码的下载链接:(该项目里还包括我对Photoshop中置换滤镜的模拟代码,以及在水波特效控件原理解释那篇文中的水波置换图生成器。)
源代码下载
原文地址: http://www.netcsharp.cn/showtopic-1174.aspx
C#实现图片文字水印功能的类 GDI+(Graphics Device Interface Plus)是微软公司推出的一套用于进行2D图形绘制的API,它是GDI(Graphics Device Interface)的升级版本。GDI+作为.NET Framework的一部分,为开发人员提供了一系列丰富的接口来处理图形图像,包括绘制图形、处理图像、格式转换以及字体和文本的渲染等功能。 阅读详情

相关推荐

C#实现图片水印添加的实战指南

库是.NET Framework中用于处理图像的基础类库,它提供了丰富的工具和接口,使得开发者可以轻松地执行图像的创建、修改、保存等操作。从功能角度来看,主要包括以下几个核心组件:基础类:包含位图(Bitmap)、画刷(Brush)、画笔(Pen)等基本绘图元素。图像处理类:如Image、Icon等,这些类支持对图像进行加载、保存、转换等操作。绘图类:Graphics类负责执行绘图操作,如绘制文本、形状、图像等。在库的结构上,采用了典型的面向对象层次结构,其中。

weixin_42584507的博客 770

给图片加透明度水印的方法(c#)

        刚才在提问区解答了一个问题,即如何给图片加半透明度水印,实际上由于透明度算法是最早被发现也是最简单和基本的算法之一,因此这个方法实际上很直观。这里单独发帖再来解释下这个问题。首先我们强调一下opacity的概念,是“不透明度”,它表示的是两个图层之间的关系,即该属性隶属于本图层,它表示与本图层下面图层之间的像素合成关系,当opacity=100%时,表示本图层完全不透明,因此下面的...

weixin_34100227的博客 368

数据中心——Vxlan基本概念1

东西流量指的就是横向流量-------例如:服务器与服务器之间交换流量南北流量指的就是纵向流量-------例如:客户端和服务器之间的流量以下主要是讲解业务平面的网络架构(一般业务平面就需要用到专用的数据中心交换机)

m0_49864110的博客 1万+

黄聪:C#给图片加水印标记,可设置透明度

&gt; 纯文本方式&gt; 打印 /// &lt;summary&gt;   /// Creating a Watermarked Photograph with GDI+ for .NET   /// &lt;/summary&gt;   /// &lt;param name="rSrcImgPath"&gt;原始图片的物理路径&lt;/param&gt;   ///...

weixin_34080951的博客 300

无人驾驶小车调试笔记(六)-- 车轮校准

简介:小车的动力完全来自于两个电机带动的车轮,在理想状态下,给两个电机同样的驱动参数,两个车轮会以同样的转速带动小车直线行驶,而实际情况是每个电机可能都会有个体差异,也就是说给予同样的驱动参数,表现出的转动速度会有些许不同,两个轮子的差速会导致车辆拐弯,后果就是给了直线行驶的控制命令,但是车走着走着就偏离了原本的方向,所以在开始控制之前,我们需要先平衡两个车轮的转速,保证在同样驱动参数下,两个车轮转速大致相同,也就是可以走直线。 车轮校准分为3步,测试、调整后再测试、保存参...

aibingjin的博客 1820

基于MobileNet⁃DOA的无人机射频信号识别方法

本文提出了一种基于MobileNet-DOA模型的无人机射频信号识别方法,用于解决低信噪比环境下无人机型号和飞行模式识别率低的问题。该方法首先采用变分模态分解(VMD)进行信号预处理以降低噪声干扰,然后通过短时傅里叶变换(STFT)将信号转换为时频图。在模型设计上,将DOConv卷积融入MobileNetv4模型以增强特征提取能力并提高运算速度,同时引入FA注意力机制提升低信噪比环境下的识别精度。实验结果表明,该方法在-15~15dB信噪比范围内的平均识别准确率达到94.83%,显著优于现有方法,特别在-1

qq_43416206的博客 1349

C# 通过Opacity隐藏背景窗体

通过窗体弹出另一个窗体的时候,不想显示背后的窗体,怎么办?当然,可以通过hide()方法来隐藏窗体。这里介绍另一种方法通过控制Opacity,即,通过不透明度来控制窗体隐藏。可以看到每一个窗体的属性中的icon类别中有一项叫做Opacity的选项,他的用途就是改变窗体的透明度,准确的解释为控件的不透明度百分比。它的值是0%-100%,如果是0%就是完全透明,如果是100%就是完全不透明。

C/C#、Android driver、STM32、Linux等等。 864

MT9V034摄像头学习笔记(一)_mt9v034摄像头循迹代码(1)

函数名称:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)* 函数名称:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)* 函数名称:uint8 SCCB_SendByte(uint8 Data)* 函数名称:uint8 SCCB_ReadByte(void)* 修改时间:2018年3月4日。* 修改时间:2018年3月4日。

2401_87555661的博客 907

C# Opacity 不透明度

在 () 应用程序中,控件的透明度可以通过设置 属性来调整。 属性是一个介于 完全透明 到 完全不透明 之间的浮点数。 从版本开始支持透明度设置。 设置按钮的透明度: 动态改变控件的透明度: 使用定时器改变透明度: 在窗体加载时设置透明度: 请注意 中的 属性只影响当前控件,不会影响到其子控件。如果你想要一个控件组或窗体的某些部分透明,你需要单独设置每个控件的 属性。当设置窗体的透明度时,窗体的标题栏和边框也会受到影响,这可能会影响用户的交互体验。因此,使用透明度时需要考虑到用户界面的整体

这是博客描述 1032

RDMA网络通信技术、NCCL集合通讯(GPU)

NCCL 是 NVIDIA 专为 GPU 设计的高性能集合通信库,用于优化多 GPU、多节点间的集体操作(如 AllReduce、Broadcast、AllGather 等),是深度学习分布式训练的核心组件。RDMA 允许计算机直接访问远程内存,无需 CPU 干预,大幅降低了网络通信的延迟和 CPU 开销。常见的 RDMA 实现包括。是两项关键技术,用于优化节点间数据传输效率和大规模并行计算性能。在高性能计算(HPC)、人工智能训练和数据密集型场景中,

weixin_42795092的博客 2421

YOLOv10改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 103

[转]C#实现给图片加透明度水印

首先我们强调一下opacity的概念,是“不透明度”,它表示的是两个图层之间的关系,即该属性隶属于本图层,它表示与本图层下面图层之间的像素合成关系,当opacity=100%时,表示本图层完全不透明,因此下面的像素完全被遮挡。当opacity=0时,表示本图层完全透明,即能看到下面的图层。这是photoshop中最基本的一个算法,表达如下: 像素结果=底部图层*(1-opacity)...

weixin_30456039的博客 304

地下管网巡检机器人:基于YOLOv8与UI界面的智能化系统设计与实现

通过YOLOv8模型的目标检测功能结合实时视频流,我们能够实现对地下管网巡检机器人的智能化控制。系统通过图像识别技术帮助巡检人员快速识别管道中的各种缺陷和障碍物,从而提高巡检效率和准确性。未来,我们可以继续优化模型,增加更多的目标类别,并通过强化学习等方法提高机器人的自主巡检能力。此外,随着硬件技术的发展,未来的巡检机器人可能会具备更强的感知能力和更高的智能水平。

YOLO 529

C#给图片加文字和图片的水印

C#给图片加文字和图片的水印 /// &lt;summary&gt; /// WaterMark 的摘要说明 /// &lt;/summary&gt; /// 图片加水印 /// &lt;param name="strCopyright"&gt;要加入的文字 &lt;/param&gt; ...

这里将承载一段最初的记忆 348

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 191

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何用asp.net来快速的实现添加水印

<br />using System;<br />using System.Drawing;<br />using System.Drawing.Drawing2D;<br />using System.Drawing.Imaging;<br />using System.IO;//用到的名称空间<br />namespace picmark<br />{<br /> /// <summary><br /> ///图片修改类,主要是用来保护图片版权<br /> /// </summary><br /> pu

我的asp.net的专栏http://www.trylb.com 404

IMSL CNL 7.0.0 (x86-64)Crack

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

ASP.NET(C#)图片加文字、图片水印

http://blog.youkuaiyun.com/wonsoft/article/details/4136711 ASP.NET(C#)图片加文字、图片水印 一、图片上加文字: [c-sharp] view plaincopy //using System.Drawing;   //using System.IO;   //using

mituan1234567的专栏 948

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C#给图片加水印文字或图片

/// &lt;summary&gt; /// WaterMark 的摘要说明 /// &lt;/summary&gt; /// 图片加水印 /// &lt;param name="strCopyright"&gt;要加入的文字 &lt;/param&gt; /// &lt;param name="strM...

浅丶巷 2132

C#给图片加水印,可设置透明度

C#给图片加水印,可设置透明度

jiangxinyu的专栏 2万+

C#实现给图 片加透明度水印

[转]C#实现给图 片加透明度水印 首先我们强调一下opacity的概念,是“不透明度”,它表示的 是两个图层之间的关系,即该属性隶属于本图层,它表示与本图层下面图层之间的像素合成关系,当opacity=100%时,表示本图层完全不透明,因此下 面的像素完全被遮挡。当opacity=0时,表示本图层完全透明,即能看到下面的图层。这是photoshop中最基...

290

C#给图片添加水印

C#给图片添加水印

qq_46045403的博客 1603

C# 图片添加水印

调用 WaterMarkHelper.AddWaterMark(@"C:\Users\xxxue\Desktop\QQ图片20180704142029.jpg", @"C:\Users\xxxue\Desktop\123.jpg"); 核心方法 using System; using System.Drawing; using System.Drawing.Drawing2D; using Sy...

极客神殿 2924

C#加水印操作(各种集锦)

1.给图片加水印 public byte[] GetWatermarkPic(byte[] bytes, string txt) { MemoryStream ms = new MemoryStream(bytes); Image pic = System.Drawing.Image.FromStream(ms); //创建一把刷子 //防止索引像素格式引发异常的像素格式 Bitmap bmp = new Bitmap(pic.Width, pic.Height, PixelFormat.Format32b

m0_51159082的博客 5573
上一篇: 关于ASP.NET页面打印技术的总结
下一篇: 设计时属性:设计时属性相关类型
wonsoft
博客等级 码龄23年 228粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值