TBitmap - zuzycie pamieci, FloodFill - o co chodzi jakby

0
  1. Napisalem klase, ktora operuje na TCanvas wpisanym w TBitmap, ktory po wykonaniu rysowania jest zwracany. Problem wystepuje gdy ponownie chce wykozystac ten sam TBitmap do nowego rysowania. Kiedy tylko wyczyszczam piksele na kolor tla, wszystko dziala jak nalezy, jednak za kazda operacja, program zajmuje coraz wiecej pamieci operacyjnej. Probowalem takze wpisac klase na nowo za pomoca delete i new, efekt jest jeszcze gorszy. Po wielu operacjach rysowania (pare tysiecy) wyskakuje nastepujacy exception: "W magazynie brak miejsca na wykonanie tego polecenia".

Ta funkcja jest wykonywana wiele razy i same jej wykonanie zuzywa pamiec:

void CppGHgenv::DrawBMP(Graphics::TBitmap *Bitmap, int x, int y, bool Transparent, TColor TransparentColor)
{
if(Transparent){
Bitmap->Transparent = true;
Bitmap->TransparentColor = TransparentColor;
}

Output->Canvas->Draw(x,y,Bitmap);

}

  1. FloodFill jest metoda TCanvas, ale.... nie dziala jak nalezy albo nie wiem jak jej uzyc. Probowalem wszelkich wariantow wypelnienia, nic z tego...
0

Może napisz cos wiecej. Co to jest ten Output i w jaki sposob tę funkcje wywołujesz - wiecej kodu.

0

jesli chodzi o pierwsze problem zostal rozwiazany, z drugim byl wiekszy problem, ale na jednym z amerykanskich for wiedzieli co powiedziec, by ten temat sluzyl innym zamieszczam tresc ostatecznej odpowiedzi:

TCanvas::FloodFill has two ways of operation:

FloodFill(int X, int Y, TColor Color, TFillStyle FillStyle)

  1. fsSurface, replaces one color (the one specified) in a image with a Brush (which can be a simple solid/patterned brush or a 8x8 bitmap brush), starting at the XY coordinates.
  2. fsBorder, replaces any color it founds with a Brush, except the specified, starting at XY coordinates.

The brush that is going to be used is the current canvas brush. Canvas->Brush

Let's see, if you have a square of unknown border color, from 0 to 100 with a border of width=2 pixels, filled up with white, and you want to make it red:

Canvas->Brush->Color = clRed;
Canvas->Brush->bsSolid;
Canvas->FloodFill(50, 50, clWhite, fsSurface);

Now you've got another image where you want to replace it's color (unknown) to Red, but you know the Border is Black.

Canvas->Brush->Color = clRed;
Canvas->Brush->bsSolid;
Canvas->FloodFill(50, 50, clBlack, fsBorder);

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