用c#重新调整图像大小,并指定大小和尺寸

用c#重新调整图像大小,并指定大小和尺寸,c#,image-resizing,C#,Image Resizing,我想重新调整图像的大小,特别是150*150维,图像大小应小于或等于10kb。我已经完成了位图,下面给出了代码片段: System.Drawing.Image old_Image=System.Drawing.Image.FromFile(//ImagePath); Bitmap new_Image= new Bitmap(150, 150, PixelFormat.Format24bppRgb); Graphics g=new Graphics(); g= Graphics.FromImage

我想重新调整图像的大小,特别是150*150维,图像大小应小于或等于10kb。我已经完成了位图,下面给出了代码片段:

System.Drawing.Image old_Image=System.Drawing.Image.FromFile(//ImagePath);
Bitmap new_Image= new Bitmap(150, 150, PixelFormat.Format24bppRgb);
Graphics g=new Graphics();
g= Graphics.FromImage(new_Image);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(old_Image, new Rectangle(new Point(0, 0), new_Image));
当我这样做的时候,我得到了所有尺寸为150*150,大小小于10kb的图像。但是,如何确保对于每个原始大小较大的图像,每次的图像大小都小于10kb。我可以通过在代码端检查来确定它吗?或者有其他的方法吗

更新: 我已经压缩了图像,只要图像大小小于10kb,我就需要这样做。循环在第一次迭代中运行良好,第二次调用b.Save(ms、ici、ep)时出现错误“Parameter not valid”。在第一次迭代之后,我已经为位图和MemoryStream调用了dispose。那么这个错误的原因是什么呢。 下面给出了我用于迭代的代码片段:

while (length > 10240)
{

  long quality = 50;

  ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
  ImageCodecInfo ici = null;

  foreach (ImageCodecInfo codec in codecs)
  {
      if (codec.MimeType == "image/jpeg")
      ici = codec;
  }

  EncoderParameters ep = new EncoderParameters();
  ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
  ms = new MemoryStream();
  b.Save(ms, ici, ep);
  using (Bitmap bp = new Bitmap(ms))
  {
    b = bp;

  }
  length = Convert.ToInt32(ms.Length);
  ms.Dispose();

}

您可以按如下方式获得图像的输出大小:

using (var testStream = new MemoryStream())
{
    b.Save(testStream, ImageFormat.Jpeg);
    long streamSize = testStream.Length;
}
b是你的形象

如果要进一步压缩图像以减小图像大小,请尝试以下操作:

//quality of the compressed image
long quality = 50;

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo ici = null; 

foreach (ImageCodecInfo codec in codecs)
{ 
    if (codec.MimeType == "image/jpeg") 
    ici = codec; 
} 

EncoderParameters ep = new EncoderParameters();
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

using (var testStream = new MemoryStream())
{
    b.Save(testStream, ici, ep);
    long streamSize = testStream.Length;
}

我们正在做与上面相同的事情,但是我们现在有可能降低jpeg压缩的质量。

您应该了解使用
IDisposable的
关键字的
classes@cansik. 谢谢,那会有用的。但是,如果检查后图像大小大于10kb,在尺寸上没有任何变化的情况下,如何进一步减小图像大小。@CaZbaN我已经编辑了我的答案。现在您可以看到如何使用jpeg压缩对图像进行更大的压缩。但我建议使用gif压缩保存图像,因为它会使图像变得更小。@cansik这也很有效。但我尝试在循环中执行此过程,直到大小小于10kb。循环在第一次迭代和第二次迭代中运行良好,调用b.Save(testStream、ici、ep)时出现错误“Parameter not valid”。