2012-04-11 10 views
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(); 


     } 

明るさが数回変更された場合、「メモリ不足」の例外が表示されます。私は "Using block"を使用しようとしましたが、静脈に入りました。

アイデア?

リンク http://www.codeproject.com/Articles/227016/Image-Processing-using-Matrices-in-Csharp を参照し、最適化のいずれかの種類がメソッド(回転、明るさ、作物と元に戻す)で可能であれば提案してください。

+0

あなたは、おそらくビットマップオブジェクトでのDispose()を呼び出すために忘れています。彼らは多くの管理されていないメモリを取る、ガベージコレクタはあなたを困らせないでください。 –

答えて

0

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

あなたは、このコードでProcessBitmap機能の内容を交換する場合、メモリリークがなくなっている:

  • 停止.Clone()を使用して:ここ

    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()を使用します。本当に必要でない限り、オブジェクトを複製しないでください。画像処理では、大きな画像ファイルを保存するために多くのメモリが必要です。あなたができるだけ多くの処理を行う必要があります。

  • メソッド間にBitmapオブジェクトby referenceを渡すことができます。パフォーマンスを向上させ、メモリコストを削減することができます。
  • Graphicsオブジェクトを使用する場合は、常にusingブロックを使用してください。あなたがそれらを必要としないあなたは確信しているBitmapオブジェクト上
  • コール.Dispose()はもう
+0

また、[回答を受け入れる(リンク)](http://meta.stackexchange.com/a/5235)を学ぶ必要があります。あなたに適した答えが見つかった場合は、その横にあるチェックボックスをクリックします。 – Ove