有时需要对ROI区域内图像做处理,但又不想被其他部分干扰到,最好的办法是把目标区域截取下来
我们在绘制完ROI之后右键菜单中选择截取ROI图像(ROI绘制见前几节内容)
利用Region类型获取ROI以外的部分,填充一个透明色即可。
private void 保存ROI截图ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (rects.Count > 0)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
GraphicsPath graphicsPath = new GraphicsPath(FillMode.Winding);
foreach (var rect in rects)
{
if (rect is RectangleF)
{
graphicsPath.AddRectangle((RectangleF)rect);
}
else if (rect is CircleF)
{
CircleF circle = (CircleF)rect;
graphicsPath.AddEllipse(circle.rect);
}
else if (rect is PolygonF)
{
PolygonF polygon = (PolygonF)rect;
graphicsPath.AddPolygon(polygon.points);
}
}
//将非ROI部分填充黑色
graphicsPath.CloseAllFigures();
RectangleF ROIrect = graphicsPath.GetBounds();
Image img = image;
Bitmap originimg = (Bitmap)img.Clone();
//originimg.Save(saveFileDialog1.FileName);
Graphics originG = Graphics.FromImage(originimg);
Region originregion = new Region(ROIrect);
originregion.Exclude(graphicsPath);
originG.DrawImageUnscaled(Image, 0, 0);
Brush brush = Brushes.WhiteSmoke;
originG.FillRegion(brush, originregion);
Bitmap ROIimg = new Bitmap((int)ROIrect.Width, (int)ROIrect.Height);
Graphics ROIg = Graphics.FromImage(ROIimg);
ROIg.DrawImage(originimg, new RectangleF(0, 0, ROIrect.Width, ROIrect.Height), ROIrect,
GraphicsUnit.Pixel);
ROIimg.MakeTransparent(Color.WhiteSmoke);
ROIimg.Save(saveFileDialog1.FileName, ImageFormat.Png);
}
}
else
{
}
}