当前位置: 移动技术网 > IT编程>开发语言>c# > C#无损高质量压缩图片实现代码

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小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。

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

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网