圖片壓縮兼修改md5

概述

一個桌面程序,能修改圖片的尺寸和質量,而且經過加水印的方式修改圖片的md5等值。

詳細

 

 

1、程序截圖

TIM截圖20180629143904.jpg

 

2、實現過程

實現思路:

一、編寫界面html

二、編寫具體的按鈕事件c#

三、重點是圖片處理方法,而後將這些方法鏈接到按鈕事件上面測試

四、測試運行。ui

具體代碼以下:spa

一、入口是兩個開始按鈕的監聽事件方法

//選擇圖片所在目錄
private void button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog dialog = new FolderBrowserDialog();
    dialog.Description = "請選擇圖片所在文件夾";
    if (dialog.ShowDialog() == DialogResult.OK)
    {
        if (string.IsNullOrEmpty(dialog.SelectedPath))
        {
            label3.Text = "文件夾路徑不能爲空";
            return;
        }
        label1.Text = dialog.SelectedPath;
        source = dialog.SelectedPath;
        }
}
//選擇圖片所在目錄
private void button2_Click(object sender, EventArgs e)
{
    FolderBrowserDialog dialog = new FolderBrowserDialog();
    dialog.Description = "請選擇輸出文件夾";
    if (dialog.ShowDialog() == DialogResult.OK)
    {
        if (string.IsNullOrEmpty(dialog.SelectedPath))
        {
            label3.Text = "文件夾路徑不能爲空";
            return;
        }
        label2.Text = dialog.SelectedPath;
        output = dialog.SelectedPath;
    }
}

//單層目錄開始按鈕監聽
//按方法用於選擇單個目錄下的全部圖片文件,並調用ApplyWaterMark方法進行圖像處理
private void btnOk_Click(object sender, EventArgs e)
{
    label3.ForeColor = Color.Black;
    if (string.IsNullOrEmpty(source))
    {
        label3.ForeColor = Color.Red;
        label3.Text = "請選擇原文件夾";
        return;
    }
    if (string.IsNullOrEmpty(output))
    {
        label3.ForeColor = Color.Red;
        label3.Text = "請選擇輸出文件夾";
        return;
    }
    var files = Directory.GetFiles(source);
    foreach (var file in files)
    {
        ApplyWaterMark(file, output);
        label3.Text = "正在修改" + file;
    }
    label3.ForeColor = Color.Red;
    label3.Text = "完成";
    source = string.Empty;
    output = string.Empty;
}

//雙層目錄開始按鈕監聽
//該方法用於父目錄下還有一層子目錄,子目錄下才是圖片文件的狀況。能夠批量修改多個文件夾的圖片
private void btnOk2_Click(object sender, EventArgs e)
{
    label3.ForeColor = Color.Black;
    if (string.IsNullOrEmpty(source))
    {
        label3.ForeColor = Color.Red;
        label3.Text = "請選擇原文件夾";
        return;
    }
    if (string.IsNullOrEmpty(output))
    {
        label3.ForeColor = Color.Red;
        label3.Text = "請選擇輸出文件夾";
        return;
    }
    var dirs = Directory.GetDirectories(source); //先打開父目錄
    foreach (var dir in dirs) //遍歷子目錄
    {
        foreach (var file in Directory.GetFiles(dir))
        {
            var dirInfo = new DirectoryInfo(dir);
            var dirName = dirInfo.Name;
            var outputDirName = Path.Combine(output, dirName);
            ApplyWaterMark(file, outputDirName);
            label3.Text = "正在修改" + file;
        }
    }
    label3.ForeColor = Color.Red;
    label3.Text = "完成";
    source = string.Empty;
    output = string.Empty;
}

二、圖像處理的核心代碼

private void ApplyWaterMark(string file, string dir)
{
    try
    {
        var info = new FileInfo(file);
        var name = info.Name;
        Image Im = Image.FromFile(file);
        var rate = (int)compressRate.Value == 0 ? 1 : (int)compressRate.Value;//讀取圖片壓縮控件設置的倍數,最大值10
        var newImage = new Bitmap(Im,Im.Width/rate,Im.Height/rate);//源圖片長寬除以該倍數,縮放圖片
        Graphics g = Graphics.FromImage(newImage);
        // 建立 solid brush 往圖片寫水印
        Brush myBrush = new SolidBrush(Color.FromArgb(1, Color.LightSteelBlue));
        var f = new Font(FontFamily.GenericSerif, 1);
        var x = (int)(coX.Value); //讀取水印座標設置的X軸值
        var y = (int)(coY.Value); //讀取水印座標設置的Y軸值
        g.DrawString(".", f, myBrush, new Point(x, y));
        if (!Directory.Exists(dir)) //建立圖片的輸出目錄
        {
            Directory.CreateDirectory(dir);
        }
        //初始化jpg圖片解碼器
        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        Encoder myEncoder = Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
        
        var qualityNum = quality.Value; //讀取圖片質量控件設置的值,最大值爲100
        EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, (long)qualityNum);
        myEncoderParameters.Param[0] = myEncoderParameter;
        newImage.Save(Path.Combine(dir, name), jpgEncoder, myEncoderParameters);
        
        Im.Dispose();
        newImage.Dispose();
        g.Dispose();
        myBrush.Dispose();
    }
    catch (Exception ex)
    {
        File.AppendAllText("error.txt", dir + "," + ex.Message);
    }
}

private ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
    {
        return codec;
    }
}
    return null;
}

3、項目結構圖

aa41.jpg

 

4、其餘補充

說明:關於壓縮圖片,有時候縮放尺寸更好,有時候下降圖片質量更好,有時候兩個選項配合起來用,具體本身調節!code

下面舉個本身壓縮圖片的例子:orm

原圖片htm

TIM截圖20180629150012.jpg

壓縮後事件

TIM截圖20180629150046.jpg

壓縮了近10倍的大小,可是圖片的各項參數都沒改變,壓縮後的圖片和原圖片同樣清晰。圖片

TIM截圖20180629150214.jpg

壓縮的時候只是將圖片質量(quality)控件的值設置爲50,就達到了這樣的效果。固然,不是每張圖片都是這樣修改,有些圖片可能修改尺寸,而不修改圖片質量更好。

注:本文著做權歸做者,由demo大師發表,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索