54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
|
|
namespace FloodFill
|
|
{
|
|
class Program
|
|
{
|
|
private static bool ColorMatch(Color a, Color b)
|
|
{
|
|
return (a.ToArgb() & 0xffffff) == (b.ToArgb() & 0xffffff);
|
|
}
|
|
|
|
static void FloodFill(Bitmap bmp, Point pt, Color targetColor, Color replacementColor)
|
|
{
|
|
Queue<Point> q = new Queue<Point>();
|
|
q.Enqueue(pt);
|
|
while (q.Count > 0)
|
|
{
|
|
Point n = q.Dequeue();
|
|
if (!ColorMatch(bmp.GetPixel(n.X, n.Y),targetColor))
|
|
continue;
|
|
Point w = n, e = new Point(n.X + 1, n.Y);
|
|
while ((w.X >= 0) && ColorMatch(bmp.GetPixel(w.X, w.Y),targetColor))
|
|
{
|
|
bmp.SetPixel(w.X, w.Y, replacementColor);
|
|
if ((w.Y > 0) && ColorMatch(bmp.GetPixel(w.X, w.Y - 1),targetColor))
|
|
q.Enqueue(new Point(w.X, w.Y - 1));
|
|
if ((w.Y < bmp.Height - 1) && ColorMatch(bmp.GetPixel(w.X, w.Y + 1),targetColor))
|
|
q.Enqueue(new Point(w.X, w.Y + 1));
|
|
w.X--;
|
|
}
|
|
while ((e.X <= bmp.Width - 1) && ColorMatch(bmp.GetPixel(e.X, e.Y),targetColor))
|
|
{
|
|
bmp.SetPixel(e.X, e.Y, replacementColor);
|
|
if ((e.Y > 0) && ColorMatch(bmp.GetPixel(e.X, e.Y - 1), targetColor))
|
|
q.Enqueue(new Point(e.X, e.Y - 1));
|
|
if ((e.Y < bmp.Height - 1) && ColorMatch(bmp.GetPixel(e.X, e.Y + 1), targetColor))
|
|
q.Enqueue(new Point(e.X, e.Y + 1));
|
|
e.X++;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
Bitmap bmp = new Bitmap("Unfilledcirc.bmp");
|
|
FloodFill(bmp, new Point(200, 200), Color.White, Color.Red);
|
|
FloodFill(bmp, new Point(100, 100), Color.Black, Color.Blue);
|
|
bmp.Save("Filledcirc.bmp");
|
|
}
|
|
}
|
|
}
|