私は、画像のグリッドから単一の画像を作成するパーソナルプロジェクトに取り組んでいます。イメージの生成にはしばらく時間がかかり、コードの実行が完了するたびにリフレッシュされません。イメージを生成するときに、どのようにしてインタフェースを機能させることができますか(ロックされていない)。画像のN x Nグリッドを使用したWPF画像の生成
開始するには: 識別子のN x Nグリッドがあり、識別子に基づいて、(x、y)に特定の縮尺の高さと幅で特定のイメージを描画します。
このイメージは各繰り返しが再生成され、WPFで更新する必要があります。また、xaml側の画像の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));
}
}
}
}
BackgroundWorker WPFのようなものを検索します。例えば。この1つ - http://www.tanguay.info/web/index.php?pg=codeExamples&id=232 –