使用特定大小和尺寸重新调整c#中的图像大小

时间:2014-03-11 07:03:16

标签: c# image-resizing

我想将图像重新调整为特定的150 * 150尺寸,图像尺寸应小于或等于10kb。我已经完成了Bitmap,代码片段如下:

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)时出现“参数无效”错误。我在第一次迭代后调用了Bitmap和MemoryStream。那可能是造成这个错误的原因。 我用于迭代的代码片段如下:

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();

}

1 个答案:

答案 0 :(得分:0)

您可以像这样得到图像的输出尺寸:

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压缩的质量。