Jpegoptim Tool

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Diagnostics;

using System.IO;



namespace JpegoptimTool

{

    public partial class Compress : Form

    {

        #region [init define var]

        /// <summary>

        /// Define Process 

        /// </summary>

        private Process myProcess;



        /// <summary>

        /// Define Stream Writer

        /// </summary>

        private StreamWriter myWriter;



        /// <summary>

        /// Define Method Invoker

        /// </summary>

        private MethodInvoker myMethodInvoker;



        /// <summary>

        /// Define String Output

        /// </summary>

        private string myCurrentOutput;

        #endregion



        #region [Construct Compress]

        public Compress()

        {

            InitializeComponent();

            myCurrentOutput = string.Empty;

            myMethodInvoker = new MethodInvoker(ShowOutput);

            myProcess = new Process();

            myProcess.OutputDataReceived += MyProcessOutputDataReceived;



            InitializeControlSize();

        }



        /// <summary>

        /// Initialize Control Size

        /// </summary>

        private void InitializeControlSize()

        {

            int count = Controls.Count * 2 + 2;

            float[] factor = new float[count];

            int i = 0;

            factor[i++] = Size.Width;

            factor[i++] = Size.Height;

            foreach (Control ctrl in this.Controls)

            {

                factor[i++] = ctrl.Location.X / (float)Size.Width;

                factor[i++] = ctrl.Location.Y / (float)Size.Height;

                ctrl.Tag = ctrl.Size;

            }

            Tag = factor;

        }



        /// <summary>

        /// 每次使用的都是最初始的控件大小,保证准确无误。

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void Compress_Resize(object sender, EventArgs e)

        {

            float[] scale = (float[])Tag;

            int i = 2;



            foreach (Control ctrl in this.Controls)

            {

                ctrl.Left = (int)(Size.Width * scale[i++]);

                ctrl.Top = (int)(Size.Height * scale[i++]);

                ctrl.Width = (int)(Size.Width / (float)scale[0] * ((Size)ctrl.Tag).Width);

                ctrl.Height = (int)(Size.Height / (float)scale[1] * ((Size)ctrl.Tag).Height);

            }

        }



        #endregion



        #region [My Process OutPut Data Received]

        /// <summary>

        /// My Process OutPut Data Received

        /// </summary>

        /// <param name="sender">Sender</param>

        /// <param name="e">DataReceivedEventArgs</param>

        void MyProcessOutputDataReceived(object sender, DataReceivedEventArgs e)

        {

            myCurrentOutput = e.Data;

            BeginInvoke(myMethodInvoker);

        }

        #endregion



        #region [Show Result in OutPut]

        /// <summary>

        /// Show OutPut

        /// </summary>

        private void ShowOutput()

        {

            if (!String.IsNullOrEmpty(myCurrentOutput.Trim()) && !_txtOutput.Text.Contains(myCurrentOutput.Trim()))

            {

                _txtOutput.Text += @"压缩详细输出结果--" + myCurrentOutput + "\r\n";   

                _txtOutput.Refresh();

            }

        }

        #endregion



        #region [Start Process]

        /// <summary>

        /// Start Process

        /// </summary>

        private void StartProcess()

        {

            ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");

            processStartInfo.CreateNoWindow = true;

            processStartInfo.RedirectStandardInput = true;

            processStartInfo.RedirectStandardOutput = true;

            processStartInfo.UseShellExecute = false;



            myProcess.StartInfo = processStartInfo;

            myProcess.Start();

            myWriter = myProcess.StandardInput;

            myProcess.BeginOutputReadLine();

        }

        #endregion



        #region [Select File include Pic And Compress Pic]

        /// <summary>

        /// Compress Image Pic

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnSelectFile_Click(object sender, EventArgs e)

