.NET Framework:4.5
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Threading; namespace BatchWatermark { public partial class BatchWatermark : Form { private int CurrentTabPage { get; set; } // 当前Tab索引 0或者1 string watermarkImage = ""; // 水印来源图片 string watermarkDir = ""; // 水印来源图片文件夹 string imageDir = ""; // 待添加水印图片文件夹 int watermarkSize = 1; // 水印图片的大小: 1--原像素 2--被添加水印图的百分比 int watermarkPercent = 0; // 水印大小百分比 数字1-100 int imageFolderType = 1; // 添加水印文件夹形式: 1--一级目录 2--二级目录 string imageSaveDir = ""; // 输出文件夹 bool isProcessing = false; private bool overlayImage(string imageFrom, string imageWater, string imageSave) { Image imageBackground = null; Image imageOverlay = null; imageBackground = Image.FromFile(imageFrom); imageOverlay = Image.FromFile(imageWater); int bgWidth = imageBackground.Width; int bgHeight = imageBackground.Height; int overlayWidth = imageOverlay.Width; int overlayHeight = imageOverlay.Height; int coordinateX = bgWidth - overlayWidth; int coordinateY = bgHeight - overlayHeight; bool status = false; if (coordinateX > 0 && coordinateY > 0) { //Console.WriteLine(imageFrom+"---"+bgWidth.ToString()+":"+bgHeight.ToString()); Image img = new Bitmap(bgWidth, bgHeight); using (Graphics gr = Graphics.FromImage(img)) { gr.DrawImage(imageBackground, new Point(0, 0)); gr.DrawImage(imageOverlay, new Point(coordinateX, coordinateY)); gr.Dispose(); } img.Save(imageSave, ImageFormat.Jpeg); status = true; img.Dispose(); } imageBackground.Dispose(); imageOverlay.Dispose(); return status; } private void btnAddWatermark_Click(object sender, EventArgs e) { if (imageDir == "") { MessageBox.Show("请选择待添加水印图片文件夹", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!Directory.Exists(imageDir)) { MessageBox.Show(imageDir+" 文件夹不存在", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!Directory.Exists(imageSaveDir)) { MessageBox.Show(imageSaveDir + " 文件夹不存在", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } char[] charsToTrim = { '.','*', '\\' ,' '}; this.imageDir = this.imageDir.TrimEnd(charsToTrim); this.imageSaveDir = this.imageSaveDir.TrimEnd(charsToTrim); switch (CurrentTabPage) { // 水印来源于同一张图片 case 0: if (watermarkImage == "") { MessageBox.Show("请选择水印图片", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } if (!File.Exists(watermarkImage)) { MessageBox.Show("文件:"+watermarkImage+" 不存在", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } MessageBox.Show("功能未开发", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); break; // 水印来源于文件夹 case 1: //Console.WriteLine(imageFolderType); int count = 0; int successCount = 0; var errorList = new List<string>(); progressBar1.Minimum = 0; var watch = System.Diagnostics.Stopwatch.StartNew(); // the code that you want to measure comes here // Set the initial value of the ProgressBar. progressBar1.Value = 0; // Set the Step property to a value of 1 to represent each file being copied. progressBar1.Step = 1; if (imageFolderType == 1) { //一级目录 DirectoryInfo d = new DirectoryInfo(imageDir); //Assuming your Folder FileInfo[] files = d.GetFiles(); //Getting all files if (files.Length == 0) { MessageBox.Show("待添加水印图片文件夹下没有图片", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int imageLength = files.Length; // Set Maximum to the total number of files to copy. progressBar1.Maximum = imageLength; this.appStart(); foreach (var item in files) { count++; string waterImage = this.watermarkDir + "\\" +item.Name; string imageFrom = item.FullName; if (File.Exists(waterImage)) { string saveFullName = this.imageSaveDir + "\\" + item.Name; if (this.overlayImage(imageFrom, waterImage, saveFullName)) { successCount++; } else { errorList.Add("合成失败:"+imageFrom); } } else { errorList.Add("找不到对应水印图片:" + imageFrom); } progressBar1.PerformStep(); labelProgress.Text = count.ToString() + "/" + imageLength.ToString(); labelProgress.Refresh(); } } if (imageFolderType == 2) { //二级目录 string[] directorieStrings = Directory.GetDirectories(imageDir); if (directorieStrings.Length == 0) { MessageBox.Show("待添加水印图片文件夹下没有文件夹", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int folderCount = directorieStrings.Length; progressBar1.Maximum = folderCount; this.appStart(); foreach (var item in directorieStrings) { count++; string dirName = item.Substring(item.LastIndexOf('\\') + 1); string imageSaveDirSingle = this.imageSaveDir + "\\" + dirName; if (!Directory.Exists(imageSaveDirSingle)) { Directory.CreateDirectory(imageSaveDirSingle); } DirectoryInfo d = new DirectoryInfo(item); FileInfo[] files = d.GetFiles(); foreach (var image in files) { string waterImage = this.watermarkDir + "\\" + dirName + "\\" + image.Name; string imageFrom = image.FullName; if (File.Exists(waterImage)){ string saveFullName = imageSaveDirSingle + "\\" + image.Name; if (this.overlayImage(imageFrom, waterImage, saveFullName)) { successCount++; } else { errorList.Add("合成失败:" + imageFrom); } } else { errorList.Add("找不到对应水印图片:" + imageFrom); } } progressBar1.PerformStep(); labelProgress.Text = "文件夹: "+count.ToString() + "/" + folderCount.ToString(); labelProgress.Refresh(); } } this.appEnd(); this.messageSuccess.Text = count.ToString() + "张添加成功"; this.messageError.Text = errorList.Count.ToString() + "张添加失败"; var errorResult = String.Join("\n", errorList.ToArray()); this.richTextBox1.Text = errorResult;//富文本显示执行错误的文件列表 watch.Stop(); var seconds = watch.ElapsedMilliseconds / 1000; TimeSpan time = TimeSpan.FromSeconds(seconds); string str = time.ToString(@"mm\:ss"); MessageBox.Show("文件处理完毕!耗时:" + str, "", MessageBoxButtons.OK, MessageBoxIcon.Information); break; } } public BatchWatermark() { InitializeComponent(); } private void openFileDialog1_FileOk(object sender, CancelEventArgs e) { } private void fromImage_Click(object sender, EventArgs e) { Console.WriteLine("来源于图片"); } private void fromDirectory_Click(object sender, EventArgs e) { Console.WriteLine("来源于文件夹"); } //点击选择并设置水印图片 private void btnPickImage_Click(object sender, EventArgs e) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = true; fileDialog.Title = "请选择文件"; fileDialog.Filter = "图片格式|*.jpg;*.png"; if (fileDialog.ShowDialog() == DialogResult.OK) { string file = fileDialog.FileName; watermark.ImageLocation = file; watermarkSourceText.Text = file; this.watermarkImage = file; //MessageBox.Show("已选择文件:" + file, "选择文件提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } //点击选择待处理图片文件夹 private void btnOpenImageDir_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "请选择图片来源路径"; if (dialog.ShowDialog() == DialogResult.OK) { string path = dialog.SelectedPath; imageSourceText.Text = path; imageDir = path; } } private void button1_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "请选择图片保存路径"; if (dialog.ShowDialog() == DialogResult.OK) { string path = dialog.SelectedPath; imageSaveText.Text = path; this.imageSaveDir = path; } } //输入百分比 private void percentText_Input(object sender, KeyPressEventArgs e) { if (!(Char.IsNumber(e.KeyChar)) && e.KeyChar != (char)13 && e.KeyChar != (char)8) { e.Handled = true; } } //点击按钮设置水印大小为原像素 private void watermarkSize1_CheckedChanged(object sender, EventArgs e) { this.watermarkSize = 1; percentText.Hide(); } //点击按钮设置水印大小为百分比 private void watermarkSize2_CheckedChanged(object sender, EventArgs e) { this.watermarkSize = 2; percentText.Show(); } //提交按钮 private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { this.CurrentTabPage = tabControl1.SelectedIndex; } //点击打开并设置水印来源文件夹 private void btnOpenWatermarkDir_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "请选择水印文件夹"; if (dialog.ShowDialog() == DialogResult.OK) { string path = dialog.SelectedPath; watermarkDirText.Text = path; this.watermarkDir = path; } } private void Form1_Load(object sender, EventArgs e) { watermarkSize1.Checked = true; percentText.Hide(); this.labelProgress.BackColor = Color.Transparent; this.messageSuccess.Text = ""; this.messageError.Text = ""; this.labelProgress.Text = ""; //初始化测试数据,可删 /* string str1 = @"C:\Users\Admin\Desktop\watermark.jpg"; string str2 = @"D:\Share\comic watermark\water\2073"; string str3 = @"D:\已去水印\2073"; string str4 = @"C:\Users\Admin\Desktop\paste"; watermarkSourceText.Text = str1; this.watermarkImage = str1; imageSourceText.Text = str2; this.imageDir = str2; watermark.ImageLocation = str1; tabControl1.SelectedIndex = 1; watermarkDirText.Text = str3; this.watermarkDir = str3; imageSaveText.Text = str4; this.imageSaveDir = str4; * */ } private void watermarkSourceText_KeyUp(object sender, KeyEventArgs e) { this.watermarkImage = watermarkSourceText.Text; } private void imageSourceText_KeyUp(object sender, KeyEventArgs e) { this.imageDir = imageSourceText.Text; } private void percentText_KeyUp(object sender, KeyEventArgs e) { this.watermarkPercent = int.Parse(percentText.Text); } private void watermarkDirText_KeyUp(object sender, KeyEventArgs e) { this.watermarkDir = watermarkDirText.Text; } private void imageSaveText_KeyUp(object sender, KeyEventArgs e) { this.imageSaveDir = imageSaveText.Text; } //设置文件夹模式 private void radioFolderTypeTop_CheckedChanged(object sender, EventArgs e) { this.imageFolderType = 1; } private void radioFolderTypeSub_CheckedChanged(object sender, EventArgs e) { this.imageFolderType = 2; } private void BatchWatermark_FormClosing(object sender, FormClosingEventArgs e) { if (this.isProcessing) { switch (e.CloseReason) { //应用程序要求关闭窗口 case CloseReason.ApplicationExitCall: e.Cancel = false; //不拦截,响应操作 break; //自身窗口上的关闭按钮 case CloseReason.FormOwnerClosing: MessageBox.Show("软件正在执行中,无法退出", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); e.Cancel = true;//拦截,不响应操作 break; //MDI窗体关闭事件 case CloseReason.MdiFormClosing: e.Cancel = true;//拦截,不响应操作 break; //不明原因的关闭 case CloseReason.None: break; //任务管理器关闭进程 case CloseReason.TaskManagerClosing: e.Cancel = false;//不拦截,响应操作 break; //用户通过UI关闭窗口或者通过Alt+F4关闭窗口 case CloseReason.UserClosing: MessageBox.Show("软件正在执行中,无法退出", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); e.Cancel = true;//拦截,不响应操作 break; //操作系统准备关机 case CloseReason.WindowsShutDown: e.Cancel = false;//不拦截,响应操作 break; default: break; } } else { e.Cancel = false; } } private void appStart() { this.isProcessing = true; this.btnAddWatermark.Enabled = false; this.btnAddWatermark.Text = "处理中"; this.btnAddWatermark.Refresh(); this.progressBar1.Value = 0; this.labelProgress.Text = ""; this.messageSuccess.Text = ""; this.messageError.Text = ""; } private void appEnd() { this.isProcessing = false; this.btnAddWatermark.Enabled = true; this.btnAddWatermark.Text = "确定"; this.btnAddWatermark.Refresh(); } } }
完整代码下载: https://files.cnblogs.com/files/felixwan/BatchWatermark.rar