应用DEV第三方界面控件制作批量添加水印程序
本次应用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第三方界面控件制作批量添加水印程序的更多相关文章
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
- Dev的WPF控件与VS2012不兼容问题
在只有vs2010环境下Dev的wpf可以在视图模式下显示,但是安装vs2012后无法打开界面的视图模式,报错:无法创建控件实例! 发现是Dev的wpf控件与.net framework 4.5不兼容 ...
- C#使用splitContainer控件制作收缩展开面板
C#使用splitContainer控件制作收缩展开面板 原创 2011年07月19日 17:18:02 标签: c# / object / 扩展 / 测试 15690 最近对Squi ...
- Android下拉涮新第三方通用控件
Android下拉涮新第三方通用控件https://github.com/chrisbanes/Android-PullToRefresh Pull To Refresh Views for Andr ...
- 玩转控件:对Dev中GridControl控件的封装和扩展
又是一年清明节至,细雨绵绵犹如泪光,树叶随风摆动.... 转眼间,一年又过去了三分之一,疫情的严峻让不少企业就跟清明时节的树叶一样,摇摇欲坠.裁员的裁员,降薪的降薪,996的996~~说起来都是泪,以 ...
- 玩转控件:对Dev的GridControl控件扩展
缘由 一切实现来源于需求,目的在于不盲目造轮子,有小伙伴儿在看了<玩转控件:对Dev中GridControl控件的封装和扩展>文章后,私信作者说,因公司业务逻辑比较复杂,展示字段比较多,尤 ...
- 解析大型.NET ERP系统 灵活复杂的界面控件Infragistics WinForms
Infragistics 是.NET平台优秀的控件供应商,囊括了WinForms,ASP.NET,Silverlight,WPF,Windows Phone等所有关于微软.NET技术的界面控件.借助于 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
随机推荐
- inux 内存监控分析
一.free 查看系统总的内存情况 第一部分Mem行: total 内存总数: 3768M used 已经使用的内存数: 3136M free 空闲的内存数: 632M shared 当前已经废弃不用 ...
- [AI开发]DeepStream开发填坑记录
下面是在deepstream使用过程中碰到的一些坑: (1)Pipeline中的Sink如果需要编码存文件或者推rtmp的流,注意控制编码的参数,编码质量不要太高.否则可能Sink带不动,整个Pipe ...
- 解决video.js不兼容ie8问题
使用视频播放器的时候,常常会让兼容一些浏览器问题,比如兼容ie8浏览器.在工作中使用的是video.js. 如果需要兼容,引入两个js库,就可以做到兼容ie8浏览器 <script src=&q ...
- idea自用快捷键(非常实用)
最近看了下idea的快捷键,不禁感慨idea真是太强大了,这里记录一下我常用的快捷键 Ctrl+F:在当前文件中查找 Ctrl+R:替换字符串 Alt + shift + 鼠标点击 多处同时编辑 ...
- 再窥R(包括一个R示例)
一.将输出作为输入——结果的重用 R有个特点,分析的结果可以保存下来,并可以作为进一步分析的输入使用.下面我们通过R中的预先安装好的数据集作为实例(这里只讲述原理,涉及到的统计知识,以后在另外的统计专 ...
- C#线程学习笔记二:线程池中的工作者线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html,记录一下学习过程以备后续查用. 一.线程池基础 首先,创 ...
- 微信小程序的入门
1.申请账号 官网:https://mp.weixin.qq.com/ 2.开发工具 为了帮助开发者简单和高效地开发和调试微信小程序,推出了小程序开发者工具,集成了公众号网页调试和 ...
- Html5 小游戏 俄罗斯方块
导言 在一个风和日丽的一天,看完了疯狂HTML 5+CSS 3+JavaScript讲义,跟着做了书里最后一章的俄罗斯方块小游戏,并做了一些改进,作为自己前端学习的第一站. 游戏效果: 制作思路 因为 ...
- Redis 到底是怎么实现“附近的人”这个功能的呢?
作者简介 万汨,饿了么资深开发工程师.iOS,Go,Java均有涉猎.目前主攻大数据开发.喜欢骑行.爬山. 前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoD ...
- 挖掘Dark Sky Maps(热的要死后,疯传的一个气温地图网站)
最近,各种朋友圈,社会媒体,都在疯传一张图,这张图显示的全球的气温图,本没有什么特别的,但是这张图的网站来源所展示的数据与气象局或者各种天气预报的温度值相差倒是不少,引来一片网友的吐槽. 但是,作为专 ...