C#中級 コーディング例
G2)単一色ペイント(スタック方式)
画像中の1色を設定した別の色に塗り替えます。
//workBmp:対象ビットマップ画像
//getPoint:マウスクリックした位置
//paintColor:塗り替える色
public Bitmap Paint(Bitmap workBmp, Point getPoint, Color paintColor)
{
//マウスクリックした位置の色を取得
Color getColor = workBmp.GetPixel(getPoint.X, getPoint.Y);
Point paintStartPoint = new Point(getPoint.X, getPoint.Y);//塗り始める位置
//塗る領域の設定
int startPosition_X = 0;
int startPosition_Y = 0;
int endX = workBmp.Width;
int endY = workBmp.Height;
//取得した色と塗る色が同色の場合戻る
if (getColor == paintColor) { return workBmp; }
//作業位置をプッシュ
Stack<Point> pixels = new Stack<Point>();
pixels.Push(paintStartPoint);
//連続作業
while (pixels.Count > 0)
{
Point a = pixels.Pop();
if (a.X < endX && a.X >= startPosition_X && a.Y < endY && a.Y >= startPosition_Y)
{
if (workBmp.GetPixel(a.X, a.Y) == getColor)
{
workBmp.SetPixel(a.X, a.Y, paintColor);
pixels.Push(new Point(a.X - 1, a.Y));
pixels.Push(new Point(a.X + 1, a.Y));
pixels.Push(new Point(a.X, a.Y - 1));
pixels.Push(new Point(a.X, a.Y + 1));
}
}
}
return workBmp;//処理済み画像を返す
}