2012-10-25 46 views
0

我正在使用.NET4.5,Windows Forms和C#。加載具有內存效率的大圖像

我加載圖像上用一個按鈕:

theButton.BackgroundImage = Image.FromFile("file.png"); 

的問題是,我的按鈕是128×128,圖像爲4000x8000。上面的行佔用了大量的內存,因爲file.png非常大。

有誰知道我可以用來減少這種內存佔用的技術?我在想這樣的功能:

Image.FromFile(file,width,height); 

任何指針?謝謝。

+0

我可能會加載圖像,調整其大小,丟棄原和使用調整之一。如果您仍然起訴相同的圖像,請嘗試將其緩存在某處 – Ondra

+0

Ondra;這聽起來像一個優雅的解決方案你能告訴我如何處理原始圖像嗎?這甚至可能與.NET? –

+0

MSRS比我快:)看到他的回答下面 – Ondra

回答

0

我認爲這裏最好的路徑就是將圖像大小調整爲128x128。 一張大圖總是會佔用大量內存的圖像,無論你如何處理它。

這也可以讓你的圖像看起來很好看。

+1

感謝您的回答 - 問題是源文件是由用戶選擇的,所以我無法在事先調整大小。我已經將您的解決方案用於其他圖像處於我的控制範圍內的場景,並且這種方法效果很好,但不是在我目前的情況下。 –

0

這是一個相當普遍的問題,據我所知,你有幾種可能性

  1. 壓縮圖像上傳之前,在現實世界中這是行不通的。
  2. 檢查圖像的大小和尺寸,在現實世界中它的工作原理,甚至linkedin,Facebook他們不會允許我們上傳圖像上面有指定的尺寸。
  3. 使用緩衝,這是你可以在.NET
  4. 使用一些第三方插件或開發enviornment做乾淨的方法,我已經在Silverlight
  5. 做了
+0

感謝Nipun,您有關於第3點的更多信息嗎?目前其他解決方案對我來說不是可行的選擇。 –

+0

試試這個: http://stackoverflow.com/questions/11640844/out-of-memory-exception-reading-large-text-file-for-httpwebrequest –

2

是它的工作原理。調整圖像大小並將其顯示在按鈕上非常簡單。

但是,我不認爲上面的代碼保持圖像的縱橫比。

調整高寬比圖像非常簡單;然後在按鈕上顯示它。 以下示例代碼可幫助您通過保持高寬比來調整圖像大小。 您可以定義一個新類或在現有類中實施「ResizeImage」方法。無論你對誰舒服。

public class ImageManipulation 
{ 
    public static Bitmap ResizeImage(Bitmap originalBitmap, int newWidth, int maxHeight, bool onlyResizeIfWider) 
    { 
     if (onlyResizeIfWider) 
     { 
      if (originalBitmap.Width <= newWidth) 
      { 
       newWidth = originalBitmap.Width; 
      } 
     } 

     int newHeight = originalBitmap.Height * newWidth/originalBitmap.Width; 
     if (newHeight > maxHeight) 
     { 
      // Resize with height instead 
      newWidth = originalBitmap.Width * maxHeight/originalBitmap.Height; 
      newHeight = maxHeight; 
     } 

     var alteredImage = new Bitmap(originalBitmap, new Size(newWidth, newHeight)); 
     alteredImage.SetResolution(72, 72); 
     return alteredImage; 
    } 
} 

用法:

private void DisplayPhoto() 
{ 
    // make sure the file is JPEG or GIF 
       System.IO.FileInfo testFile = new System.IO.FileInfo(myFile); 

    // Create a new stream to load this photo into 
       FileStream myFileStream = new FileStream(myFile, FileMode.Open, FileAccess.Read); 

    // Create a buffer to hold the stream of bytes 
       photo = new byte[myFileStream.Length]; 
       // Read the bytes from this stream and put it into the image buffer 
       myStream.Read(photo, 0, (int)myFileStream.Length); 
       // Close the stream 
       myFileStream.Close(); 

    // Create a new MemoryStream and write all the information from 
      // the byte array into the stream 
      MemoryStream myStream = new MemoryStream(photo, true); 
      myStream.Write(photo, 0, photo.Length); 

      // Use the MemoryStream to create the new BitMap object 
      Bitmap FinalImage = new Bitmap(myStream); 
      upicPhoto.Image = ImageManipulation.ResizeImage(
               FinalImage, 
               upicPhoto.Width, 
               upicPhoto.Height, 
               true); 


      // Close the stream 
      myStream.Close(); 
}