0

我在旋转图像时遇到问题。我要旋转的图像大小约为 300kB。当我将它从零度旋转到 360 度时,一次增加一个角度,我得到一个内存不足的异常。它一直工作到 100 度。

这是我的代码:

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

2 回答 2

1

Dispose 调用的顺序应该颠倒,位图不能被释放,因为图形对象仍在使用它。处理图形,然后处理位图,与创建它们的顺序相反。(并且包装在自动处理的“使用”块中看起来会更好:)

using (bitmapmeter = new Bitmap(meter))    //create a bitmap for selected 
{
  using (gmeter = Graphics.FromImage(bitmapmeter))
  {
    rotate(angle);
  }
}
于 2013-02-13T20:57:59.207 回答
-3

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

于 2013-02-13T19:25:16.667 回答