        {

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

            {

                if (MessageBox.Show(@"请先备份您要压缩的图片,压缩期间请不要关闭工具。确实要压缩目录" + folderBrowserDialog1.SelectedPath + @"下的所有图片吗?"

                   , "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)

                {

                    try

                    {

                        labSourceFilePath.Text = folderBrowserDialog1.SelectedPath;

                        if (labSourceFilePath.Text.Trim().Contains(txtCompressPath.Text.Trim()))

                        {

                            MessageBox.Show(@"您选择压缩后文件存放路径和源文件夹重复,为了防止覆盖,请重新选择!", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                        }

                        else

                        {

                            int intSum = 0;

                            txtPerNum_MouseLeave();

                            int intCompressNum =

                                int.Parse(System.Configuration.ConfigurationManager.AppSettings["CompressPer"].ToString());

                            int.TryParse(txtPerNum.Text.Trim(), out intCompressNum);

                            string[] filearray = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.jpg", SearchOption.AllDirectories);

                            if (filearray != null && filearray.Length > 0)

                            {

                                btnSelectFile.Enabled = false;

                                compressProgressBar.Visible = true;

                                compressProgressBar.Minimum = 0;

                                compressProgressBar.Maximum = filearray.Length;

                                compressProgressBar.BackColor = Color.Green;



                                StartProcess();

                                _txtOutput.Text += @"开始压缩您选择的目录" + folderBrowserDialog1.SelectedPath + @"下文件夹中的" + filearray.Length + @"个JPG图片. " + "\r\n";

                                if (myWriter != null)

                                {

                                    foreach (var item in filearray)

                                    {

                                        _txtOutput.Text += @"当前压缩图片的路径--" + item + "\r\n";



                                        string strAimDir = GenerateDirBySourceDirAndAimDir(item);





                                        myWriter.WriteLine(Path.Combine(Environment.CurrentDirectory, "jpegoptim.exe") +

                                                                               @" --strip-com --strip-exif --strip-iptc -m" +

                                                                               intCompressNum.ToString() +

                                                                               " -o " + item + " -d " + strAimDir);

                                        compressProgressBar.Value++;

                                        intSum++;

                                    }

                                }



                            }

                            else

                            {

                                MessageBox.Show(@"文件夹中没有找到要压缩的图片(jpg)!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            }

                            _txtOutput.Text += @"目录" + folderBrowserDialog1.SelectedPath + @"下压缩选择文件夹下JPG图片完毕!共压缩了:" + intSum.ToString() + @"个图片文件。" + "\r\n";

                            

                            btnSelectFile.Enabled = true;



                            if (!string.IsNullOrEmpty(_txtOutput.Text))

                            {

                                string txtPath = GetTxtPath();

                                WriteLog(_txtOutput.Text, txtPath);

                            }

                            MessageBox.Show(@"图片压缩完成", "", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }

                    }

                    catch (Exception ex)

                    {

                        if (myProcess != null)

                        {

                            myProcess.Close();

                            myProcess.Dispose();

                            myProcess.Kill();

                        }

                        MessageBox.Show(@"压缩失败---" + ex,"", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }



                }

            }

        }



        /// <summary>

        /// GenerateDir By SourceDir And AimDir

        /// </summary>

        /// <param name="item"></param>

        /// <returns></returns>

        private string GenerateDirBySourceDirAndAimDir(string item)

        {

            string[] f = item.Split('\\');

            string s = string.Empty;

            for (int i = 1; i < f.Length-1; i++)

            {

                if (!string.IsNullOrEmpty(s))

                {

                    s += "//";

                }

                s += f[i];

            }

            string strP = Path.Combine(txtCompressPath.Text, s);



            if(!Directory.Exists(strP))

            {

                Directory.CreateDirectory(strP);

            }

            return strP.Replace("//","\\");

        }



        #endregion



        #region [Email] 

        /// <summary>

        /// Email

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private  void linkLabelEmail_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

        {

            Process.Start("mailto:[email protected] ");

        }

        #endregion



        #region [Log]

        /// <summary>

        /// Write Log

        /// </summary>

        private void WriteLog(string strContent, string txtPath)

        {

            using (FileStream fileStream = new FileStream(txtPath, FileMode.Create, FileAccess.ReadWrite))

            {

                using (StreamWriter sw = new StreamWriter(fileStream))

                {

                    sw.WriteLine("Start------------------------------" + System.DateTime.Now.ToString() + "-------------------------------Start");

                    sw.WriteLine(strContent);

                    sw.WriteLine("End--------------------------------" + System.DateTime.Now.ToString() + "---------------------------------End");

                    sw.Flush();

                    sw.Close();

                    sw.Dispose();

                    fileStream.Close();

                }

            }

            

        }



        /// <summary>

        /// Get Txt Path

        /// </summary>

        /// <returns></returns>

        private string GetTxtPath()

        {

            string strDir = System.Configuration.ConfigurationManager.AppSettings["Log"].ToString();

            if (!Directory.Exists(strDir))

            {

               DirectoryInfo d =  Directory.CreateDirectory(strDir);

            }

            string txtPath = strDir + DateTime.Now.ToShortDateString().Replace(@"/", "-") + @".txt";

            if (!File.Exists(txtPath))

            {

                using (File.Create(txtPath))

                {

                    FileAttributes fileAttributes = File.GetAttributes(txtPath);

                    if (fileAttributes.ToString().IndexOf("ReadOnly") >= 0)

                    {

                        File.SetAttributes(txtPath, FileAttributes.Archive);

                    }

                }

                

            }

            return txtPath;

        }



        #endregion



        #region [CompressFile Dir]

        /// <summary>

        /// Select Compress Pic File New Dir

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnCompressFile_Click(object sender, EventArgs e)

        {

            if (folderBrowserDialog2.ShowDialog() == DialogResult.OK)

            {

                if (MessageBox.Show(@"请确认选择压缩后存放的文件夹路径为:" + folderBrowserDialog2.SelectedPath, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)

                {

                    txtCompressPath.Text = folderBrowserDialog2.SelectedPath;

                    if (!txtCompressPath.Visible)

                    {

                        txtCompressPath.Visible = true;

                        txtCompressPath.ReadOnly = true;

                    }

                }

            }

        }

        #endregion



        #region [Per Num Text Changed]

        /// <summary>

        /// Per Num Changed

        /// </summary>

        private void txtPerNum_MouseLeave()

        {

            int intPer = 95;

            try

            {

                if (string.IsNullOrEmpty(txtPerNum.Text.Trim()) ||!int.TryParse(txtPerNum.Text.Trim(), out intPer))

                {

                    MessageBox.Show(@"图片压缩比设置有误请确认,如果不设置将以默认压缩比95进行压缩.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                }

            }

            catch (Exception)

            {

                MessageBox.Show(@"系统出现异常,请通过疑问反馈联系我们.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);

                throw;

            }

        }

        #endregion

    }

}

 

 图片压缩工具。

你可能感兴趣的:(tool)