1

次の2つのクラスがあります。

public class ImageHandler
{
    private Bitmap _currentBitmap;
    private Bitmap _bitmapbeforeProcessing;

    public Bitmap CurrentBitmap
    {
        get
        {
            if (_currentBitmap == null)
            {
                _currentBitmap = new Bitmap(1, 1);
            }
            return _currentBitmap;
        }
        set { _currentBitmap = value; }
    }

    public string CurrentBitmapPath { get; set; }

    public void ResetBitmap()
    {
        if (_currentBitmap != null && _bitmapbeforeProcessing != null)
        {
             Bitmap temp = (Bitmap)_currentBitmap.Clone();
            _currentBitmap = (Bitmap)_bitmapbeforeProcessing.Clone();
            _bitmapbeforeProcessing = (Bitmap)temp.Clone();
        }
    }

    internal void RestorePrevious()
    {
        _bitmapbeforeProcessing = _currentBitmap;
    }
 }

と:

public class RotationHandler
{
    private ImageHandler imageHandler;

    public void Flip(RotateFlipType rotateFlipType)
    {
        this.imageHandler.RestorePrevious();
        Bitmap bitmap = (Bitmap) this.imageHandler.CurrentBitmap.Clone();
        this.imageHandler.CurrentBitmap.Dispose(); // dispose of current bitmap
        bitmap.RotateFlip(rotateFlipType);
        this.imageHandler.CurrentBitmap = bitmap;
   }
 }

ResetBitmap()ローテーション後に呼び出されると、次のように表示されます。

パラメータが無効です

ただし、次の場合:

this.imageHandler.CurrentBitmap.Dispose();

コメントすると、正常に動作します。ただし、Flip()メソッドが数回呼び出されると、Out Of Memory 例外が発生します。

どうすれば解決できますか?

4

2 に答える 2

1

Bitmap は C# オブジェクトですが、実際には win32 オブジェクトであるため、使い終わったら Dispose() を呼び出す必要があります。

あなたがやっている:

_CurrentBitmap = _CurrentBitmap.Clone();

あなたがすべきとき:

_Temp = _CurrentBitmap.Clone();
_CurrentBitmap.Dispose();
_CurrentBitmap = _Temp;
于 2012-04-16T16:13:11.807 に答える