获取图片路径(图片位置) 压缩比例(压缩比例) 获取输出路径(输出目录) 质量参数(质量参数) 开始(数值输入完毕,点击缩小按钮,开始执行ImageChange类) 根据输入图片和压缩比例计算压缩后图片的宽和高,将原图路径,输出路径,质量参数,宽,高5个参数传递KiSaveAsJPEG压缩类,设置进度条长度为输入图片张数,每完成一张进度条走1 KiSaveAsJPEG压缩类(原图路径,输出路径,质量参数,宽,高) 比例压缩:建立一个宽,高为传递进来的参数的画布,按原图路径将原图按比例重新绘制到画布上 质量压缩:用EncoderParameter接受质量参数,再将质量参数传递给EncoderParameters,使用image.save(保存的文件名及路径,文件格式编码,EncoderParameters)进行压缩保存 将要保存的格式传递进文件编码类ImageCodecInfo 文件格式编码获取类ImageCodecInfo: 建立一个编码数组,将所有编码器信息赋值给数组,使用for循环寻找传递进的 文件格式的编码,返回。
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;
using System.Drawing.Imaging; using System.Text;
using System.Windows.Forms; using System.IO;
using System.Diagnostics;
namespace ImageChange {
public partial class Form1 : Form {
//public bool runing = false; //public int pasttime = 0; //建立计时器
public string[] picpathlist; //建立数组,存放图片路径
private ImageCodecInfo GetCodecInfo(string mimeType) //ImageCodecInfo类的作用是确定文件格式,返回值为格式编码 {
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders(); //将所有格式的编码信息赋给CodecInfo数组
foreach (ImageCodecInfo ici in CodecInfo) //定义一个编码器型参数ici,并建立循环 {
if (ici.MimeType == mimeType) return ici; //返回传递进来的格式的编码 }
return null; }
public string KiSaveAsJPEG(string filePath, string FileName, int Qty, int w, int h)//压缩 {
Image img = Image.FromFile(filePath); //将解码后的image图像赋值给img Bitmap bmb = new Bitmap(w, h); //创建一个宽w长h的位图(画布)
Graphics grap = Graphics.FromImage(bmb); //将要绘制的位图定义为grap。grap继承bmb grap.DrawImage(img, new Rectangle(0, 0, w, h)); //用Rectangle指定一个区域,将img内Rectangle所指定的区域绘制到bmb
EncoderParameter p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality,
Qty);
//EncoderParameter用于存放所有关于当前图片的修改,
//Quality为图片质量参数,Quality 类别指定图像的压缩级别,在用于构造EncoderParameter 时,质量类别的有用值范围为从0 到100。
//指定的数值越低,压缩越高,因此图像的质量越低。值为0 时,图像的质量最差;值为100 时,图像的质量最佳
EncoderParameters ps = new EncoderParameters(1); //EncoderParameters是EncoderParameter类的集合数组
ps.Param[0] = p; //将EncoderParameter中的值传递给EncoderParameters
bmb.Save(FileName, GetCodecInfo(\"image/jpeg\"), ps);
//bmb.Save(String, ImageCodecInfo, EncoderParameters) 将bmb中的图画保存,将string为要保存的文件名及路径,ImageCodecInfo指定要保存的文件格式 return FileName; //img.Dispose(); //bmb.Dispose(); //grap.Dispose();
}
public static string Js(string path) //计算图片大小path为文件路径 {
FileInfo fi = new FileInfo(path.ToString()); //按照path读取图片并保持在fi
int i = Int32.Parse(fi.Length.ToString()); //将长度转换为int,单位为字节 return (i / 1024).ToString(); //返回KB长度 }
public void ImageChange() //判定 { try {
if (txtIn.Text.ToString().Trim() != \"\") {
if (txtOut.Text.ToString().Trim() != \"\") {
if (txtNumber.Text.ToString().Trim() != \"\") {
int j = Int32.Parse(txtNumber.Text); if (j >= 1) {
int i = Int32.Parse(Js(odlgImage.FileName)); if (i > j) {
Stopwatch sw = new Stopwatch(); //计时 sw.Start(); //开始计时
Image img = Image.FromFile(odlgImage.FileName); //将解码后的图像赋给img
int witdh = img.Width * Convert.ToInt32(txtPP.Text) / 100; //获取原图宽按输入比例压缩后的宽 int height = img.Height * Convert.ToInt32(txtPP.Text) / 100; //获取原图高按输入比例压缩后高
pgbOne.Maximum = picpathlist.Length; //定义进度条长度为输入图片个数 pgbOne.Value = 0;
for (int k = 0; k < picpathlist.Length; k++) {
pgbOne.Value = k;
Application.DoEvents(); //挂起主进程,重构表单显示原图大小及压缩后大小 txtFormer.Text = Js(picpathlist[k]).ToString(); //原图大小
string printOut= txtOut.Text.ToString() + \"\\\\\" +; //输出路径
printOut+= picpathlist[k].Substring(picpathlist[k].LastIndexOf('\\\\')); //输出图片名称
string FileName = KiSaveAsJPEG(picpathlist[k].ToString(),printOut , j, witdh, height); //参数含义为:原图路径,输出路径+图片名字,压缩参数,宽,高 txtChange.Text = Js(FileName); //压缩后图片大小 }
pgbOne.Value = 0; sw.Stop(); //停止计时
label9.Text = (Int32.Parse(sw.ElapsedMilliseconds.ToString()) / 1000).ToString() + \"秒\"; //输出用时
}
else MessageBox.Show(\"图片已经小于目标大小,不需压缩!\"); }
else MessageBox.Show(\"请输入压缩比例!\"); }
else MessageBox.Show(\"请输入压缩参数!\"); }
else MessageBox.Show(\"请先选择输出目录!\"); }
else MessageBox.Show(\"请先选择输入目录!\"); }
catch (Exception ex) {
MessageBox.Show(\"错误!\"+ex.Message.ToString()); }
}
public Form1() {
InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
//tmrOne.Start(); }
private void button1_Click(object sender, EventArgs e)//输入目录 {
this.odlgImage.Filter = \"图像类型(*.jpg)|*.jpg|图像类型(*.bmp)|*.bmp|图像类型(*.png)|*.png|图像类型(*.gif)|*.gif|图像类型(*.tif)|*.tif|图像类型(*.wmf)|*.wmf\"; //选择录入的图片的类型 this.odlgImage.ShowDialog(); //打开文件选取控件 }
private void button1_Click_1(object sender, EventArgs e)//输出目录 {
DialogResult result = folderBrowserDialog1.ShowDialog(); //控件运行状态 if (result == DialogResult.OK) //点击确定 {
if (folderBrowserDialog1.SelectedPath.ToString() != \"\") //选择了位置 {
txtOut.Text = folderBrowserDialog1.SelectedPath.ToString();//显示输出路径 } } }
private void btnChange_Click(object sender, EventArgs e) {
ImageChange(); }
private void odlgImage_FileOk(object sender, CancelEventArgs e) {
txtIn.Text = \"\";
for (int i = 0; i < this.odlgImage.FileName.Length; i++)
{
txtIn.Text += this.odlgImage.FileName[i].ToString();
//循环赋值,将所有图片的路径输出
}
picpathlist = odlgImage.FileNames; //将所有图片路径分分别赋值给数组 } } }
不保存的大同小异,把从路径读取保存到指定路径改为从picturebox读取图片输出到另一个picturebox上