使用N x N网格图像生成WPF图像

时间:2010-11-19 19:08:47

标签: wpf performance image redraw

我正在开发一个个人项目,可以从图像网格中创建单个图像。生成映像需要一段时间,并且只有在代码执行完毕后才会每次刷新。如何在生成图像时使界面仍然有效(未锁定)。

所以开始: 我有一个N×N网格的标识符,基于标识符我在(x,y)处绘制一个具有给定缩放高度和宽度的特定图像。

每次迭代都会重新生成此映像,需要在WPF上进行更新。它也绑定到xaml端的Image的ImageSource

我的问题是'如何提高生成此大图像的性能'和'如何根据需要多次刷新图像(每代)。

for (int i = 0; i < numberOfIterations; i++)
{
  // Do Some Work
  UpdateImage();
}
...
BitmapImage imgFlower = new BitmapImage(new Uri(@"Images\Flower.bmp", UriKind.Relative));
BitmapImage imgPuppy = new BitmapImage(new Uri(@"Images\Puppy.bmp", UriKind.Relative));
ImageSource GeneratedImage{ get{ GenerateImage(); } set; } 
...
void UpdateImage() { OnPropertyChanged("GeneratedImage"); }
...
ImageSource GenerateImage()
{
  RenderTargetBitmap bmp = new RenderTargetBitmap(223, 223, 96, 96, PixelFormats.Pbgra32);
  DrawingVisual drawingVisual = new DrawingVisual();
  using (DrawingContext drawingContext = drawingVisual.RenderOpen())
  {
    double scaleRatio = CalculateScaleRatio();
    DrawGridOfImages(drawingContext, scaleRatio);
  }
  bmp.Render(drawingVisual);
  return bmp;
}
...
DrawGridOfImages(...)
{
  double x,y;
  for (int r = 0; r < NumberOfRows; r++)
  {
    x = r * scaleRatio;
    for (int c = 0; c < NumberOfColumns; c++)
    {
      y = c * scaleRatio;
      switch (imageOccupancy[r, c])
      {
         case Flower: drawingContext.DrawImage(imgFlower, new Rect(x,y,scaleRatio,scaleRation));
         case Puppy: drawingContext.DrawImage(imgPuppy, new Rect(x,y,scaleRatio,scaleRatio));
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

有两种方法。首先,最有益的是提高感知性能,通过在工作线程上生成图像并使用事件在关键点更新UI线程上的图像来实现此目的,以便用户可以看到进度。

为了提高实际性能,如果您要定位和使用多核系统,则可以尝试并行功能,如果您的迭代实际上可以并行执行。这将需要一些工作和不同的心态,但如果你付出努力将有所帮助。我建议学习PLINQ开始。