0

画像の回転に問題があります。回転しようとしている画像のサイズは約 300kB です。角度を 0 度から 360 度に 1 度ずつ上げながら回転させると、メモリ不足の例外が発生します。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 に答える