C#批量添加水印

 

.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

原文地址:https://www.cnblogs.com/felixwan/p/15742414.html