Nie spodziewałemJak prawidłowo renderować duże bitmapy w WPF?
RenderTargetBitmap.Render(visual)
mieć żadnych skutków ubocznych fragment Zmiana danych bitmapy siebie. Wygląda na to, że to nieprawda. Nie mogę powtórzyć tego więcej niż 60 razy, zanim zaczną się pojawiać niektóre brzydkie artefakty renderowania.
Jak poprawnie renderować wiele ikonek w WPF? Poniżej znajduje się kod służący do odtworzenia problemu.
wygenerować ikonek w ten sposób:
BitmapSource Sprite()
{
var bitmap = new RenderTargetBitmap(
500, 500,
96, 96,
PixelFormats.Default);
var visual = new DrawingVisual();
var rect = new Rect(
new Size(
bitmap.Width,
bitmap.Height));
using (DrawingContext context = visual.RenderOpen())
context.DrawLine(
new Pen(Brushes.Red, 100),
rect.TopLeft,
rect.BottomRight);
bitmap.Render(visual);
bitmap.Freeze();
return bitmap;
}
Oto płótno do renderowania wielu z nich:
public BitmapSource Canvas
{
get
{
var bitmap = new RenderTargetBitmap(
1980, 1080,
96, 96,
PixelFormats.Default);
var tiles = 70;
for (int i = 0; i < tiles; i++)
{
var visual = new DrawingVisual();
var rect = new Rect(
bitmap.Width/tiles * i,
0,
bitmap.Width/tiles,
bitmap.Height);
using (DrawingContext context = visual.RenderOpen())
context.DrawImage(Sprite(), rect);
bitmap.Render(visual);
}
bitmap.Freeze();
return bitmap;
}
}
widzę ten dziwny obraz będąc danych związanych z własnością płótnie ...
Dlaczego nie wyrenderować tych 70 płytek w jednym rysunku DrawingVisual, a następnie wywołać bitmap.Render tylko raz? Trzeba po prostu przenieść pętlę 'for' do bloku' using (DrawingContext ...) '. Można również całkowicie zapisać "wewnętrzne" RenderTargetBitmaps, rysując linie bezpośrednio do "zewnętrznego" kontekstu rysunku. – Clemens
Nie mogę renderować kafelków bezpośrednio, ponieważ oznacza to, że pojedynczy wzorzec będzie przechowywać odniesienia do 70 bitmap lub więcej w tym samym czasie. Skończy mi się pamięć. Niestety, potrzebuję "wewnętrznych" RenderTargetBitmaps, ponieważ płytki są danymi wejściowymi rastra dla mojej aplikacji. –
1) Nie mogę odtworzyć twojego problemu, nawet z 'tiles = 2000'. 2) Mogę odtworzyć wyjątek poza pamięcią, zachowując wszystkie odniesienia do ikonek w jednym obrazie - ale w około 855, a nie w 70. Jakiego sprzętu graficznego używasz? – dbc