欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#无损高质量压缩图片实现代码

程序员文章站 2024-02-07 14:38:22
最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300k以内,但是压缩后的图像看的不在清晰,并且,限定了图片的height或者是width。 在...

最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300k以内,但是压缩后的图像看的不在清晰,并且,限定了图片的height或者是width。

在csdn上看到了一个压缩算法:c#无损高质量压缩图片代码

进过测试这个算法,发现,将原始图像的大小进行对半处理,然后迭代跳转压缩质量参数,可以得到不错的效果。

修改后的算法如下:

/// <summary>
/// 无损压缩图片
/// </summary>
/// <param name="sfile">原图片地址</param>
/// <param name="dfile">压缩后保存图片地址</param>
/// <param name="flag">压缩质量(数字越小压缩率越高)1-100</param>
/// <param name="size">压缩后图片的最大大小</param>
/// <param name="sfsc">是否是第一次调用</param>
/// <returns></returns>
public static bool compressimage(string sfile, string dfile, int flag = 90, int size = 300, bool sfsc = true)
{
 image isource = image.fromfile(sfile);
 imageformat tformat = isource.rawformat;
 //如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true
 fileinfo firstfileinfo = new fileinfo(sfile);
 if (sfsc == true && firstfileinfo.length < size * 1024)
 {
 firstfileinfo.copyto(dfile);
 return true;
 }

 int dheight = isource.height / 2;
 int dwidth = isource.width / 2;
 int sw = 0, sh = 0;
 //按比例缩放
 size tem_size = new size(isource.width, isource.height);
 if (tem_size.width > dheight || tem_size.width > dwidth)
 {
 if ((tem_size.width * dheight) > (tem_size.width * dwidth))
 {
  sw = dwidth;
  sh = (dwidth * tem_size.height) / tem_size.width;
 }
 else
 {
  sh = dheight;
  sw = (tem_size.width * dheight) / tem_size.height;
 }
 }
 else
 {
 sw = tem_size.width;
 sh = tem_size.height;
 }

 bitmap ob = new bitmap(dwidth, dheight);
 graphics g = graphics.fromimage(ob);

 g.clear(color.whitesmoke);
 g.compositingquality = system.drawing.drawing2d.compositingquality.highquality;
 g.smoothingmode = system.drawing.drawing2d.smoothingmode.highquality;
 g.interpolationmode = system.drawing.drawing2d.interpolationmode.highqualitybicubic;

 g.drawimage(isource, new rectangle((dwidth - sw) / 2, (dheight - sh) / 2, sw, sh), 0, 0, isource.width, isource.height, graphicsunit.pixel);

 g.dispose();

 //以下代码为保存图片时,设置压缩质量
 encoderparameters ep = new encoderparameters();
 long[] qy = new long[1];
 qy[0] = flag;//设置压缩的比例1-100
 encoderparameter eparam = new encoderparameter(system.drawing.imaging.encoder.quality, qy);
 ep.param[0] = eparam;

 try
 {
 imagecodecinfo[] arrayici = imagecodecinfo.getimageencoders();
 imagecodecinfo jpegiciinfo = null;
 for (int x = 0; x < arrayici.length; x++)
 {
  if (arrayici[x].formatdescription.equals("jpeg"))
  {
  jpegiciinfo = arrayici[x];
  break;
  }
 }
 if (jpegiciinfo != null)
 {
  ob.save(dfile, jpegiciinfo, ep);//dfile是压缩后的新路径
  fileinfo fi = new fileinfo(dfile);
  if (fi.length > 1024 * size)
  {
  flag = flag - 10;
  compressimage(sfile, dfile, flag, size, false);
  }
 }
 else
 {
  ob.save(dfile, tformat);
 }
 return true;
 }
 catch
 {
 return false;
 }
 finally
 {
 isource.dispose();
 ob.dispose();
 }
}

效果图如下:

第一张的大小是2.82m,尺寸是3680*4640。

C#无损高质量压缩图片实现代码

第二张的大小是274kb,尺寸是1740*2320,清晰度方面还是不错的。

C#无损高质量压缩图片实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。