【问题标题】:C# winforms draw to bitmap invalid parameterC# winforms 绘制位图无效参数
【发布时间】:2013-02-03 11:29:11
【问题描述】:

我已经做了一个应用程序,我需要函数 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 文件的这一行中得到一个异常:Application.Run(new Form1());

【问题讨论】:

  • 第十二次点击后是否总是发生这种情况,或者只是因为您点击得太快。我设法得到你的异常,堆栈跟踪说它发生在 System.Windows.Forms.Control.WmMouseUp 是这种情况吗?
  • 接受 Jim 的解决方案。

标签: c# winforms bitmap


【解决方案1】:

这可能是您在处理完位图后没有处理它们的情况。试试这个:

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

【讨论】:

  • 顺便说一句,你需要投 pictureBox2.Image
  • 这是我替换的:panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));但它不起作用......我不明白,我已经放置了这个全局位图 bmp1 = new Bitmap(2480,3508);
  • @FerryJongmans:编辑您的问题并向我们展示您收到的 exact 错误消息,包括内部异常。另外,请向我们展示您现在正在使用的确切代码。 “它不起作用”不是很具有描述性,也不太可能引起有用的回应。
  • System.ArgumentNullException 未处理 HResult=-2147467261 Message=Value cannot be null 这是我得到的
【解决方案2】:

你有一个很大的内存泄漏,当你点击按钮 12 次点击和你最多 1GB 时,请注意你的内存,

尝试将您的 Bitmap 声明为变量并在重新分配之前将其 Dispose。

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

或者在分配新位图之前清除图片框

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

【讨论】:

  • 使用这个解决方案,我得到一个内存不足的异常
  • 哪一个,我都测试了,没有内存泄漏。
  • 我收到内存不足异常,内存不足。在第二个和第一个我得到无效的参数......
【解决方案3】:

通过这样做可以解决问题:

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

【讨论】:

  • 您的preview 方法正是我推荐的。您确定GC.CollectWaitForPendingFinalizers 是必需的吗?那将是......令人惊讶。
  • 是的,否则会增加 RAM 使用量,并且应用程序正在使用 1.5 Gigabites 的 RAM.. 这是我将在运行时调用多次的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多