C#winforms绘制到位图无效参数

时间:2013-02-18 22:21:50

标签: c# winforms bitmap

我已经创建了一个应用程序,我需要使用drawbitmap函数来打印我的面板。当我按下按钮(btnUpdate)12次或更多时,我在此规则上得到参数异常(无效参数):panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));

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());

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

你有一个很大的内存泄漏,当你点击12次点击按钮并且最多1GB时,观察你的记忆,

尝试将Bitmap声明为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以便分配新的位图

    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;
    }

答案 2 :(得分: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();
}