.NET 4.x Вырезать в отдельный файл области красного цвета(изображение) - C#
Формулировка задачи:
Есть изображение
Из него требуется получить большие скопления красного цвета. Проше говоря находим скопление, выделяем его по краям вырезаем эту часть и сохраняем.
Скопления могу быть на одном уровне по Y или по X.
А вот как определить место нахождение этих областей ?
Собственно вот функция вырезания и сохранения
// Первым параметром передаём исходное изображение
// Вторым и третим координаты верхнего левого угла вырезаемой части
// Два последующих параметра ширина и высота вырезаемой части
private void CutAndSave(Bitmap image, int x, int y, int width, int height)
{
Rectangle rect = new Rectangle(x, y, width, height);
var ret = new Bitmap(rect.Width, rect.Height);
using (var g = Graphics.FromImage(ret))
g.DrawImage(image, 0, 0, rect, GraphicsUnit.Pixel);
ret.Save("save.png");
}Решение задачи: «.NET 4.x Вырезать в отдельный файл области красного цвета(изображение)»
textual
Листинг программы
const int max_padding = 32;
public Bitmap ClearBitmap(Bitmap src)
{
var mask = SearchRegions(src);
List<Rectangle> regions = new List<Rectangle>();
Point topLeft = new Point(mask.Width, mask.Height), downRight = new Point(0, 0);
int last_paddingY = 0;
for (int y = 0; y < mask.Height; y++)
{
for (int x = 0; x < mask.Width; x++)
{
if (mask.GetPixel(x, y).R == 255)
{
if (y - last_paddingY <= max_padding || topLeft.Y == mask.Height)
{
if (topLeft.Y == mask.Height) { topLeft.Y = y; }
if (topLeft.X > x) { topLeft.X = x; }
if (downRight.X < x) { downRight.X = x; }
last_paddingY = y;
}
else
{
downRight.Y = last_paddingY;
regions.Add(new Rectangle(topLeft.X, topLeft.Y, downRight.X - topLeft.X + 1, downRight.Y - topLeft.Y + 1));
topLeft = new Point(mask.Width, mask.Height);
downRight = new Point(0, 0);
}
}
}
}
List<Bitmap> bitmaps = new List<Bitmap>();
foreach (Rectangle region in regions)
CutAndSave(src, region);
return mask;
}
private void CutAndSave(Bitmap src, Rectangle rect)
{
DateTime a = DateTime.Now;
src.Clone(rect, PixelFormat.Format32bppArgb).Save(a.Millisecond + ".jpg");
Thread.Sleep(1);
}