您的位置:首页 > 其它

Flood Fill Image

2015-07-27 17:43 246 查看
http://rosettacode.org/wiki/Bitmap/Flood_fill#First_example

C# Example:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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(170, 211), Color.White, Color.Yellow);
bmp.Save("Filledcirc.bmp");
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: