概述

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

详细

一、程序截图

二、实现过程

实现思路:

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

三、项目结构图

四、其他补充

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

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

原图片

压缩后

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

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

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

图片压缩兼修改md5的更多相关文章

  1. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  2. gulp-imagemin图片压缩----gulp系列(三)

    本节实现图片压缩,在实现压缩前,先配置images任务,设置源目录和输出目录. 在系列(二)代码的基础上,再进行扩展. 1.找到gulp->config.js,对images进行源目录(src- ...

  3. Android 调用jepg库进行图片压缩,保持图片不失真

    1. 浅谈为什么Android和iOS图片质量差距那么大? 首先来说,作为一个安卓狗,机器当然用的是安卓的手机.现在的安卓手机大多数都会以高清拍照,动不动就几千万柔光相机来吸引各种买家.买来后,拍照发 ...

  4. 好久没发贴了,最近捣鼓了个基于node的图片压缩小网站解析。

    看了下,距离上次发帖都是去年10月份的事,忙于工作的我很少跑博客园里面来玩了. 做这个小网站的初衷是 https://tinypng.com/ 这个网站有时候访问很慢,然后自己去研究了下图片压缩. 网 ...

  5. Android 中图片压缩分析(上)

    作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...

  6. android-xBuild apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩

    android-xBuild 是一项集成了apk差分与合成,zip差分与合成,lua打包.apk打包,png/jpg图片压缩五大功能的开源项目 (github地址:https://github.com ...

  7. iOS 图片裁剪与修改

    最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...

  8. Gulp 之图片压缩合并

    同事需要处理很多的图片,由于UI那边提供图片比较大,为了性能好一点,程序包小一点,因此希望我帮忙做成小程序来完成此工作. 其实之前做过一个grunt写的图片压缩合并工具,当时是为了处理270多个国家/ ...

  9. (转)Android学习-使用Async-Http实现图片压缩并上传功能

    (转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...

随机推荐

  1. Pylons Controller里面Session.commit()总是出现rollback

    Pylons Controller里面执行修改数据库表,总是不成功. 然后通过各种手段: 1.js打印返回值 2.不修改表单提交和修改表单提交,结果比较: 3.通过在Pylons Controller ...

  2. ELM320 OBD(PWM) to RS232 Interpreter

    http://elmelectronics.com/DSheets/ELM320DS.pdf

  3. 【ajax 提交表单】多种方式的注意事项 ,serialize()的使用

    在业务中,可能因为表单内容过于庞大,字段过于繁杂,如果人为去拼接的话 ,需要耗费大量的时间和精力,与此同时,代码看上去也是冗余不堪. 所以,提交表单的时候如果能整个表单数据整体提交,那是非常开心的事情 ...

  4. UVa 1329 - Corporative Network Union Find题解

    UVa的题目好多,本题是数据结构的运用,就是Union Find并查集的运用.主要使用路径压缩.甚至不须要合并树了,由于没有反复的连线和改动单亲节点的操作. 郁闷的就是不太熟悉这个Oj系统,竟然使用库 ...

  5. AIR:使用 HTML + Javascript 开发桌面应用

    背景 断断续续用Winform和WPF开发过一些小工具,始终不得其法门,在玩Flex的时候就接触过AIR,最近发现可以用HTML + Javascript开发AIR应用,本文就尝试一下(Hello,W ...

  6. [Hive]使用HDFS文件夹数据创建Hive表分区

    描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...

  7. 利用tca时间聚簇分析方法分析fmri数据

    一.利用ica进行fmri数据分解时,在得到相互独立的成分后,这些成分的后续处理,其实是有很多文章可以做的.比如,对这些成分进行排序和选择.如果能够提出某种方法,能够自动地制造特征,并将这些特征与分解 ...

  8. Android API 中文(14) —— ViewStub

    前言 关键字: android.view.ViewStub,版本为Android 2.2 r1 本章翻译来自唐明 ,这里本博负责整理和发布,欢迎其他译者一起参与Android API 的中文翻译行动, ...

  9. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

  10. 卷积神经网络LeNet Convolutional Neural Networks (LeNet)

    Note This section assumes the reader has already read through Classifying MNIST digits using Logisti ...