2012-04-17 73 views
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多点时间很长。 性能急剧下降,加载占用太多内存。 请让我知道该怎么做。

在此先感谢。

+0

明显的建议是尝试改变质量,看看是否有效果。 – 2012-04-17 11:55:29

+2

只需注意一点:由于您位于使用(...)块内,因此您不需要'Gfx.Dispose();''Gfx'被放置在块的外面。 – Marco 2012-04-17 11:55:33

+1

另外,你是否有你想要制作的示例图片,也许有更简单的你可以做的。 – 2012-04-17 11:56:39

回答

0

即使在最高质量的环境下,只画200点也不会引起任何性能问题。使用你的代码,我可以在一秒钟内在我的系统上画出大约40000点。

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

编辑:

运行使用new Font("Arial", 8)上200点的修改后的代码需要在我的系统大约20毫秒,所以有别的东西,是造成你的问题。在系统上运行代码需要多长时间?完成后

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

创建的字体对象应布置,我也将它的外循环,这样只有一个实例被创建,尽管这似乎并不为你的问题的根源。

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

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

SelectedPoints是什么类型?

+0

是创建了一个新的字体实例 – Guddu 2012-04-17 12:14:24

+0

@Guddu,在系统上运行代码需要多长时间?什么是OriginalBitmap的尺寸,它是什么PixelFormat?什么类型是SelectedPoints? – Anlo 2012-04-18 08:12:02

相关问题