• 图片压缩兼修改md5


    概述

    一个桌面程序,能修改图片的尺寸和质量,并且通过加水印的方式修改图片的md5等值。

    详细

     

    一、程序截图

    TIM截图20180629143904.jpg

    二、实现过程

    实现思路:

    1、编写界面

    2、编写具体的按钮事件

    3、重点是图片处理方法,然后将这些方法连接到按钮事件上面

    4、测试运行。

    具体代码如下:

    1、入口是两个开始按钮的监听事件方法

    //选择图片所在目录
    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;
    }

    2、图像处理的核心代码

    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;
    }

    三、项目结构图

    aa41.jpg

    四、其他补充

    说明:关于压缩图片,有时候缩放尺寸更好,有时候降低图片质量更好,有时候两个选项配合起来用,具体自己调节!

    下面举个自己压缩图片的例子:

    原图片

    TIM截图20180629150012.jpg

    压缩后

    TIM截图20180629150046.jpg

    压缩了近10倍的大小,但是图片的各项参数都没改变,压缩后的图片和原图片一样清晰。

    TIM截图20180629150214.jpg

    压缩的时候只是将图片质量(quality)控件的值设置为50,就达到了这样的效果。当然,不是每张图片都是这样修改,有些图片可能修改尺寸,而不修改图片质量更好。

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    右键菜单:锁到任务栏丢失 修复
    检测到鼠标时自动禁用触摸板 (注:仅适用于个别笔记本)
    清除右键菜单CMD入口
    VBS编辑字段
    VBS创建数据表
    VBS创建数据库
    QTP操作论坛回复编辑框----webelement
    数字排序
    对应键盘的ASCII码(备忘)
    将字符串打乱输出
  • 原文地址:https://www.cnblogs.com/demodashi/p/9452992.html
Copyright © 2020-2023  润新知