• 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

  • 相关阅读:
    js--DOM基本使用
    前端--js基础2
    前端--js基础1
    tcp/udp编程
    关于网络
    异常处理
    装饰器
    1.__new__ 魔术方法 单态(例)模式 __del__ 魔术方法(析构方法) __call__ 魔术方法
    面向对象程序设计及面向对象封装 目录
    script 标签里的 async 和 defer
  • 原文地址:https://www.cnblogs.com/felixwan/p/15742414.html
Copyright © 2020-2023  润新知