简体   繁体   English

(System.Drawing())中的内存不足异常

[英]Out of memory exception in (System.Drawing())

I am having trouble rotating an image. 我无法旋转图像。 The size of the image I'm trying to rotate is around 300kB. 我尝试旋转的图像大小约为300kB。 When I rotate it from the zero degree to 360, increasing the angle one degree at a time, I get an out of memory exception. 当我将其从零度旋转到360度,一次将角度增加一度时,我遇到了内存不足的异常。 It is working until 100 degree. 一直工作到100度。

Here's my code: 这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    this.openFileDialog1.InitialDirectory  = System.Environment.SpecialFolder.MyComputer .ToString ();

    DialogResult result = this.openFileDialog1.ShowDialog();
    if (result == DialogResult.OK)
    {
        String pathfile = this.openFileDialog1.FileName ;
        meter = Image.FromFile(pathfile);

        pictureBox1.Image = meter;

        bitmapmeter = new Bitmap(meter);
        gmeter = Graphics.FromImage(bitmapmeter);
        w = bitmapmeter.Width;
        h = bitmapmeter.Height;
    }
}

private void button2_Click(object sender, EventArgs e)
{
    for (int angle = 0; angle < 360; angle = angle + 1)
    {
        bitmapmeter = new Bitmap(meter);    //create a bitmap for selected image//pictureBox2.Image = bitmapmeter;
        gmeter = Graphics.FromImage(bitmapmeter);

        rotate(angle);

        bitmapmeter.Dispose();

        gmeter.Dispose();
    }
    MessageBox.Show("Finished");
}

Bitmap newBitmap;
Graphics graphics;

private void rotate(int angle)
{
    newBitmap = new Bitmap(w, h);
    graphics = Graphics.FromImage(newBitmap);

    graphics.TranslateTransform((float)bitmapmeter.Width / 2, (float)bitmapmeter.Height / 2);
    graphics.RotateTransform(1);
    graphics.TranslateTransform(-(float)bitmapmeter.Width / 2, -(float)bitmapmeter.Height / 2);
    graphics.DrawImage(bitmapmeter, new Point(0, 0));

    newBitmap.Dispose();
    graphics.Dispose();
    //pictureBox2.Image = bitmapmeter;
}

The order of your Dispose calls should be reversed, the bitmap cannot be disposed because the graphics object is still using it. 您的Dispose调用的顺序应颠倒,因为图形对象仍在使用位图,所以无法将其丢弃。 Dispose graphics and then the bitmap, reverse order of how you created them. 处置图形,然后处置位图,其顺序与创建方式相反。 (and wrapping in a "using" block which automatically disposes will look nicer :) (并包装在自动使用的“ using”块中看起来会更好:)

using (bitmapmeter = new Bitmap(meter))    //create a bitmap for selected 
{
  using (gmeter = Graphics.FromImage(bitmapmeter))
  {
    rotate(angle);
  }
}

您应该在其中扔一个GC.Collect,在垃圾收集器有机会运行之前,您可能内存不足。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM