A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高文咪 中级黑马   /  2013-5-3 17:33  /  1453 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高文咪 于 2013-5-7 15:06 编辑

请教一下,大家有没有好的方法,使程序中上传的图片大小尽是缩到最小,比如2M的图片保存后经过程序处理过看到的只有几百KB;
图片缩放是不是只能改变图片的长宽,不能让图片实际存储值变小了?

2 个回复

倒序浏览
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编码信息,需要自己写函数;
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Drawing.Imaging;

  11. //////////////////////////////////////////////////////////////////////////
  12. //Bitmap类提供了Save函数用来保存图像,其中:Save(String, ImageCodecInfo, EncoderParameters)重载函数,使用指定的编码器和图像编码器参数,将该 Image 保存到指定的文件。 (继承自 Image。) //GDI+ 使用图像编码器将存储在 Bitmap 对象中的图像转换成各种文件格式。对于 BMP、JPEG、GIF、TIFF 和 PNG 格式,GDI+ 中置入了图像编码器。当调用 Image 对象的 Save 或 SaveAdd 方法时,将调用编码器
  13. //其中String指示要将Bitmap图像文件保存到的文件名;
  14. //ImageCodecInfo类可提供必要的存储成员和方法,以检索与已安装的图像编码器和解码器(统称编码解码器)相关的所有信息。不可继承。
  15. //强调:在此程序中,主要采用Jpeg图像格式存储图片,代码里面的GetEncoder(ImageFormat format)函数即返回了Jpeg文件格式的编码信息;
  16. //EncoderParameters:此参数封装 EncoderParameter 对象的数组。而EncoderParameter用于向图像编码器传递值或值数组。



  17. //思路便是:使用Bitmap类的Save函数,使用Jpeg编码格式,使用不同的精度值(EncoderParameter)来控制图像大小;
  18. //关键是提取Jpeg编码信息,需要自己写函数;

  19. //代码使用说明:
  20. //         private System.Windows.Forms.Button btnReadFile;
  21. //         private System.Windows.Forms.Label label1;
  22. //         private System.Windows.Forms.Label label2;
  23. //         private System.Windows.Forms.TextBox textBox1;
  24. //         private System.Windows.Forms.TextBox textBox2;
  25. //         private System.Windows.Forms.PictureBox pictureBoxAfterCompress;
  26. //         private System.Windows.Forms.PictureBox pictureBoxBeforeCompress;
  27. //         private System.DirectoryServices.DirectorySearcher directorySearcher1;
  28. //         private System.Windows.Forms.Button btnCompress;
  29. //         private System.Windows.Forms.TextBox textBoxFilePath;
  30. //         private System.Windows.Forms.Panel panel1;
  31. //         private System.Windows.Forms.Panel panel2;
  32. //         private System.Windows.Forms.Panel panel3;
  33. //         private System.Windows.Forms.Label label5;
  34. //         private System.Windows.Forms.Label label3;
  35. //         private System.Windows.Forms.Label label4;
  36. //         private System.Windows.Forms.OpenFileDialog openFileDialog1;
  37. //         private System.Windows.Forms.SaveFileDialog saveFileDialog1;
  38. //         private System.Windows.Forms.TextBox textBox3;
  39. //         private System.Windows.Forms.Label label6;
  40. //////////////////////////////////////////////////////////////////////////


  41. namespace 图片压缩
  42. {
  43.     public partial class Form1 : Form
  44.     {
  45.         public Form1()
  46.         {
  47.             InitializeComponent();
  48.         }

  49.         Bitmap bmpBefore;   //保存需压缩图片;     
  50.         FileInfo file;      //主要使用FileInfo对象的Length属性获得图片文件大小,Length的单位为b;
  51.         long lNumber = 0;   //压缩精度,long型,越高则图片质量越好;

  52.         /// <summary>
  53.         /// 获取Jpeg格式编码(使用ImageFormat格式对象与GetImageEncoders结构中保存的ImageCodecInfo结构对象进行比较,获得此ImageFormat格式对象的编码信息。//ImageFormat:指定图像的文件格式。不可继承。)
  54.         /// </summary>
  55.         /// <param name="format"></param>
  56.         /// <returns></returns>

  57.         private static ImageCodecInfo GetEncoder(ImageFormat format)

  58.         {
  59.             ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
  60.             foreach (ImageCodecInfo ici in CodecInfo)
  61.             {
  62.                 if (ici.FormatID == format.Guid)
  63.                 {
  64.                     return ici;
  65.                 }
  66.             }
  67.             return null;
  68.         }

  69.         /// <summary>
  70.         /// 读取要压缩的文件,显示文件,计算文件大小,显示大小;
  71.         /// </summary>
  72.         /// <param name="sender"></param>
  73.         /// <param name="e"></param>
  74.         private void btnReadFile_Click(object sender, EventArgs e)
  75.         {
  76.             openFileDialog1.Multiselect = false;  //每次限读取一个文件;
  77.             openFileDialog1.Filter = "jpeg文件|*.jpg|bmp文件|*.bmp|png文件|*.png"; //过滤文件

  78.             if (openFileDialog1.ShowDialog() == DialogResult.OK)//openFileDialog对话框
  79.             {
  80.                 textBoxFilePath.Text = openFileDialog1.FileName; //将读取文件路径显示在textBoxFilePath中;
  81.                 file = new FileInfo(openFileDialog1.FileName);//将读取文件的信息存入file结构中
  82.                 pictureBoxBeforeCompress.Load(openFileDialog1.FileName);//在picturebox控件中显示图像;
  83.                 bmpBefore = new Bitmap(openFileDialog1.FileName);//将图像保存如bmpBefore中,以备后面压缩时调用;
  84.                 textBox1.Text = (file.Length/1024).ToString(); //计算图像大小并显示;file.Length返回文件大小,格式b;
  85.             }
  86.         }
  87.         /// <summary>
  88.         /// 保存文件,压缩文件,显示文件,计算文件大小,显示大小;
  89.         /// </summary>
  90.         /// <param name="sender"></param>
  91.         /// <param name="e"></param>
  92.         private void btnCompress_Click(object sender, EventArgs e)
  93.         {
  94.             lNumber = Convert.ToInt64(textBox3.Text);//lNumber保存压缩精度;
  95.             saveFileDialog1.Filter = "jpeg文件|*.jpg";//限定保存文件格式;
  96.             if (saveFileDialog1.ShowDialog() == DialogResult.OK)//保存文件对话框
  97.             {     
  98.                 //以下代码节选自msdn中EncoderParameters 构造函数 。
  99.                 //url:ms-help://MS.MSDNQTR.v90.chs/fxref_system.drawing/html/a660db1b-1a62-2040-70bf-471d49750f80.htm
  100.       
  101.                 //获取Jpeg编码信息放入ImageCodecInfo结构中;
  102.                 ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);

  103.                
  104.                 // Create an Encoder object based on the GUID
  105.                 // for the Quality parameter category.
  106.                 System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;

  107.                 // Create an EncoderParameters object.
  108.                 // An EncoderParameters object has an array of EncoderParameter
  109.                 // objects. In this case, there is only one
  110.                 // EncoderParameter object in the array.
  111.                 EncoderParameters myEncoderParameters = new EncoderParameters(1);
  112.                 EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, lNumber);//此处lNumber作为精度值设定。
  113.                 myEncoderParameters.Param[0] = myEncoderParameter;
  114.                 //msdn中代码节选完毕
  115.                 ////////////////////////
  116.                 bmpBefore.Save(saveFileDialog1.FileName, jgpEncoder, myEncoderParameters);//调用Save压缩图片。



  117.                //bmpBefore.Save(saveFileDialog1.FileName, GetCodecInfo("image/jpeg"), ps);
  118.                                //bmpBefore.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);

  119.                 file = new FileInfo(saveFileDialog1.FileName);  //读取图片信息放入file结构中;
  120.                 pictureBoxAfterCompress.Load(saveFileDialog1.FileName); //显示图片               
  121.                 textBox2.Text = (file.Length / 1024).ToString();//计算图片大小并显示
  122.             }
  123.         }

  124.     }
  125. }
复制代码
结果:

代码(我写的很粗糙的,勿笑。看到你的问题,我才研究的,也是懂个皮毛,不过知道怎么用就好,是吧?):
图片压缩.zip (29.66 KB, 下载次数: 21)



评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
张伟86 发表于 2013-5-3 20:12
1、Bitmap类提供了Save函数用来保存图像,其中:Save(String, ImageCodecInfo, EncoderParameters)重载函数 ...

:)多谢了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马