C# Rectangle基本用法和图片切割

目录

一、需求

Rectangle(Point, Size)

Rectangle(Int32, Int32, Int32, Int32)

二、常用的功能

1.判断两个矩形是否相交

2.求出两矩形相交重叠处的矩形

3.案例

三、切图Demo

结束


一、需求

矩形在开发中非常常见,比如截图功能,GDI+ 画图,Rectangle 的构造函数中,需要提供四个参数,坐标x,y,宽度,高度,另外还封装了其他的一写方法,比如是否相交,两矩形相交处重叠的矩形,根据左上,和右下坐标生成矩形等等方法,下面是构造函数的一些介绍。

构造函数:

Rectangle(Point, Size)

用指定的位置和大小初始化 Rectangle 类的新实例。

public Rectangle (System.Drawing.Point location, System.Drawing.Size size);

参数:location Point  Point,它表示矩形区域的左上角。size Size  Size,它表示矩形区域的宽度和高度。

Rectangle(Int32, Int32, Int32, Int32)

用指定的位置和大小初始化 Rectangle 类的新实例。

public Rectangle (int x, int y, int width, int height);

参数:x Int32 矩形左上角的 x 坐标。y Int32 矩形左上角的 y 坐标。width Int32 矩形的宽度。height Int32 矩形的高度。


 

二、常用的功能

1.判断两个矩形是否相交

判断连个矩形是否相交,返回值是布尔类型

Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
bool isIntersect = rectangle1.IntersectsWith(rectangle2);

2.求出两矩形相交重叠处的矩形

两个矩形相交后,根据两个矩形的重叠处,得出一个新的矩形

Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
Rectangle overlap = Rectangle.Intersect(rectangle1, rectangle2);

3.案例

上面这两个API,下面就用一个案例来展示

效果

上图可以看到,当两个图像重合后,就立马将重合的部分图像显示在旁边的小图中了,另外,我将是否重合的判断输出在控制台中了

C# Rectangle基本用法和图片切割_第1张图片

界面设计

C# Rectangle基本用法和图片切割_第2张图片

代码

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

切图的demo和上面的案例的功能类似

界面

C# Rectangle基本用法和图片切割_第3张图片

效果

 上面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

你可能感兴趣的:(C#,c#)