2013-02-18 92 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