本次应用DevExpress和C#语言制作了一个批量添加水印的程序,看界面效果图:

界面中既可以进行文字水印添加,也可以图片水印添加,同时还可以对水印的位置进行设置,比较实用!

文字水印的具体添加情况,看图:

还可以文字的预览:

整个文字水印的预览:

同时图片的水印预览:

最后显示下图片的水印效果:

核心代码部分:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace 添加水印_程序
{
public partial class Form1 : DevExpress.XtraEditors.XtraForm
{
public Form1()
{
InitializeComponent();
} #region 获取系统字体
private void GetSystemFont(ToolStripComboBox cb)
{
InstalledFontCollection myFont = new InstalledFontCollection();
foreach (FontFamily ff in myFont.Families)
{
cb.Items.Add(ff.Name);
}
cb.SelectedItem = "宋体";
}
#endregion private void Form1_Load(object sender, EventArgs e)
{
cbbPosition.SelectedIndex = ;
} string[] ImgArray = null;
string ImgDirectoryPath = null; private void simpleButton4_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
lbImgList.Items.Clear();
ImgArray = openFileDialog1.FileNames; string ImgP = ImgArray[].ToString(); ImgP = ImgP.Remove(ImgP.LastIndexOf("\\")); ImgDirectoryPath = ImgP;
for (int i = ; i < ImgArray.Length; i++)
{
string ImgPath = ImgArray[i].ToString(); string ImgName = ImgPath.Substring(ImgPath.LastIndexOf("\\") + , ImgPath.Length - ImgPath.LastIndexOf("\\") - );
//MessageBox.Show(ImgName);
lbImgList.Items.Add(ImgName);
}
tsslStatus.Text = "图片总数:" + lbImgList.Items.Count;
}
} private void listBoxControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (lbImgList.SelectedItems.Count > )
{
tsslText.Text = "图片位置:" + ImgDirectoryPath + "\\" + lbImgList.SelectedItems[].ToString();
}
}
private void btnPreview_Click(object sender, EventArgs e)
{
if (lbImgList.Items.Count > )
{
if (rbTxt.Checked)
{
if (txtWaterMarkFont.Text != "" && txtSavaPath.Text.Trim() != "")
{
AddFontWatermark(txtWaterMarkFont.Text.Trim(), lbImgList.Items[].ToString(), );
Frm_Browser frm2 = new Frm_Browser();
frm2.ig = BigBt;
frm2.ShowDialog();
}
}
else
{
if (txtWaterMarkImg.Text != "" && txtSavaPath.Text != "")
{
ChangeAlpha();
AddFontWatermark(txtWaterMarkFont.Text.Trim(), lbImgList.Items[].ToString(), );
Frm_Browser frm2 = new Frm_Browser();
frm2.ig = BigBt;
frm2.ShowDialog();
}
}
}
}
private void trackBar1_Enter(object sender, EventArgs e)
{
lbImgList.Focus();
}
private void btnSelect_Click(object sender, EventArgs e)
{ if (openFileDialog2.ShowDialog() == DialogResult.OK)
{
txtWaterMarkImg.Text = openFileDialog2.FileName;
//MessageBox.Show(txtWaterMarkImg.Text); if (rbPIC.Checked == true)
{
ChangeAlpha();
pbImgPreview.Image = Image.FromFile(txtWaterMarkImg.Text.Trim());
}
} }
private void rbTxt_CheckedChanged(object sender, EventArgs e)
{
trackBar1.Enabled = false;
if (rbPIC.Checked)
pbImgPreview.Image = null;
} private void rbPIC_CheckedChanged(object sender, EventArgs e)
{
trackBar1.Enabled = true;
if (rbTxt.Checked)
{ pbImgPreview.Image = null; }
}
private void txtWaterMarkFont_TextChanged(object sender, EventArgs e)
{
if (lbImgList.Items.Count <= )
{
MessageBox.Show("请加载图片", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
AddFontWatermark(txtWaterMarkFont.Text.Trim(), lbImgList.Items[].ToString(), );
pbImgPreview.Image = bt;
} } private void simpleButton7_Click(object sender, EventArgs e)
{
Application.Exit();
} Bitmap effect;
Bitmap source;
Image new_img; private void ChangeAlpha()
{
pbImgPreview.Refresh();
source = new Bitmap(Image.FromFile(txtWaterMarkImg.Text.Trim()));
if (source.Width <= )
effect = new Bitmap(, );
else
{
Image.GetThumbnailImageAbort callb = null;
//对水印图片生成缩略图,缩小到原图得1/4
new_img = source.GetThumbnailImage(source.Width / , source.Width / , callb, new System.IntPtr());
effect = new Bitmap(this.new_img.Width, this.new_img.Height);
}
Graphics _effect = Graphics.FromImage(effect);
float[][] matrixItems ={
new float[]{,,,,},
new float [] {,,,,},
new float []{,,,,},
new float []{,,,,},
new float[]{,,,trackBar1.Value/255f,}
}; ColorMatrix imgMatrix = new ColorMatrix(matrixItems);
ImageAttributes imgEffect = new ImageAttributes();
imgEffect.SetColorMatrix(imgMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
if (source.Width <= )
{
_effect.DrawImage(source, new Rectangle(, , , ), , , , , GraphicsUnit.Pixel, imgEffect);
}
else
{
_effect.DrawImage(new_img, new Rectangle(, , new_img.Width, new_img.Height), , , new_img.Width, new_img.Height, GraphicsUnit.Pixel, imgEffect);
}
pbImgPreview.Image = effect;
} private void trackBar1_ValueChanged(object sender, EventArgs e)
{
if (rbPIC.Checked && txtWaterMarkImg.Text.Trim() != "")
ChangeAlpha();
}
private void btnPerform_Click(object sender, EventArgs e)
{
if (rbTxt.Checked && txtSavaPath.Text != "" && txtWaterMarkFont.Text != "")
{
for (int i = ; i < lbImgList.Items.Count; i++)
{
AddFontWatermark(txtWaterMarkFont.Text.Trim(), lbImgList.Items[i].ToString(), );
}
MessageBox.Show("添加水印成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
if (rbPIC.Checked && txtSavaPath.Text != "" && pbImgPreview.Image != null)
{
for (int i = ; i < lbImgList.Items.Count; i++)
{
AddFontWatermark(txtWaterMarkFont.Text.Trim(), lbImgList.Items[i].ToString(), );
}
MessageBox.Show("添加水印成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
} }
string NewFolderPath; private void button2_Click(object sender, EventArgs e)
{ if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
txtSavaPath.Text = folderBrowserDialog1.SelectedPath;
NewFolderPath = txtSavaPath.Text.Trim();
}
}

有兴趣的可自己尝试下!!!

应用DEV第三方界面控件制作批量添加水印程序的更多相关文章

  1. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  2. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  3. Dev的WPF控件与VS2012不兼容问题

    在只有vs2010环境下Dev的wpf可以在视图模式下显示,但是安装vs2012后无法打开界面的视图模式,报错:无法创建控件实例! 发现是Dev的wpf控件与.net framework 4.5不兼容 ...

  4. C#使用splitContainer控件制作收缩展开面板

    C#使用splitContainer控件制作收缩展开面板 原创 2011年07月19日 17:18:02 标签: c# / object / 扩展 / 测试 15690         最近对Squi ...

  5. Android下拉涮新第三方通用控件

    Android下拉涮新第三方通用控件https://github.com/chrisbanes/Android-PullToRefresh Pull To Refresh Views for Andr ...

  6. 玩转控件:对Dev中GridControl控件的封装和扩展

    又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动.... 转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一样,摇摇欲坠.裁员的裁员,降薪的降薪,996的996~~说起来都是泪,以 ...

  7. 玩转控件:对Dev的GridControl控件扩展

    缘由 一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了<玩转控件:对Dev中GridControl控件的封装和扩展>文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤 ...

  8. 解析大型.NET ERP系统 灵活复杂的界面控件Infragistics WinForms

    Infragistics 是.NET平台优秀的控件供应商,囊括了WinForms,ASP.NET,Silverlight,WPF,Windows Phone等所有关于微软.NET技术的界面控件.借助于 ...

  9. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

    在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...

随机推荐

  1. MySQL Event历史记录

    需求 SQL Server的作业历史(Job)记录是保存在msdb库中的,很方便就查询相关的Job定义,计划和历史记录,而MySQL的event却没有历史记录.为方便查看event是否正常执行以及执行 ...

  2. Vim 基本的使用

    三种模式 按 ESC 进入命令模式 命令模式下输入 Shift + : 进入末行模式 命令模式下输入插入命令,如(i,a,o) 进入输入模式 进入 vim 文件名 vim直接编辑一个文件,如果是已经存 ...

  3. asp.net core web应用以服务的方式安装运行

    目录 一.方案:使用Microsoft.Extensions.Hosting.WindowsServices实现: 一.方案:使用Microsoft.Extensions.Hosting.Window ...

  4. Java之数据库表字段有关键字报错java.sql.SQLSyntaxErrorException

    前两天在开发中遇到一个坑,本来我在快乐的做着增删改查,然后悲剧发生了,在查询数据库的过程中,报了java.sql.SQLSyntaxErrorException: 经过排查,是因为数据库表字段中存在关 ...

  5. Linux流量监控工具iftop & nload

    本文简单介绍和演示Linux下两款流量监控工具iftop 和 nload的使用. 环境 # cat /etc/redhat-release CentOS Linux release (Core) # ...

  6. Prometheus学习系列(九)之Prometheus 联盟、迁移

    前言 本文来自Prometheus官网手册 和 Prometheus简介 FEDERATION 允许Prometheus服务器从另一台Prometheus服务器抓取选定的时间序列. 一,用例 联盟有不 ...

  7. [springMvc]常见配置

    [springMvc]常见配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  8. 微信小程序——表单验证插件WxValidate的二次封装(终极版)

    微信小程序表单验证前面的两篇文章做的效果总感觉都有点不太友好,第一篇里的效果是将错误信息通过对话框形式弹出来,这种形式在web形式下早已经淘汰了:第二篇是一次性全部显示所有的错误,然后3秒后自动消失, ...

  9. windows下安装mysql教程

    1.下载安装包-根据自己电脑系统选择合适的版本: https://dev.mysql.com/downloads/mysql/ 2.配置环境变量 2.1 解压所下载的压缩包 2.2 环境变量 win ...

  10. Keepalived集群软件高级使用(工作原理和状态通知)

    1.介绍 Keeaplived主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived),有此需求者可参考以往博文:http://lizhenlia ...