0

サイズ変更、drawString、およびFillEllipse. ビットマップ
を表示する必要があるポイント(FillEllipse)がたくさんあるので、ループを使用しています。 コードは次のとおりです。 nfor

using (System.Drawing.Graphics Gfx = System.Drawing.Graphics.FromImage(OrginalBitmap))
{
      Gfx.SmoothingMode = SmoothingMode.HighQuality;
      Gfx.CompositingQuality = CompositingQuality.HighQuality;
      Gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
      Gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;

     foreach (var points in SelectedPoints)
      {
          Gfx.FillEllipse(
              Brushes.Yellow,new Rectangle(points.X , points.Y, 8, 8));
          Gfx.DrawString("M", new Font("Arial",8), 
              Brushes.Yellow, points.X, points.Y); 
          //points.X and points.X are the points that needs to be drawn on bitmap(particular location).
      }      
  }
((IDisposable)OrginalBitmap).Dispose;

SelectedPoints に多くのポイントがある場合、描画されたビットマップの読み込みに非常に時間がかかります。パフォーマンスが大幅に低下し、読み込みに大量のメモリが必要になりました。何をすべきか教えてください。

前もって感謝します。

4

1 に答える 1

0

最高品質の設定であっても、200 ポイントだけを描画しても、実際にはパフォーマンスの問題は発生しません。コードを使用すると、システムで 1 秒間に約 40000 ポイントを描画できます。

Point[]SelectedPoints がまたはList<Point>その他の効率的なタイプであると仮定すると、FontFacade.Large呼び出しが疑われます。毎回新しい Font インスタンスが作成されますか?

編集:

200 ポイントを使用して変更したコードを実行するnew Font("Arial", 8)と、私のシステムでは約 20 ミリ秒かかるため、問題の原因は他にあるはずです。システムでコードを実行するのにどのくらいかかりますか?

Stopwatch timer = Stopwatch.StartNew();
[...]
Debug.WriteLine(timer.ElapsedMilliseconds);

作成されたフォントオブジェクトは、完了したら破棄する必要があります。また、ループの外に移動して、インスタンスが1つだけ作成されるようにしますが、それが問題の原因ではないようです。

using(Font font = new Font("Arial", 8))
{
  foreach(var point = SelectedPoints)
  {
    [...]
  }
}

OriginalBitmap のサイズと PixelFormat のサイズは?

SelectedPoints とはどのような型ですか?

于 2012-04-17T12:11:04.020 に答える