本次应用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. Redis集群与分布式介绍以及搭建Redis-Cluster

    1 Redis集群 1.1 什么是集群 集群就是很多服务器组成的一个网络.指的是将多台服务器集中在一起,实现同一业务. 1.2 为什么要集群 一台服务器不能满足开发需要的时候,需要多台服务器来支持.这 ...

  2. CAD绘图效率低?教你4个CAD绘图技巧,绘图效率提升十倍

    CAD绘图一直是一个谜一样的存在,说它简单吧,很多人都无法完全精通,说它难吧,很多人也都自学成才了. 如何学好CAD绘图是个难题,但是老话说的好,只要思想不滑坡,办法总比困难多,掌握以下这些CAD绘图 ...

  3. CSS 选择器、字体/文本、背景

    CSS的基本使用 直接写在标签内 <p style="color: red; font-size: 40px;">段落</p> 写在 style 标签内 & ...

  4. iOS开发集成支付宝支付、支付宝&微信支付

    支付宝支付: 参考链接:https://www.jianshu.com/p/60175e525c0e https://blog.csdn.net/zhonggaorong/article/detail ...

  5. 62-Weave 网络结构分析

    上一节我们安装并创建了 Weave 网络,本节将部署容器并分析网络结构. 在 host1 中运行容器 bbox1: eval $(weave env) docker run --name bbox1 ...

  6. 通知advice

    基于注解的Spring AOP开发,来自https://www.cnblogs.com/junzi2099/p/8274813.html 1.定义目标类接口和实现类 2.编写Spring AOP的as ...

  7. Webpack 一些概念

    目录 引子 Dependency Graph Runtime Manifest Module.Bundle.Chunk Bundle Splitting Code Splitting Tree Sha ...

  8. SecureCRT远程连接The remote system refused the connection问题

    今天用SecureCRT远程连接Linux(Centos 7)时,连不上,报错The remote system refused the connection.于是就百度,首先查看sshd服务有没有启 ...

  9. 东芝半导体最新ARM开发板——TT_M3HQ开箱评测

    前言 最近从面包板社区申请到一块东芝最新ARM Cortex-M3内核的开发板--TT_M3HQ,其实开发板收到好几天了,这几天一直在构思怎么来写这第一篇评测文章,看大家在社区也都发了第一篇评测,我也 ...

  10. BearerToken之JWT的介绍

    Bearer认证 HTTP提供了一套标准的身份验证框架:服务器可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供身份验证凭证.质询与应答的工作流程如下:服务器端向客户端返回40 ...