Генерация изображений WPF с использованием сетки изображений N x N - PullRequest
0 голосов
/ 19 ноября 2010

Я работаю над личным проектом, который создает одно изображение из сетки изображений.Генерирование изображения занимает некоторое время и не обновляется каждый раз только после завершения выполнения кода.Как сделать интерфейс еще функциональным (не заблокированным) при создании изображения.

Итак, для начала: у меня есть N x N сетка идентификаторов, основанная на идентификаторе, на котором я рисую конкретное изображениеx, y) с заданными масштабированной высотой и шириной.

Это изображение обновляется каждую итерацию и требует обновления в WPF.Он также связан с ImageSource of Image на стороне xaml

. Моя проблема заключается в том, «Как повысить производительность создания этого большого изображения» и «Как обновить изображение столько раз, сколько мне нужно.(за поколение).

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 голосов
/ 20 ноября 2010

Есть два пути. Первое и самое полезное - повысить воспринимаемую производительность, сделав это, сгенерировав изображение в рабочем потоке, и использовать события для обновления изображения в потоке пользовательского интерфейса в ключевых точках, чтобы пользователи могли видеть прогресс.

Чтобы повысить реальную производительность, если вы нацеливаетесь и используете многоядерные системы, вы можете попробовать параллельные функции, если ваши итерации могут выполняться параллельно. Это потребует некоторой работы и другого мышления, но поможет, если вы приложите усилия. Я бы рекомендовал изучить PLINQ, чтобы начать.

...