2009-12-15 169 views
1

我对以下代码有疑问。我在下面的代码成功运行了一个目录,并将图片的分辨率设置为较小的尺寸。但是,文件大小不会更改。例如,尺寸为2400x1800且文件大小为1.5MB的图片将缩放至800x600,但800x600图片的文件大小仍为1.5MB。我想我可能不得不明确压缩图片,但我不确定。有任何想法吗?C#简单图像调整大小:文件大小不缩小

private void Form1_Load(object sender, EventArgs e) 
     { 
      string[] files = null; 
      int count = 0; 
      files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized"); 
      foreach (string file in files) 
      { 
       System.Drawing.Bitmap bmp = System.Drawing.Bipmap.FromFile(file); 

       ResizeBitmap(bmp, 807, 605).Save(
        @"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg"); 
       count++; 
      } 
     } 
     public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight) 
     { 
      Bitmap result = new Bitmap(nWidth, nHeight); 
      using (Graphics g = Graphics.FromImage((Image)result)) 
       g.DrawImage(b, 0, 0, nWidth, nHeight); 
      return result; 
     } 

回答

6

发现这个问题。感谢@yetapb显示代码的更清晰的版本,但仍然无法正常工作。问题的答案是我需要明确指定图像将保存为的文件类型。我的猜测是,因为我没有明确指定图像格式,所以图像压缩并没有相应处理。一个位图只是用一个较小的分辨率保存,一个'.jpg'放在它上面,而不是相应地压缩。以下代码现在可用。

  files = System.IO.Directory.GetFiles(@"C:\PicFolder"); 
      for (string file in files) 
      { 
      Bitmap tempBmp = new Bitmap(file); 
      Bitmap bmp = new Bitmap(tempBmp, 807, 605); 

      bmp.Save(
      @"C:\NewPicFolder\Pic" + count + ".jpg", 
      System.Drawing.Imaging.ImageFormat.Jpeg); 
      count++; 
      } 
+2

另外,请查看您需要避免的[image resizing pitfalls](http://nathanaeljones.com/163/20-image-resizing-pitfalls/)。现在你泄漏GDI手柄,内存,并产生低质量的图像。 –

+0

其实,为什么不使用避免所有运行的GDI错误的库呢? http://imageresizing.net库是免费的,开放源代码,支持并且有详细记录。它有一个1行的API,需要大约一秒钟才能理解。 –

2

不确定位图,但对于其他图像,您可以指定不同的压缩编码器。 MSDN详细信息here

2

您需要设置Graphics对象的一些属性来更改图像的质量。

graphics.CompositingQuality = CompositingQuality.HighSpeed; 
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
graphics.CompositingMode = CompositingMode.SourceCopy; 
graphics.DrawImage(photo, 0, 0, width, height); 

您还可以在保存文件或将其保存为其他格式时设置不同的压缩编码。

+0

另外:'graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;' – vapcguy

0

有趣的实现细节:翻转图像两次,它会导致缩略图被抛出,这将减少文件大小。

result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

0

做了几个变化,下面的代码减少文件大小为预期的(对我来说)。

private void Form1_Load(object sender, EventArgs e) 
{ 
    string[] files = null; 
    int count = 0; 
    files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized"); 
    foreach (string file in files) 
    { 
     Bitmap bmp = new Bitmap(file); 
     new Bitmap(bmp, 807, 605).Save(
        @"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg"); 
     count++; 
    } 
} 

}

+0

因此,而不是做'System.Drawing.Bitmap bmp = System.Drawing.Bipmap.FromFile(文件);',你创建一个新的位图?不过,这个版本在位图文件的末尾还有一个'.jpg'的问题。 OP似乎想要转换,而不仅仅是重命名为'.jpg'。 – vapcguy

+0

看看我写的和OP写的是什么(6年前!)我可以看到我只是编辑他的代码,以减少文件大小(对我来说)。他的问题从未明确表示要转换为jpeg,但他对自己问题的回答确实如此。 –

1
private void button4_Click(object sender, EventArgs e) 
    { 
      String[] files; 
      int count = 0; 
      files = System.IO.Directory.GetFiles(@"C:/dataset"); 
      foreach (string file in files) 
      { 
      Bitmap tempBmp = new Bitmap(file); 
      Bitmap bmp = new Bitmap(tempBmp, 200, 200); 

      bmp.Save(
      @"C:/Newdataset1/" + count + ".jpg", 
      System.Drawing.Imaging.ImageFormat.Jpeg); 
      count++; 
      } 

}

+0

对逻辑的解释会很好。 –