2013-02-18 95 views
1

我已經提出了一個應用程序,我需要函數drawbitmap來打印我的面板。當我按下按鈕(btnUpdate)的12倍或這個規則我越參數(無效參數):panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));C#winforms繪製位圖無效參數

private void preview() 
     { 
      Bitmap bmp1 = new Bitmap(2480, 3508); 
      panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508)); 
      pictureBox2.Image = bmp1; 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      preview(); 
     } 

有人能幫助我嗎?

我不能使用bmp1.Dispose();功能......我得到的Program.cs中的exeption在這一行文件:Application.Run(new Form1());

+0

它總是第十二點擊後發生,或者只是因爲你是點擊太快。 我設法得到你的異常和堆棧跟蹤說它發生在System.Windows.Forms.Control.WmMouseUp 這是這種情況? – nzic 2013-02-18 22:40:36

+0

只要接受Jim的解決方案。 – nzic 2013-02-18 22:58:54

回答

0

問題是由這樣固定的:

private void preview() 
{ 

    Bitmap bmp1 = new Bitmap(2480, 3508); 
    panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508)); 
    Image img = pictureBox2.Image; 
    pictureBox2.Image = bmp1; 
    if (img != null) img.Dispose(); // the first time it'll be null 

} 

private void btnUpdate_Click(object sender, EventArgs e) 
{ 
    preview(); 
    System.GC.Collect(); 
    System.GC.WaitForPendingFinalizers(); 
} 
+1

您的'預覽'方法正是我所推薦的。你確定需要'GC.Collect'和'WaitForPendingFinalizers'嗎?那將是......令人驚訝的。 – 2013-02-19 13:50:23

+0

是的,否則RAM使用率會增加,並且應用程序使用1.5 Gigabites的RAM ..這是一種我將在運行時多次調用的方法。 – 2013-02-19 16:03:53

3

這可能是當你有沒有做處置位圖的情況下,他們。試試這個:

panel1.DrawToBitmap(...); 

// get old image 
Bitmap oldBitmap = pictureBox2.Image as Bitmap; 

// set the new image 
pictureBox2.Image = bmp1; 

// now dispose the old image 
if (oldBitmap != null) 
{ 
    oldBitmap.Dispose(); 
} 
+0

順便說一句,你需要施放'pictureBox2.Image' – AbZy 2013-02-18 23:04:59

+0

這就是我所取代的:panel1.DrawToBitmap(bmp1,new Rectangle(0,0,2480,3508));但它不工作...我沒有得到它,並且我已經放置了這個全局位圖bmp1 = new Bitmap(2480,3508); – 2013-02-18 23:16:57

+0

@AbZy:謝謝你的糾正。固定。 – 2013-02-18 23:49:14

1

你有一個偉大的大內存泄漏在那裏,看着你的記憶,你單擊該按鈕12次點擊和你的高達1GB,

嘗試宣告你位圖作爲一個varable之前處置它重新分配。

private Bitmap bmp1; 
    private void preview() 
    { 
     if (bmp1 != null) 
     { 
      bmp1.Dispose(); 
     } 
     bmp1 = new Bitmap(2480, 3508); 
     panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508)); 
     pictureBox2.Image = bmp1; 
    } 

或者只是明確在PictureBox befor分配一個新的位圖

private void preview() 
    { 
     if (pictureBox2.Image != null) 
     { 
      pictureBox2.Image.Dispose(); 
     } 
     Bitmap bmp1 = new Bitmap(2480, 3508); 
     panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508)); 
     pictureBox2.Image = bmp1; 
    } 
+0

有了這個解決方案,我得到一個沒有足夠的內存異常 – 2013-02-18 23:08:20

+0

哪一個,我測試了,也沒有內存泄漏。 – 2013-02-18 23:10:40

+0

我得到一個內存不足的例外,沒有足夠的內存。在第二個和第一個我得到無效的參數... – 2013-02-18 23:20:51