1

アプリケーションを作成しましたが、パネルを印刷するには関数 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());

4

3 に答える 3

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();
}
于 2013-02-18T22:41:49.223 に答える
1

そこには非常に大きなメモリリークがあります。ボタンをクリックするとメモリが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;
    }

または、新しいビットマップを割り当てる前に 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;
    }
于 2013-02-18T22:44:46.963 に答える
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();
}
于 2013-02-19T13:46:25.860 に答える