OutOfMemoryException podczas pracy z bitmapami

0

Witam; właśnie jestem w końcowej fazie projektu prostego edytora grafiki wektorowej. Program tak w skrócie: ładuje pliki rastrowe do pictureBoxa, tam mogę obrysowywać interesujące mnie kształty krzywymi beziera lub innymi kształtami i kiedy już uznam, że robota skończona otrzymuję na wyjściu plik txt z zapisem wektorowym naniesionych kształtów.

Podczas rysowania bezierów, zwłaszcza jeśli załadowana bitmapa jest duża (np. 3000x3000) wysypuje mi OutOfMemoryException.

Wiąże się to pewnie z tym wycinkiem kodu:

public Image getRaster()
{
Image outputImage = new Bitmap(currentImage);
drawPoints(outputImage); //rysuje punkty z kolekcji punktów
drawBeziers(outputImage);//rysuje kształty na podstawie punktów
drawLastPointWithSattelites(outputImage);//rysuje "projektor" czyli tą "styczną" dla Bezierów
return outputImage;// zwraca obraz, po czym w klasie z interfejsem przypisywany jest on pictureBox.Image=vectorGenerator.getRaster();
}

ta metoda jest wywoływana przy zdarzeniu MouseMove jeśli wciśnięty jest lewy przycisk myszki, zatem przy każdorazowym przesunięciu kursora tworzy się nowa bitmapa - pewnie garbage collector nie nadąża :/.

projektowanie bezierów odbywa się podobnie jak np. w najnowszym photoshopie - pojawia się taka "linia" z punktami bezierów, coś tak tu:

Jak to rozwiązać?

0

Okej, w metodzie obsługującej zdarzenie mouseMove dopisałem po każdorazowym repaincie takie oto linijki:

GC.Collect();
GC.WaitForPendingFinalizers();

no czyli pobudzłem garbbageCollector do roboty; tak czy owak trochę to kiepskie wyjście ponieważ przy dużych bitmapach projektor bezierów niestety poklatkuje :/

Da się to jakoś inaczej zrobić?

1

Niepotrzebnie przerysowujesz wszystko przy każdym ruchu kursora. Malowanie bitmapy 9mpix kilkanaście albo kilkadziesiąt razy na sekundę nie jest optymalne.
Niech rysowanie nowej (albo edycja istniejącej) krzywej odbywa się na nowej, przezroczystej bitmapie, która wyświetlana będzie nad właściwym obrazem.

0

No i jako główny bufor używaj jednej i tej samej bitmapy cały czas, tylko domalowuj to co potrzeba.

0

Przezroczysta bitmapa? Ale ona będzie wielkości bitmapy edytowanej... Zmieni to coś?

1 użytkowników online, w tym zalogowanych: 0, gości: 1