Pisem Flood Fill 4 funkciju koja koristi Queue objekat za uskladistavanje pixela.
Problem je u tome sto kada se popunjava povrsina veca od ca. 80x80 pixela, ostanem bez memorije(trash?).
Sa manjim povrsinama radi bez problema.
Takodje, pokusao sam ranije da koristim rekurziju funkcije, ali desi se stack overflow iz razumljivih razloga.
Kod funkcije:
Code:
protected void FloodFill(Bitmap b,int x, int y, System.Drawing.Color oldC, System.Drawing.Color newC)
{
//pravljenj praznog Queue-a, provera izabranog pocetnog pixela i dodavanje istog u Queue
Queue fQ= new Queue();
if (b.GetPixel(x,y)!= oldC) return;
fQ.Enqueue(new Point(x,y));
while (fQ.Count>0)
{
Point pt= (Point)fQ.Dequeue();
b.SetPixel(pt.X,pt.Y,newC);
if(pt.X+1<b.Width && b.GetPixel(pt.X+1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X+1,pt.Y));
if(pt.X-1>=0 && b.GetPixel(pt.X-1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X-1,pt.Y));
if(pt.Y+1<b.Height && b.GetPixel(pt.X,pt.Y+1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y+1));
if(pt.Y-1>=0 && b.GetPixel(pt.X,pt.Y-1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y-1));
}
fQ.Clear();
}
protected void FloodFill(Bitmap b,int x, int y, System.Drawing.Color oldC, System.Drawing.Color newC)
{
//pravljenj praznog Queue-a, provera izabranog pocetnog pixela i dodavanje istog u Queue
Queue fQ= new Queue();
if (b.GetPixel(x,y)!= oldC) return;
fQ.Enqueue(new Point(x,y));
while (fQ.Count>0)
{
Point pt= (Point)fQ.Dequeue();
b.SetPixel(pt.X,pt.Y,newC);
if(pt.X+1<b.Width && b.GetPixel(pt.X+1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X+1,pt.Y));
if(pt.X-1>=0 && b.GetPixel(pt.X-1,pt.Y)== oldC) fQ.Enqueue(new Point(pt.X-1,pt.Y));
if(pt.Y+1<b.Height && b.GetPixel(pt.X,pt.Y+1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y+1));
if(pt.Y-1>=0 && b.GetPixel(pt.X,pt.Y-1)== oldC) fQ.Enqueue(new Point(pt.X,pt.Y-1));
}
fQ.Clear();
}
A evo i poziva funkcije:
Code:
Color oldC= slika.GetPixel(e.X,e.Y);
FloodFill(slika,e.X,e.Y,oldC,Color.Black);
Graphics g = CreateGraphics();
g.DrawImage(slika,0,0,slika.Width,slika.Height);
g.Dispose();
Color oldC= slika.GetPixel(e.X,e.Y);
FloodFill(slika,e.X,e.Y,oldC,Color.Black);
Graphics g = CreateGraphics();
g.DrawImage(slika,0,0,slika.Width,slika.Height);
g.Dispose();
[Ovu poruku je menjao cbb dana 22.12.2007. u 04:23 GMT+1]