Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static Bitmap AddColorsBorder (Bitmap originalMap, List<Color> colorsToBorder, int borderRadius, Color borderColor, BorderPosition borderPos) //Border Position is an Enum
- {
- DirectBitmap result = DirectBitmap.fromBitmap(originalMap);
- int x, y;
- for (x = 0; x < result.Width; x++)
- {
- for (y = 0; y < result.Height; y++)
- {
- if (colorsToBorder.Contains(result.GetPixel(x, y)))
- {
- List<(int, int)> currentPixels = new List<(int, int)>();
- List<(int, int)> nextPixels = new List<(int, int)>();
- List<(int, int)> allPixelsToWrite = new List<(int, int)>();
- currentPixels.Add((x,y));
- for (int curRadius = 0; curRadius <= borderRadius; curRadius++)
- {
- if (currentPixels.Count == 0) break;
- foreach ((int, int) pixel in currentPixels)
- {
- if (borderPos == BorderPosition.Center)
- {
- if (pixel.Item1 + 1 < result.Height) {nextPixels.Add((pixel.Item1 + 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 + 1, pixel.Item2));}
- if (pixel.Item1 - 1 > 0) {nextPixels.Add((pixel.Item1 - 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 - 1, pixel.Item2));}
- if (pixel.Item2 + 1 < result.Height) {nextPixels.Add((pixel.Item1, pixel.Item2 + 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 + 1));}
- if (pixel.Item2 - 1 > 0) {nextPixels.Add((pixel.Item1, pixel.Item2 - 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 - 1));}
- }
- else if (borderPos == BorderPosition.Outer)
- {
- if (pixel.Item1 + 1 < result.Height && !colorsToBorder.Contains(result.GetPixel(pixel.Item1 + 1, pixel.Item2)))
- {
- nextPixels.Add((pixel.Item1 + 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 + 1, pixel.Item2));
- }
- if (pixel.Item1 - 1 > 0 && !colorsToBorder.Contains(result.GetPixel(pixel.Item1 - 1, pixel.Item2)))
- {
- nextPixels.Add((pixel.Item1 - 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 - 1, pixel.Item2));
- }
- if (pixel.Item2 + 1 < result.Height && !colorsToBorder.Contains(result.GetPixel(pixel.Item1, pixel.Item2 + 1)))
- {
- nextPixels.Add((pixel.Item1, pixel.Item2 + 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 + 1));
- }
- if (pixel.Item2 - 1 > 0 && !colorsToBorder.Contains(result.GetPixel(pixel.Item1, pixel.Item2 - 1)))
- {
- nextPixels.Add((pixel.Item1, pixel.Item2 - 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 - 1));
- }
- }
- else //Inner
- {
- if (pixel.Item1 + 1 < result.Height && colorsToBorder.Contains(result.GetPixel(pixel.Item1 + 1, pixel.Item2)))
- {
- nextPixels.Add((pixel.Item1 + 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 + 1, pixel.Item2));
- }
- if (pixel.Item1 - 1 > 0 && colorsToBorder.Contains(result.GetPixel(pixel.Item1 - 1, pixel.Item2)))
- {
- nextPixels.Add((pixel.Item1 - 1, pixel.Item2));
- allPixelsToWrite.Add((pixel.Item1 - 1, pixel.Item2));
- }
- if (pixel.Item2 + 1 < result.Height && colorsToBorder.Contains(result.GetPixel(pixel.Item1, pixel.Item2 + 1)))
- {
- nextPixels.Add((pixel.Item1, pixel.Item2 + 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 + 1));
- }
- if (pixel.Item2 - 1 > 0 && colorsToBorder.Contains(result.GetPixel(pixel.Item1, pixel.Item2 - 1)))
- {
- nextPixels.Add((pixel.Item1, pixel.Item2 - 1));
- allPixelsToWrite.Add((pixel.Item1, pixel.Item2 - 1));
- }
- }
- }
- currentPixels = nextPixels;
- nextPixels = new List<(int, int)>();
- if (borderPos == BorderPosition.Center) curRadius++;
- }
- foreach((int, int) pixel in allPixelsToWrite)
- {
- result.SetPixel(pixel.Item1, pixel.Item2, borderColor);
- }
- }
- }
- }
- Bitmap result2 = new Bitmap(originalMap.Width, originalMap.Height);
- Graphics.FromImage(result2).DrawImage(result.Bitmap, 0, 0, originalMap.Width, originalMap.Height);
- result.Dispose();
- return result2;
- }
Advertisement
Add Comment
Please, Sign In to add comment