1、Bitmap类提供了Save函数用来保存图像,其中:Save(String, ImageCodecInfo, EncoderParameters)重载函数,使用指定的编码器和图像编码器参数,将该 Image 保存到指定的文件。 (继承自 Image。)
1)其中String指示要将Bitmap图像文件保存到的文件名;
2)ImageCodecInfo类可提供必要的存储成员和方法,以检索与已安装的图像编码器和解码器(统称编码解码器)相关的所有信息。不可继承。
强调:在此程序中,主要采用Jpeg图像格式存储图片,代码里面的GetEncoder(ImageFormat format)函数即返回了Jpeg文件格式的编码信息;
3)EncoderParameters:此参数封装 EncoderParameter 对象的数组。而EncoderParameter用于向图像编码器传递值或值数组。
2、思路便是:使用Bitmap类的Save函数,使用Jpeg编码格式,使用不同的精度值(EncoderParameter)来控制图像大小;
注释:关键是提取Jpeg编码信息,需要自己写函数;- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.IO;
- using System.Drawing.Imaging;
- //////////////////////////////////////////////////////////////////////////
- //Bitmap类提供了Save函数用来保存图像,其中:Save(String, ImageCodecInfo, EncoderParameters)重载函数,使用指定的编码器和图像编码器参数,将该 Image 保存到指定的文件。 (继承自 Image。) //GDI+ 使用图像编码器将存储在 Bitmap 对象中的图像转换成各种文件格式。对于 BMP、JPEG、GIF、TIFF 和 PNG 格式,GDI+ 中置入了图像编码器。当调用 Image 对象的 Save 或 SaveAdd 方法时,将调用编码器
- //其中String指示要将Bitmap图像文件保存到的文件名;
- //ImageCodecInfo类可提供必要的存储成员和方法,以检索与已安装的图像编码器和解码器(统称编码解码器)相关的所有信息。不可继承。
- //强调:在此程序中,主要采用Jpeg图像格式存储图片,代码里面的GetEncoder(ImageFormat format)函数即返回了Jpeg文件格式的编码信息;
- //EncoderParameters:此参数封装 EncoderParameter 对象的数组。而EncoderParameter用于向图像编码器传递值或值数组。
- //思路便是:使用Bitmap类的Save函数,使用Jpeg编码格式,使用不同的精度值(EncoderParameter)来控制图像大小;
- //关键是提取Jpeg编码信息,需要自己写函数;
- //代码使用说明:
- // private System.Windows.Forms.Button btnReadFile;
- // private System.Windows.Forms.Label label1;
- // private System.Windows.Forms.Label label2;
- // private System.Windows.Forms.TextBox textBox1;
- // private System.Windows.Forms.TextBox textBox2;
- // private System.Windows.Forms.PictureBox pictureBoxAfterCompress;
- // private System.Windows.Forms.PictureBox pictureBoxBeforeCompress;
- // private System.DirectoryServices.DirectorySearcher directorySearcher1;
- // private System.Windows.Forms.Button btnCompress;
- // private System.Windows.Forms.TextBox textBoxFilePath;
- // private System.Windows.Forms.Panel panel1;
- // private System.Windows.Forms.Panel panel2;
- // private System.Windows.Forms.Panel panel3;
- // private System.Windows.Forms.Label label5;
- // private System.Windows.Forms.Label label3;
- // private System.Windows.Forms.Label label4;
- // private System.Windows.Forms.OpenFileDialog openFileDialog1;
- // private System.Windows.Forms.SaveFileDialog saveFileDialog1;
- // private System.Windows.Forms.TextBox textBox3;
- // private System.Windows.Forms.Label label6;
- //////////////////////////////////////////////////////////////////////////
- namespace 图片压缩
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- Bitmap bmpBefore; //保存需压缩图片;
- FileInfo file; //主要使用FileInfo对象的Length属性获得图片文件大小,Length的单位为b;
- long lNumber = 0; //压缩精度,long型,越高则图片质量越好;
- /// <summary>
- /// 获取Jpeg格式编码(使用ImageFormat格式对象与GetImageEncoders结构中保存的ImageCodecInfo结构对象进行比较,获得此ImageFormat格式对象的编码信息。//ImageFormat:指定图像的文件格式。不可继承。)
- /// </summary>
- /// <param name="format"></param>
- /// <returns></returns>
- private static ImageCodecInfo GetEncoder(ImageFormat format)
- {
- ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
- foreach (ImageCodecInfo ici in CodecInfo)
- {
- if (ici.FormatID == format.Guid)
- {
- return ici;
- }
- }
- return null;
- }
- /// <summary>
- /// 读取要压缩的文件,显示文件,计算文件大小,显示大小;
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btnReadFile_Click(object sender, EventArgs e)
- {
- openFileDialog1.Multiselect = false; //每次限读取一个文件;
- openFileDialog1.Filter = "jpeg文件|*.jpg|bmp文件|*.bmp|png文件|*.png"; //过滤文件
- if (openFileDialog1.ShowDialog() == DialogResult.OK)//openFileDialog对话框
- {
- textBoxFilePath.Text = openFileDialog1.FileName; //将读取文件路径显示在textBoxFilePath中;
- file = new FileInfo(openFileDialog1.FileName);//将读取文件的信息存入file结构中
- pictureBoxBeforeCompress.Load(openFileDialog1.FileName);//在picturebox控件中显示图像;
- bmpBefore = new Bitmap(openFileDialog1.FileName);//将图像保存如bmpBefore中,以备后面压缩时调用;
- textBox1.Text = (file.Length/1024).ToString(); //计算图像大小并显示;file.Length返回文件大小,格式b;
- }
- }
- /// <summary>
- /// 保存文件,压缩文件,显示文件,计算文件大小,显示大小;
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btnCompress_Click(object sender, EventArgs e)
- {
- lNumber = Convert.ToInt64(textBox3.Text);//lNumber保存压缩精度;
- saveFileDialog1.Filter = "jpeg文件|*.jpg";//限定保存文件格式;
- if (saveFileDialog1.ShowDialog() == DialogResult.OK)//保存文件对话框
- {
- //以下代码节选自msdn中EncoderParameters 构造函数 。
- //url:ms-help://MS.MSDNQTR.v90.chs/fxref_system.drawing/html/a660db1b-1a62-2040-70bf-471d49750f80.htm
-
- //获取Jpeg编码信息放入ImageCodecInfo结构中;
- ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
-
- // Create an Encoder object based on the GUID
- // for the Quality parameter category.
- System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
- // Create an EncoderParameters object.
- // An EncoderParameters object has an array of EncoderParameter
- // objects. In this case, there is only one
- // EncoderParameter object in the array.
- EncoderParameters myEncoderParameters = new EncoderParameters(1);
- EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, lNumber);//此处lNumber作为精度值设定。
- myEncoderParameters.Param[0] = myEncoderParameter;
- //msdn中代码节选完毕
- ////////////////////////
- bmpBefore.Save(saveFileDialog1.FileName, jgpEncoder, myEncoderParameters);//调用Save压缩图片。
- //bmpBefore.Save(saveFileDialog1.FileName, GetCodecInfo("image/jpeg"), ps);
- //bmpBefore.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
- file = new FileInfo(saveFileDialog1.FileName); //读取图片信息放入file结构中;
- pictureBoxAfterCompress.Load(saveFileDialog1.FileName); //显示图片
- textBox2.Text = (file.Length / 1024).ToString();//计算图片大小并显示
- }
- }
- }
- }
复制代码 结果:
代码(我写的很粗糙的,勿笑。看到你的问题,我才研究的,也是懂个皮毛,不过知道怎么用就好,是吧?):
图片压缩.zip
(29.66 KB, 下载次数: 21)
|