C# Malprogramm: Füll-Funktion?

...komplette Frage anzeigen

3 Antworten

Wie wärs damit:

using System;
using System.Drawing;
using System.Collections.Generic;

public static class BitmapEx{
public static void FloodFill4(this Bitmap bitmap, Point start_point, Color color){
Stack points = new Stack();
points.Push(start_point);
Color old_color = bitmap.GetPixel(start_point.X, start_point.Y);
Point point;
while(points.Count > 0){
point = points.Pop();
if(point.X < 0 || point.Y < 0 || point.X >= bitmap.Width || point.Y >= bitmap.Height) continue;
if(bitmap.GetPixel(point.X, point.Y).Equals(old_color)){
bitmap.SetPixel(point.X, point.Y, color);
points.Push(new Point(point.X, point.Y + 1));
points.Push(new Point(point.X, point.Y - 1));
points.Push(new Point(point.X + 1, point.Y ));
points.Push(new Point(point.X - 1, point.Y ));
}
}
}

public static void FloodFill8(this Bitmap bitmap, Point start_point, Color color){
Stack points = new Stack();
points.Push(start_point);
Color old_color = bitmap.GetPixel(start_point.X, start_point.Y);
Point point;
while(points.Count > 0){
point = points.Pop();
if(point.X < 0 || point.Y < 0 || point.X >= bitmap.Width || point.Y >= bitmap.Height) continue;
if(bitmap.GetPixel(point.X, point.Y).Equals(old_color)){
bitmap.SetPixel(point.X, point.Y, color);
points.Push(new Point(point.X, point.Y + 1));
points.Push(new Point(point.X, point.Y - 1));
points.Push(new Point(point.X + 1, point.Y ));
points.Push(new Point(point.X - 1, point.Y ));
points.Push(new Point(point.X + 1, point.Y + 1));
points.Push(new Point(point.X + 1, point.Y - 1));
points.Push(new Point(point.X - 1, point.Y + 1));
points.Push(new Point(point.X - 1, point.Y - 1));
}
}
}
}

Anwendungsbeispiel:

Bitmap bitmap = new Bitmap("input.png");
bitmap.FloodFill4(new Point(0,0), Color.Green);
bitmap.Save("output.png");

Siehe auch https://de.wikipedia.org/wiki/Floodfill

Hallo,

am besten programmierst du dir eine rekursive Methode, welche zusammenhängende Flächen erkennt. Also du siehst dir ein Pixel an, und rufst ausgehend von diesem Pixel die selbe Methode nochmals auf. Natürlich gibts dann effiziente Wege das zu programmieren und ineffiziente aber den Spaß lass ich dir selbst ;)

Du speicherst dir in einem Array alle Pixel, welche diese zusammenhängende selbe Farbe haben, und kannst danach all diese Elemente anders anmalen.

Ist dir der Lösungsweg so klar?

(Am besten lässt du dir die PictureBox als bitmap ausgeben. Dort kannst du sie dann Stück für Stück untersuchen.)

LG

Jawohl, vielen Dank dafür.

0

Was möchtest Du wissen?