您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页C#实现图像压缩

C#实现图像压缩

来源:华拓科技网


获取图片路径(图片位置) 压缩比例(压缩比例) 获取输出路径(输出目录) 质量参数(质量参数) 开始(数值输入完毕,点击缩小按钮,开始执行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上

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务