0

c#.net 4 で画像の明るさを変更するには、次の方法を使用しました。

 public void SetBrightness(int brightness)
    {
        imageHandler.RestorePrevious();
        if (brightness < -255) brightness = -255;
        if (brightness > 255) brightness = 255;
        ColorMatrix cMatrix = new ColorMatrix(CurrentColorMatrix.Array);
        cMatrix.Matrix40 = cMatrix.Matrix41 = cMatrix.Matrix42 = brightness / 255.0F;
        imageHandler.ProcessBitmap(cMatrix);
    } 

      internal void ProcessBitmap(ColorMatrix colorMatrix)
          {
            Bitmap bmap = new Bitmap(_currentBitmap.Width, _currentBitmap.Height)

            ImageAttributes imgAttributes = new ImageAttributes();
            imgAttributes.SetColorMatrix(colorMatrix);
            Graphics g = Graphics.FromImage(bmap);
            g.InterpolationMode = InterpolationMode.NearestNeighbor;
            g.DrawImage(_currentBitmap, new Rectangle(0, 0, _currentBitmap.Width,   
            _currentBitmap.Height), 0, 0, _currentBitmap.Width, 
            _currentBitmap.Height,  GraphicsUnit.Pixel, imgAttributes);
            _currentBitmap = (Bitmap)bmap.Clone();


        }

明るさが数回変更されると、「メモリ不足」の例外が表示されます。「ブロックの使用」を使用しようとしましたが、うまくいきませんでした。

何か案は?

リンクhttp://www.codeproject.com/Articles/227016/Image-Processing-using-Matrices-in-Csharpを参照 して、メソッド (回転、明るさ、トリミング、および元に戻す) で任意の種類の最適化が可能かどうかを提案してください。 .

4

1 に答える 1

0

CodeProjectからプロジェクトをダウンロードし、メモリリークを修正しました。_currentBitmapオーバーライドする前に、Graphicsオブジェクトと画像を破棄する必要があります。また、の使用を停止する必要があります.Clone

ProcessBitmap関数の内容をこのコードに置き換えると、メモリリークはなくなります。

internal void ProcessBitmap(ColorMatrix colorMatrix)
{
  Bitmap bmap = new Bitmap(_currentBitmap.Width, _currentBitmap.Height);
  ImageAttributes imgAttributes = new ImageAttributes();
  imgAttributes.SetColorMatrix(colorMatrix);
  using (Graphics g = Graphics.FromImage(bmap))
  {
      g.InterpolationMode = InterpolationMode.NearestNeighbor;
      g.DrawImage(_currentBitmap, new Rectangle(0, 0, _currentBitmap.Width, _currentBitmap.Height), 0, 0, _currentBitmap.Width, _currentBitmap.Height, GraphicsUnit.Pixel, imgAttributes);
  }
  _currentBitmap.Dispose();
  _currentBitmap = bmap;
}

また、さらに最適化するためのヒントを次に示します。

  • の使用を停止し.Clone()ます。私はコードを見ました、そしてそれは.Clone()どこでも使用します。本当に必要な場合を除いて、オブジェクトのクローンを作成しないでください。画像処理では、大きな画像ファイルを保存するために多くのメモリが必要です。インプレースで可能な限り多くの処理を行う必要があります。
  • メソッド間の参照によってBitmapオブジェクトを渡すことができます。このようにして、パフォーマンスを向上させ、メモリコストを削減できます。
  • オブジェクトを操作するときは、常にusingブロックを使用してください。Graphics
  • オブジェクトがもう必要ないことが確実な場合は.Dispose()、オブジェクトを呼び出しますBitmap
于 2012-04-16T06:36:26.367 に答える