目录
一、需求
Rectangle(Point, Size)
Rectangle(Int32, Int32, Int32, Int32)
二、常用的功能
1.判断两个矩形是否相交
2.求出两矩形相交重叠处的矩形
3.案例
三、切图Demo
结束
矩形在开发中非常常见,比如截图功能,GDI+ 画图,Rectangle 的构造函数中,需要提供四个参数,坐标x,y,宽度,高度,另外还封装了其他的一写方法,比如是否相交,两矩形相交处重叠的矩形,根据左上,和右下坐标生成矩形等等方法,下面是构造函数的一些介绍。
构造函数:
用指定的位置和大小初始化 Rectangle 类的新实例。
public Rectangle (System.Drawing.Point location, System.Drawing.Size size);
参数:location Point Point,它表示矩形区域的左上角。size Size Size,它表示矩形区域的宽度和高度。
用指定的位置和大小初始化 Rectangle 类的新实例。
public Rectangle (int x, int y, int width, int height);
参数:x Int32 矩形左上角的 x 坐标。y Int32 矩形左上角的 y 坐标。width Int32 矩形的宽度。height Int32 矩形的高度。
判断连个矩形是否相交,返回值是布尔类型
Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
bool isIntersect = rectangle1.IntersectsWith(rectangle2);
两个矩形相交后,根据两个矩形的重叠处,得出一个新的矩形
Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
Rectangle overlap = Rectangle.Intersect(rectangle1, rectangle2);
上面这两个API,下面就用一个案例来展示
效果
上图可以看到,当两个图像重合后,就立马将重合的部分图像显示在旁边的小图中了,另外,我将是否重合的判断输出在控制台中了
界面设计
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 矩形
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//图片列表
private string Img1Path = Application.StartupPath + "\\test.jpg";
//存储矩形列表
List PictureCuttingList = new List();
//边长
int SideLength = 180;
private void Form1_Load(object sender, EventArgs e)
{
}
private void Button_Examine_Click(object sender, EventArgs e)
{
if (!System.IO.File.Exists(Img1Path))
{
Console.WriteLine("图片路径不存在:" + Img1Path);
return;
}
Bitmap bitmaps = new Bitmap(Img1Path);
Random random = new Random();
PictureCuttingList.Clear();
PictureBox_Coincide.Image = null;
for (int i = 0; i < 2; i++)
{
int x = random.Next(10, bitmaps.Width - SideLength);
int y = random.Next(10, bitmaps.Height - SideLength);
PictureCuttingList.Add(new Rectangle(new Point(x, y), new Size(SideLength, SideLength)));
}
//给图片画矩形
PictureBox_Template.Image = PaintingRectangle(PictureCuttingList, bitmaps);
//判断两个矩形是否相交
Rectangle rectangle1 = PictureCuttingList[0];
Rectangle rectangle2 = PictureCuttingList[1];
bool isRect = rectangle1.IntersectsWith(rectangle2);
Console.WriteLine("两个矩形是否相交:" + isRect);
if (isRect)
{
//两个矩形相交部分图片显示到小图中
Rectangle overlap = Rectangle.Intersect(rectangle1, rectangle2);
Bitmap newBitmap = new Bitmap(Img1Path);
Bitmap cuttingBitmap = newBitmap.Clone(overlap, System.Drawing.Imaging.PixelFormat.DontCare);
PictureBox_Coincide.Image = cuttingBitmap;
}
}
///
/// 给图片画矩形
///
///
///
public Bitmap PaintingRectangle(List rectanglesList, Bitmap bitmap)
{
Bitmap bit = null;
for (int i = 0; i < rectanglesList.Count; i++)
{
if (bit == null)
{
bit = DrawRectangleInPicture(bitmap, rectanglesList[i], Color.Red, 4, "索引:" + i, 25);
}
else
{
Bitmap newBit = new Bitmap(bit);
bit.Dispose();
bit = DrawRectangleInPicture(newBit, rectanglesList[i], Color.Red, 4, "索引:" + i, 25);
}
}
if (bit == null)
{
Console.WriteLine("bit等于null");
return null;
}
return bit;
}
///
/// 图片上画矩形和标记文字
///
/// 图片bitmap
/// 矩形
/// 线条的颜色
/// 线条
/// 矩形的文本
/// 字体大小
/// 线条的线型
///
public Bitmap DrawRectangleInPicture(Bitmap bmp, Rectangle imgRectangle, Color lineColor, int lineWidth, string text, int fontSize, DashStyle ds = DashStyle.Solid)
{
if (bmp == null) return null;
if (imgRectangle == null) return null;
if (lineColor == null) return null;
if (lineWidth == 0) return null;
if (fontSize == 0) return null;
if (string.IsNullOrEmpty(text)) return null;
Point pos = imgRectangle.Location;
Size size = imgRectangle.Size;
Graphics g = Graphics.FromImage(bmp);
Brush brush = new SolidBrush(lineColor);
Pen pen = new Pen(brush, lineWidth);
pen.DashStyle = ds;
//画坐标的原点(用于测试)
g.DrawEllipse(pen, new Rectangle(pos.X, pos.Y, 15, 15));
//画矩形
//int rectX = pos.X - (size.Width / 2);
//int rectY = pos.Y - (size.Height / 2);
//g.DrawRectangle(pen, rectX, rectY, size.Width, size.Height);
g.DrawRectangle(pen, pos.X, pos.Y, size.Width, size.Height);
Font myFont = new Font("宋体", fontSize, FontStyle.Regular);
Brush bush = new SolidBrush(lineColor);//填充的颜色
//字体位置的计算
SizeF sizeF = g.MeasureString(text, myFont);
//int fontPosX = (int)(pos.X - (sizeF.Width / 2));
//int fontPosY = (int)(pos.Y + (sizeF.Height / 2) + (size.Height / 2));
//g.DrawString(text, myFont, bush, fontPosX, fontPosY);
int fontPosX = (int)(pos.X + (size.Width / 2) - (sizeF.Width / 2));
int fontPosY = (int)(pos.Y + (size.Height / 2) - (sizeF.Height / 2));
g.DrawString(text, myFont, bush, fontPosX, fontPosY);
g.Dispose();
return bmp;
}
}
}
切图的demo和上面的案例的功能类似
界面
效果
上面gif图片的最后画面
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 裁切小图
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string Img1Path = Application.StartupPath + "\\test.jpg";
List PictureBoxesList = new List();
List PictureCuttingList = new List();
//切割小图的宽度
int ImgWidth = 180;
private void Form1_Load(object sender, EventArgs e)
{
TextBox_ImaPath.Text = Img1Path;
PictureBoxesList.Add(pictureBox1);
PictureBoxesList.Add(pictureBox2);
PictureBoxesList.Add(pictureBox3);
PictureBoxesList.Add(pictureBox4);
PictureBoxesList.Add(pictureBox5);
}
///
/// 选择图片路径
///
///
///
private void Button_SelectImg_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = true;//该值确定是否可以选择多个文件
dialog.Title = "请选择文件";
dialog.Filter = "所有文件(*.*)|*.*";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
TextBox_ImaPath.Text = dialog.FileName;
Img1Path = dialog.FileName;
PictureBox_Template.Image = new Bitmap(Img1Path);
}
}
///
/// 生成矩形图
///
///
///
private void Button_Examine_Click(object sender, EventArgs e)
{
if (!System.IO.File.Exists(Img1Path))
{
Console.WriteLine("图片路径不存在:" + Img1Path);
return;
}
Bitmap bitmaps = new Bitmap(Img1Path);
Random random = new Random();
//Console.WriteLine(string.Format("总宽度:{0} 总高度:{1}", Bitmaps.Width, Bitmaps.Height));
PictureCuttingList.Clear();
for (int i = 0; i < 2; i++)
{
int x = random.Next(10, bitmaps.Width - ImgWidth);
int y = random.Next(10, bitmaps.Height - ImgWidth);
//这样写矩形会超出图片范围,可以用来测试
//int x = random.Next(10, Bitmaps.Width);
//int y = random.Next(10, Bitmaps.Height);
//Console.WriteLine(string.Format("索引值: {0} x: {1}, y: {2}", i, x, y));
PictureCuttingList.Add(new Rectangle(new Point(x, y), new Size(ImgWidth, ImgWidth)));
}
//给图片画矩形
PictureBox_Template.Image = PaintingRectangle(PictureCuttingList, bitmaps);
}
///
/// 开始切割
///
///
///
private void Button_Cutting_Click(object sender, EventArgs e)
{
if (!System.IO.File.Exists(Img1Path))
{
Console.WriteLine("图片路径不存在:" + Img1Path);
return;
}
if (PictureCuttingList.Count == 0)
{
Console.WriteLine("PictureCuttingList不能为空");
return;
}
Bitmap bitmaps = new Bitmap(Img1Path);
List cuttingList = CuttingHandle(PictureCuttingList, bitmaps);
if (cuttingList != null && cuttingList.Count > 0)
{
for (int i = 0; i < cuttingList.Count; i++)
{
PictureBoxesList[i].Image = cuttingList[i];
}
}
}
///
/// 给图片画矩形
///
///
///
public Bitmap PaintingRectangle(List rectanglesList, Bitmap bitmap)
{
Bitmap bit = null;
for (int i = 0; i < rectanglesList.Count; i++)
{
if (bit == null)
{
bit = DrawRectangleInPicture(bitmap, rectanglesList[i], Color.Red, 4, "索引:" + i, 25);
}
else
{
Bitmap newBit = new Bitmap(bit);
bit.Dispose();
bit = DrawRectangleInPicture(newBit, rectanglesList[i], Color.Red, 4, "索引:" + i, 25);
}
}
if (bit == null)
{
Console.WriteLine("bit等于null");
return null;
}
return bit;
}
///
/// 裁切图片(切片的坐标以左上角为原点)
///
/// 区域数据列表
/// 图片bitmap
/// 切片的图片列表
public List CuttingHandle(List pictureCuttingList, Bitmap bitmap)
{
if (pictureCuttingList == null || pictureCuttingList.Count == 0)
{
Console.WriteLine("[CuttingHandle]pictureCuttingList不能为空");
return null;
}
if (bitmap == null)
{
Console.WriteLine("[CuttingHandle]图片bitmap不能为空");
return null;
}
List bitmapList = new List();
for (int i = 0; i < pictureCuttingList.Count; i++)
{
Rectangle rectangle = pictureCuttingList[i];
if(rectangle == null)
{
Console.WriteLine("[CuttingHandle]pictureCuttingList有值为空,index:" + i);
return null;
}
//判断坐标是否在图片范围内
Point pos = rectangle.Location;
Size size = rectangle.Size;
if(pos.X < 0 || pos.X + size.Width > bitmap.Width)
{
Console.WriteLine("[CuttingHandle]当前区域X轴超出图片范围,索引是:" + i);
return null;
}
if(pos.Y < 0 || pos.Y + size.Height > bitmap.Height)
{
Console.WriteLine("[CuttingHandle]当前区域Y轴超出图片范围,索引是:" + i);
return null;
}
Bitmap cuttingBitmap = bitmap.Clone(rectangle, System.Drawing.Imaging.PixelFormat.DontCare);
bitmapList.Add(cuttingBitmap);
}
if (bitmapList.Count > 0)
return bitmapList;
return null;
}
///
/// 图片上画矩形和标记文字
///
/// 图片bitmap
/// 矩形
/// 线条的颜色
/// 线条
/// 矩形的文本
/// 字体大小
/// 线条的线型
///
public Bitmap DrawRectangleInPicture(Bitmap bmp, Rectangle imgRectangle, Color lineColor, int lineWidth, string text, int fontSize, DashStyle ds = DashStyle.Solid)
{
if (bmp == null) return null;
if (imgRectangle == null) return null;
if (lineColor == null) return null;
if (lineWidth == 0) return null;
if (fontSize == 0) return null;
if (string.IsNullOrEmpty(text)) return null;
Point pos = imgRectangle.Location;
Size size = imgRectangle.Size;
Graphics g = Graphics.FromImage(bmp);
Brush brush = new SolidBrush(lineColor);
Pen pen = new Pen(brush, lineWidth);
pen.DashStyle = ds;
//画坐标的原点(用于测试)
g.DrawEllipse(pen, new Rectangle(pos.X, pos.Y, 15, 15));
//画矩形
//int rectX = pos.X - (size.Width / 2);
//int rectY = pos.Y - (size.Height / 2);
//g.DrawRectangle(pen, rectX, rectY, size.Width, size.Height);
g.DrawRectangle(pen, pos.X, pos.Y, size.Width, size.Height);
Font myFont = new Font("宋体", fontSize, FontStyle.Regular);
Brush bush = new SolidBrush(lineColor);//填充的颜色
//字体位置的计算
SizeF sizeF = g.MeasureString(text, myFont);
//int fontPosX = (int)(pos.X - (sizeF.Width / 2));
//int fontPosY = (int)(pos.Y + (sizeF.Height / 2) + (size.Height / 2));
//g.DrawString(text, myFont, bush, fontPosX, fontPosY);
int fontPosX = (int)(pos.X + (size.Width / 2) - (sizeF.Width / 2));
int fontPosY = (int)(pos.Y + (size.Height / 2) - (sizeF.Height / 2));
g.DrawString(text, myFont, bush, fontPosX, fontPosY);
g.Dispose();
return bmp;
}
}
}
源码地址:点击下载
如果这个帖子对你有用,欢迎 关注 + 点赞 + 留言,谢谢
end