0

我有一张正在调整大小、drawString 和FillEllipse.
有很多点(FillEllipse)需要显示n位图,所以我使用for循环。
这是代码:

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 点也不会导致任何性能问题。使用您的代码,我可以在一秒钟内在我的系统上绘制大约 40000 个点。

假设 SelectedPoints 是Point[]List<Point>其他有效类型,我会怀疑这个FontFacade.Large电话。每次都会创建一个新的 Font 实例吗?

编辑:

在我的系统上使用 200 点运行修改后的代码new Font("Arial", 8)大约需要 20 毫秒,因此必须有其他原因导致您的问题。在您的系统上运行代码需要多长时间?

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

完成后应该处理创建的字体对象,我还将它移到循环之外,以便只创建一个实例,尽管这似乎不是问题的根源。

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

OriginalBitmap 是什么尺寸,PixelFormat 是什么?

SelectedPoints 是什么类型的?

于 2012-04-17T12:11:04.020 回答