C#.NET windows控件实现水印
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#.NET windows控件实现水印相关的知识,希望对你有一定的参考价值。
参考技术A Windows控件在Web下的引用 首先我们建立一个window控件 项目名称为EditImagePint 然后
我们把项目下的UserControl cs改为ImagePint cs 切记文件名和构造函数都改!
先制作界面 首先在设计模式下 我们将一个PictureBox拖放到解面上 命名为pictureBox
下面我们转入代码页 也就是ImagePint cs
我们需要引用的对象有 using System;using System Collections;using System ComponentModel;using System Drawing;using System Data;using System Windows Forms;using System IO;using System Net;
然后我们写一个函数
private void ImagePint_Load(object sender System EventArgs e)/*具体代码我们下面介绍*/
这个函数 是为了在web页面使用时候加载使用的
然后我们看控件自己的生成代码 把this Load += new System EventHandler(this ImagePint_Load);加如InitializeComponent()中#region 组件设计器生成的代码
/// /// 设计器支持所需的方法 不要使用代码编辑器 /// 修改此方法的内容 /// private void InitializeComponent()this pictureBox = new System Windows Forms PictureBox();this SuspendLayout();// // pictureBox // this pictureBox Location = new System Drawing Point( );this pictureBox Name = pictureBox ;this pictureBox TabIndex = ;this pictureBox TabStop = false;// // ImagePint// this Controls Add(this pictureBox );this Name = ImagePint ;//看到了吗?很明显 先面的是我们加上去的this Load += new System EventHandler(this ImagePint_Load);this ResumeLayout(false);
#endregion
有了这些东西 组件就可以在web下使用了 但是既然是水印 就应该有原始图片 和水印图片 及一些其他的参数 这里我们就用公共函数 至于web怎么把值传进去 我们到下面再说
#region 公共属性
//显示宽度public int ImgWidhtget return _ImgWidth;set _ImgWidth = value;
//显示高度public int ImgHeightget return _ImgHeight;set _ImgHeight = value;
//透明度private int Alphaget return _Alpha;set _Alpha = value;
//主图片地址public string ZPictureget return _ZPicture;set _ZPicture = value;
//水印图片地址public string FPictureget return _FPicture;set _FPicture = value;
#endregion
下面把完整的代码贡献给大家
代码拷贝框 using System;using System<fp class=\'fp-6u1wv\'></fp>Collections;using System<fp class=\'fp-jrh3l\'></fp>ComponentModel;using System<fp class=\'fp-46co0\'></fp>Drawing;using System<fp class=\'fp-6u1wv\'></fp>Data;using System<fp class=\'fp-ir9zx\'></fp>Windows<fp class=\'fp-46co0\'></fp>Forms;using System<fp class=\'fp-jrh3l\'></fp>IO;using System<fp class=\'fp-6u1wv\'></fp>Net;namespace EditImagePint /// <summary> /// UserControl<fp class=\'fp-2norb\'></fp> 的摘要说明<fp class=\'fp-fk4z2\'></fp> /// </summary> public class ImagePint : System<fp class=\'fp-ir9zx\'></fp>Windows<fp class=\'fp-46co0\'></fp>Forms<fp class=\'fp-jrh3l\'></fp>UserControl /// <summary> /// 必需的<a _blank<fp class=\'fp-107o5\'></fp>>设计</a>器变量<fp class=\'fp-3ivmu\'></fp> /// </summary> private System<fp class=\'fp-46co0\'></fp>ComponentModel<fp class=\'fp-jrh3l\'></fp>Container ponents = null; public ImagePint() // 该调用是 Windows<fp class=\'fp-jrh3l\'></fp>Forms 窗体设计器所必需的<fp class=\'fp-ybmj6\'></fp> InitializeComponent(); // TODO: 在 InitComponent 调用后添加任何初始化 /// <summary> /// 清理所有正在使用的资源<fp class=\'fp-fk4z2\'></fp> /// </summary> protected override void Dispose( bool disposing ) if( disposing ) if( ponents != null ) ponents<fp class=\'fp-46co0\'></fp>Dispose(); base<fp class=\'fp-46co0\'></fp>Dispose( disposing ); #region 组件设计器生成的代码 /// <summary> /// 设计器支持所需的方法 <fp class=\'fp-16ygi\'></fp> 不要使用代码编辑器 /// 修改此方法的内容<fp class=\'fp-ybmj6\'></fp> /// </summary> private void InitializeComponent() this<fp class=\'fp-46co0\'></fp>pictureBox<fp class=\'fp-naa43\'></fp> = new System<fp class=\'fp-46co0\'></fp>Windows<fp class=\'fp-jrh3l\'></fp>Forms<fp class=\'fp-46co0\'></fp>PictureBox(); this<fp class=\'fp-46co0\'></fp>SuspendLayout(); // // pictureBox<fp class=\'fp-naa43\'></fp> // this<fp class=\'fp-jrh3l\'></fp>pictureBox<fp class=\'fp-x5mm4\'></fp><fp class=\'fp-ir9zx\'></fp>Location = new System<fp class=\'fp-46co0\'></fp>Drawing<fp class=\'fp-jrh3l\'></fp>Point(<fp class=\'fp-lrm6f\'></fp><fp class=\'fp-g8k18\'></fp> <fp class=\'fp-gr3w3\'></fp>); this<fp class=\'fp-6u1wv\'></fp>pictureBox<fp class=\'fp-x5mm4\'></fp><fp class=\'fp-46co0\'></fp>Name = <fp class=\'fp-61so8\'></fp>pictureBox<fp class=\'fp-x5mm4\'></fp><fp class=\'fp-aduwd\'></fp>; this<fp class=\'fp-46co0\'></fp>pictureBox<fp class=\'fp-kfx6r\'></fp><fp class=\'fp-46co0\'></fp>TabIndex = <fp class=\'fp-gr3w3\'></fp>; this<fp class=\'fp-jrh3l\'></fp>pictureBox<fp class=\'fp-2norb\'></fp><fp class=\'fp-ir9zx\'></fp>TabStop = false; // // ImagePint // this<fp class=\'fp-jrh3l\'></fp>Controls<fp class=\'fp-jrh3l\'></fp>Add(this<fp class=\'fp-46co0\'></fp>pictureBox<fp class=\'fp-2norb\'></fp>); this<fp class=\'fp-6u1wv\'></fp>Name = <fp class=\'fp-bd212\'></fp>ImagePint<fp class=\'fp-aduwd\'></fp>; this<fp class=\'fp-6u1wv\'></fp>Load += new System<fp class=\'fp-ir9zx\'></fp>EventHandler(this<fp class=\'fp-ir9zx\'></fp>ImagePint_Load); this<fp class=\'fp-jrh3l\'></fp>ResumeLayout(false); #endregion private Bitmap sImage; private int sWidth; private int sHeight; private int _ImgWidth; private System<fp class=\'fp-ir9zx\'></fp>Windows<fp class=\'fp-6u1wv\'></fp>Forms<fp class=\'fp-jrh3l\'></fp>PictureBox pictureBox<fp class=\'fp-naa43\'></fp>; private int _ImgHeight; private int _Alpha; private string _ZPicture = String<fp class=\'fp-46co0\'></fp>Empty; private string _FPicture = String<fp class=\'fp-jrh3l\'></fp>Empty; #region 公共属性 //显示宽度 public int ImgWidht get return _ImgWidth; set _ImgWidth = value; //显示高度 public int ImgHeight get return _ImgHeight; set _ImgHeight = value; //透明度 private int Alpha get return _Alpha; set _Alpha = value; //主图片地址 public string ZPicture get return _ZPicture; set _ZPicture = value; //水印图片地址 public string FPicture get return _FPicture; set _FPicture = value; #endregion private void ImagePint_Load(object sender<fp class=\'fp-56ktp\'></fp> System<fp class=\'fp-ir9zx\'></fp>EventArgs e) string sourceFile = _ZPicture; string waterMarkFile = _FPicture; //string sourceFile = @<fp class=\'fp-107o5\'></fp><fp class=\'fp-bd212\'></fp>; //string waterMarkFile = @<fp class=\'fp-107o5\'></fp><fp class=\'fp-107o5\'></fp>; sImage = tmpImage(sourceFile); //sImage<fp class=\'fp-6u1wv\'></fp>Width = _ImgWidth==<fp class=\'fp-mmu1y\'></fp>?sImage<fp class=\'fp-46co0\'></fp>Width:_ImgWidth; //sImage<fp class=\'fp-46co0\'></fp>Height = _ImgHeight==<fp class=\'fp-lrm6f\'></fp>?sImage<fp class=\'fp-jrh3l\'></fp>Height:_ImgHeight; sWidth = _ImgWidth==<fp class=\'fp-gr3w3\'></fp>?sImage<fp class=\'fp-6u1wv\'></fp>Width:_ImgWidth; sHeight = _ImgHeight==<fp class=\'fp-gr3w3\'></fp>?sImage<fp class=\'fp-jrh3l\'></fp>Height:_ImgHeight; this<fp class=\'fp-46co0\'></fp>Width = sWidth; this<fp class=\'fp-ir9zx\'></fp>Height = sHeight; pictureBox<fp class=\'fp-2norb\'></fp><fp class=\'fp-6u1wv\'></fp>Width = sWidth; pictureBox<fp class=\'fp-kfx6r\'></fp><fp class=\'fp-jrh3l\'></fp>Height = sHeight; this<fp class=\'fp-46co0\'></fp>MakeWaterImage(waterMarkFile); public Bitmap tmpImage(string strUrl) Bitmap bitmap; if(strUrl<fp class=\'fp-ir9zx\'></fp>IndexOf(<fp class=\'fp-61so8\'></fp><fp class=\'fp-bd212\'></fp>)<<fp class=\'fp-lrm6f\'></fp>) bitmap = new Bitmap(strUrl); return bitmap; else WebClient webClient = new WebClient(); Stream data = webClient<fp class=\'fp-6u1wv\'></fp>OpenRead(strUrl); bitmap = new Bitmap(data); return bitmap; //方法作用:生成水印图片 //sourceFile:要生成水印的图片文件 //WaterMarkFile:存放水印的图片文件 public void MakeWaterImage(string waterMarkFile) try //水印图 Bitmap wImage = tmpImage(waterMarkFile); int wWidth = wImage<fp class=\'fp-6u1wv\'></fp>Width; int wHeight = wImage<fp class=\'fp-46co0\'></fp>Height; //make Graphics<fp class=\'fp-6u1wv\'></fp> Graphics g = Graphics<fp class=\'fp-ir9zx\'></fp>FromImage(sImage); int x; //临时变量 int y; //监时变量 int x<fp class=\'fp-naa43\'></fp>; //原图和水印图的宽度差 int y<fp class=\'fp-2norb\'></fp>; //原图和水印图的高度差 int w; //生成的水印图的宽度 int h; //生成的水印图的高度 int al; //alpha int rl; //Red int gl; //Green int bl; //Blue if(sWidth > wWidth) x<fp class=\'fp-kfx6r\'></fp> = sWidth <fp class=\'fp-th *** g\'></fp> wWidth; y<fp class=\'fp-2norb\'></fp> = sHeight <fp class=\'fp-th *** g\'></fp> wHeight; w = wWidth; h = wHeight; else x<fp class=\'fp-naa43\'></fp> = <fp class=\'fp-mmu1y\'></fp>; y<fp class=\'fp-naa43\'></fp> = <fp class=\'fp-lrm6f\'></fp>; w = sWidth; h = sHeight; //开始绘图 for(x = <fp class=\'fp-naa43\'></fp>; x < w; x++) for(y = <fp class=\'fp-naa43\'></fp>; y < h; y++) al = wImage<fp class=\'fp-ir9zx\'></fp>GetPixel(x<fp class=\'fp-g8k18\'></fp>y)<fp class=\'fp-ir9zx\'></fp>A; rl = wImage<fp class=\'fp-ir9zx\'></fp>GetPixel(x<fp class=\'fp-56ktp\'></fp>y)<fp class=\'fp-46co0\'></fp>R; gl = wImage<fp class=\'fp-46co0\'></fp>GetPixel(x<fp class=\'fp-g8k18\'></fp>y)<fp class=\'fp-jrh3l\'></fp>G; bl = wImage<fp class=\'fp-jrh3l\'></fp>GetPixel(x<fp class=\'fp-56ktp\'></fp>y)<fp class=\'fp-ir9zx\'></fp>B; al = _Alpha==<fp class=\'fp-gr3w3\'></fp>?<fp class=\'fp-zz2lc\'></fp><fp class=\'fp-gr3w3\'></fp>:_Alpha; if(rl + <fp class=\'fp-l3e9x\'></fp><fp class=\'fp-qaocl\'></fp> < <fp class=\'fp-k3649\'></fp><fp class=\'fp-7dhov\'></fp><fp class=\'fp-qaocl\'></fp>) rl += <fp class=\'fp-cwit2\'></fp><fp class=\'fp-qaocl\'></fp>; if(gl + <fp class=\'fp-k3649\'></fp><fp class=\'fp-qaocl\'></fp> < <fp class=\'fp-v4hjb\'></fp><fp class=\'fp-xcdeh\'></fp><fp class=\'fp-qaocl\'></fp>) gl += <fp class=\'fp-v4hjb\'></fp><fp class=\'fp-7dhov\'></fp>; if(bl + <fp class=\'fp-k3649\'></fp><fp class=\'fp-xcdeh\'></fp> < <fp class=\'fp-cwit2\'></fp><fp class=\'fp-qaocl\'></fp><fp class=\'fp-qaocl\'></fp>) bl += <fp class=\'fp-v4hjb\'></fp><fp class=\'fp-7dhov\'></fp>; g<fp class=\'fp-jrh3l\'></fp>DrawEllipse(new Pen(new SolidBrush(Color<fp class=\'fp-6u1wv\'></fp>FromArgb(al<fp class=\'fp-8p5pj\'></fp>rl<fp class=\'fp-g8k18\'></fp>gl<fp class=\'fp-56ktp\'></fp>bl)))<fp class=\'fp-g8k18\'></fp>x<fp class=\'fp-naa43\'></fp>+x<fp class=\'fp-56ktp\'></fp>y<fp class=\'fp-kfx6r\'></fp>+y<fp class=\'fp-gkc4q\'></fp><fp class=\'fp-2norb\'></fp><fp class=\'fp-gkc4q\'></fp><fp class=\'fp-2norb\'></fp>); g<fp class=\'fp-6u1wv\'></fp>Save(); pictureBox<fp class=\'fp-naa43\'></fp><fp class=\'fp-46co0\'></fp>Image = sImage; catch(Exception ex) MessageBox<fp class=\'fp-46co0\'></fp>Show(ex<fp class=\'fp-46co0\'></fp>Message); [Ctrl+A 全部选择 然后拷贝]
然后我们把这个控件生成一个Release版本 然后把生成的dll文件copy到你的虚拟目录下 然后就是web调用了 我们先建立一个虚拟目录 比如说我们建立的虚拟目录及地址为 localhost/Object/ImagePrint/我们就把生成的 EditImagePint dll 文件copy到这个目录下并建立一个文件 把以下的代码放进去
<object id= print classid=//localhost/Object/ImagePrint/EditImagePint dll#EditImagePint ImagePint Width= Height= VIEWASTEXT ><param name= ImgWidht value= ><param name= ImgHeight value= ><param name= Alpha value= ><param name= ZPicture value= ><param name= FPicture value= ></object>
看到了把 这些param就是我们的公共属性了 ) 这样就把值传递进去了
最终显示如下
对不起大家 目前还不支持GIF
lishixinzhi/Article/program/net/201311/13537
C#/VB.NET 如何在 Excel 中添加水印
在工作中,为了防止文件被随意复制和传播,通常我们会选择在文档中添加水印来对文件进行有效保护。文字水印是比较常见的一种保护手段,它可以有效防止文件被任意复制和随意打印传播。不过,Excel 默认并没有水印功能。此时,我们可以把插入的艺术字作为水印,将水印和工作表融合在一起,以防止文档被复制传播。那么如何轻松实现在 Excel 中添加水印呢?别着急,我给大家整理了一个高效便捷的方法,通过编程方式达到此目的。下面是我整理的具体步骤,并附上 C#/VB.NET 代码供大家参考。
程序环境:
本次测试时,在程序中引入 Spire.XLS.dll 文件。
方法 1:
将 Free Spire.XLS for .NET 下载到本地,解压,找到 BIN 文件夹下的 Spire.XLS.dll。然后在 Visual Studio 中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径 BIN 文件夹下的 dll 文件添加引用至程序。
方法 2:
通过NuGet安装。可通过以下 2 种方法安装:
- 可以在 Visual Studio 中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理 NuGet 包”,然后搜索“Free Spire.XLS”,点击“安装”。等待程序安装完成。
- 将以下内容复制到 PM 控制台安装。
Install-Package FreeSpire.XLS -Version 12.7 在 Excel 中添加水印
在 Excel 中添加水印
以下是详细步骤:
- 创建 Workbook 类的实例。
- 使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
- 创建字体并定义文本。
- 遍历 Excel 文件中的所有工作表。
- 使用 DrawWatermarkImage() 方法创建基于文本的水印图像。
- 通过 Worksheet.PageSetup.LeftHeaderImage 属性将图片设置为每个工作表左页眉的图像源。
- 将 Worksheet.PageSetup.LeftHeader 属性设置为“&G”,在左侧标题部分显示图像。
- 将工作表的查看模式更改为页面布局,以便查看水印。
- 使用 Workbook.SaveToFile() 方法保存结果文件。
完整代码
C#
using Spire.Xls;
using System.Drawing;
namespace AddWatermark
class Program
static void Main(string[] args)
//初始化 Workbook 类的实例并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.LoadFromFile("示例文档.xlsx");
//创建字体
Font font = new Font("宋体", 40);
//定义文本
string watermark = "内部使用";
//遍历文件中的所有工作表
foreach (Worksheet sheet in workbook.Worksheets)
//调用 DrawWatermarkImage() 方法根据文本创建图像
Image imgWtrmrk = DrawWatermarkImage(watermark, font, Color.LightCoral, Color.White, sheet.PageSetup.PageHeight, sheet.PageSetup.PageWidth);
//将图像添加到每个工作表的左侧标题部分
sheet.PageSetup.LeftHeaderImage = imgWtrmrk;
sheet.PageSetup.LeftHeader = "&G";
//将工作表的查看模式更改为页面布局以查看水印
sheet.ViewMode = ViewMode.Layout;
//保存结果文件
workbook.SaveToFile("添加水印.xlsx", ExcelVersion.Version2013);
private static Image DrawWatermarkImage(string text, Font font, Color textColor, Color backColor, double height, double width)
//创建具有指定宽度和高度的图像
Image img = new Bitmap((int)width, (int)height);
//从图像创建一个 Graphics 对象
Graphics drawing = Graphics.FromImage(img);
//获取文字的大小
SizeF textSize = drawing.MeasureString(text, font);
//通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(((int)width - textSize.Width) / 2, ((int)height - textSize.Height) / 2);
//应用旋转
drawing.RotateTransform(-45);
//通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(-((int)width - textSize.Width) / 2, -((int)height - textSize.Height) / 2);
//绘制背景
drawing.Clear(backColor);
//为文本创建画笔
Brush textBrush = new SolidBrush(textColor);
//将文本绘制到图形的中心位置
drawing.DrawString(text, font, textBrush, ((int)width - textSize.Width) / 2, ((int)height - textSize.Height) / 2);
drawing.Save();
return img;
VB.NET
Imports Spire.Xls
Imports System.Drawing
Namespace AddWatermark
Friend Class Program
Private Shared Sub Main(ByVal args As String())
初始化 Workbook 类的新实例并加载 Excel 文件
Dim workbook As Workbook = New Workbook()
workbook.LoadFromFile("示例文档.xlsx")
创建字体
Dim font As Font = New Font("宋体", 40)
定义文本
Dim watermark = "内部使用"
遍历文件中的所有工作表
For Each sheet As Worksheet In workbook.Worksheets
调用 DrawWatermarkImage() 方法根据文本创建图像
Dim imgWtrmrk As Image = DrawWatermarkImage(watermark, font, Color.LightCoral, Color.White, sheet.PageSetup.PageHeight, sheet.PageSetup.PageWidth)
将图像添加到每个工作表的左侧标题部分
sheet.PageSetup.LeftHeaderImage = imgWtrmrk
sheet.PageSetup.LeftHeader = "&G"
将工作表的查看模式更改为页面布局以查看水印
sheet.ViewMode = ViewMode.Layout
Next
保存结果文件
workbook.SaveToFile("添加水印.xlsx", ExcelVersion.Version2013)
End Sub
Private Shared Function DrawWatermarkImage(ByVal text As String, ByVal font As Font, ByVal textColor As Color, ByVal backColor As Color, ByVal height As Double, ByVal width As Double) As Image
创建具有指定宽度和高度的图像
Dim img As Image = New Bitmap(width, height)
从图像创建一个 Graphics 对象
Dim drawing As Graphics = Graphics.FromImage(img)
获取文字的大小
Dim textSize As SizeF = drawing.MeasureString(text, font)
通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform((CInt(width) - textSize.Width) / 2, (CInt(height) - textSize.Height) / 2)
应用旋转
drawing.RotateTransform(-45)
通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(-(CInt(width) - textSize.Width) / 2, -(CInt(height) - textSize.Height) / 2)
绘制背景
drawing.Clear(backColor)
为文本创建画笔
Dim textBrush As Brush = New SolidBrush(textColor)
将文本绘制到图形的中心位置
drawing.DrawString(text, font, textBrush, (CInt(width) - textSize.Width) / 2, (CInt(height) - textSize.Height) / 2)
drawing.Save()
Return img
End Function
End Class
End Namespace
效果图
—本文完—
以上是关于C#.NET windows控件实现水印的主要内容,如果未能解决你的问题,请参考以下文章