2009-12-15 170 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

對邏輯的解釋會很好。 –