当前位置:网站首页>C# Rectangle basic usage and picture cutting
C# Rectangle basic usage and picture cutting
2022-07-31 23:21:00 【Xiong Siyu】
目录
Rectangle(Int32, Int32, Int32, Int32)
1.判断Whether the two rectangles intersect
2.Find the rectangle where the two rectangles intersect and overlap
一、需求
Rectangles are very common in development,Such as the screenshot function,GDI+ 画图,Rectangle 的构造函数中,Four parameters are required,坐标x,y,宽度,高度,It also encapsulates other write methods,such as whether to intersect,The rectangle that overlaps where the two rectangles meet,According to the upper left,and the lower right coordinates to generate a rectangle and so on,Here's some introduction to constructors.
构造函数:
Rectangle(Point, Size)
Initialize with the specified position and size Rectangle 类的新实例.
public Rectangle (System.Drawing.Point location, System.Drawing.Size size);参数:location Point Point,It represents the upper left corner of the rectangular area.size Size Size,It represents the width and height of the rectangular area.
Rectangle(Int32, Int32, Int32, Int32)
Initialize with the specified position and size Rectangle 类的新实例.
public Rectangle (int x, int y, int width, int height);参数:x Int32 矩形左上角的 x 坐标.y Int32 矩形左上角的 y 坐标.width Int32 矩形的宽度.height Int32 矩形的高度.
二、常用的功能
1.判断Whether the two rectangles intersect
Check whether two rectangles intersect,返回值是布尔类型
Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
bool isIntersect = rectangle1.IntersectsWith(rectangle2);2.Find the rectangle where the two rectangles intersect and overlap
After the two rectangles intersect,According to the overlap of the two rectangles,Get a new rectangle
Rectangle rectangle1 = new Rectangle(100,100,50,50);
Rectangle rectangle2 = new Rectangle(110,110,50,50);
Rectangle overlap = Rectangle.Intersect(rectangle1, rectangle2);3.案例
上面这两个API,A case is shown below
效果

上图可以看到,when the two images overlap,The overlapping part of the image is immediately displayed in the small picture next to it,另外,I output the judgment of coincidence in the console

界面设计

代码
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";
//Stores a list of rectangles
List<Rectangle> PictureCuttingList = new List<Rectangle>();
//边长
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);
//判断Whether the two rectangles intersect
Rectangle rectangle1 = PictureCuttingList[0];
Rectangle rectangle2 = PictureCuttingList[1];
bool isRect = rectangle1.IntersectsWith(rectangle2);
Console.WriteLine("Whether the two rectangles intersect:" + isRect);
if (isRect)
{
//The image of the part where the two rectangles intersect is displayed in the thumbnail
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;
}
}
/// <summary>
/// 给图片画矩形
/// </summary>
/// <param name="rectanglesList"></param>
/// <param name="bitmap"></param>
public Bitmap PaintingRectangle(List<Rectangle> 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;
}
/// <summary>
/// 图片上画矩形和标记文字
/// </summary>
/// <param name="bmp">图片bitmap</param>
/// <param name="imgRectangle">矩形</param>
/// <param name="lineColor">线条的颜色</param>
/// <param name="lineWidth">线条</param>
/// <param name="text">矩形的文本</param>
/// <param name="fontSize">字体大小</param>
/// <param name="ds">线条的线型</param>
/// <returns></returns>
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;
//The origin of the drawing coordinates(用于测试)
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);//填充的颜色
//Calculation of font position
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
切图的demoSimilar to the above case
界面

效果

上面gifThe last picture of the picture

代码
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 Crop Thumbnail
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string Img1Path = Application.StartupPath + "\\test.jpg";
List<PictureBox> PictureBoxesList = new List<PictureBox>();
List<Rectangle> PictureCuttingList = new List<Rectangle>();
//The width of the cut thumbnail
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);
}
/// <summary>
/// 选择图片路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// Generate a rectangle plot
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
//In this way, writing the rectangle will exceed the scope of the picture,可以用来测试
//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);
}
/// <summary>
/// 开始切割
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<Bitmap> cuttingList = CuttingHandle(PictureCuttingList, bitmaps);
if (cuttingList != null && cuttingList.Count > 0)
{
for (int i = 0; i < cuttingList.Count; i++)
{
PictureBoxesList[i].Image = cuttingList[i];
}
}
}
/// <summary>
/// 给图片画矩形
/// </summary>
/// <param name="rectanglesList"></param>
/// <param name="bitmap"></param>
public Bitmap PaintingRectangle(List<Rectangle> 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;
}
/// <summary>
/// 裁切图片(The coordinates of the slice have the upper left corner as the origin)
/// </summary>
/// <param name="pictureCuttingList">Area data list</param>
/// <param name="bitmap">图片bitmap</param>
/// <returns>List of images for slices</returns>
public List<Bitmap> CuttingHandle(List<Rectangle> 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<Bitmap> bitmapList = new List<Bitmap>();
for (int i = 0; i < pictureCuttingList.Count; i++)
{
Rectangle rectangle = pictureCuttingList[i];
if(rectangle == null)
{
Console.WriteLine("[CuttingHandle]pictureCuttingListA value is empty,index:" + i);
return null;
}
//Determine whether the coordinates are within the image range
Point pos = rectangle.Location;
Size size = rectangle.Size;
if(pos.X < 0 || pos.X + size.Width > bitmap.Width)
{
Console.WriteLine("[CuttingHandle]当前区域XAxes are out of picture,索引是:" + i);
return null;
}
if(pos.Y < 0 || pos.Y + size.Height > bitmap.Height)
{
Console.WriteLine("[CuttingHandle]当前区域YAxes are out of picture,索引是:" + i);
return null;
}
Bitmap cuttingBitmap = bitmap.Clone(rectangle, System.Drawing.Imaging.PixelFormat.DontCare);
bitmapList.Add(cuttingBitmap);
}
if (bitmapList.Count > 0)
return bitmapList;
return null;
}
/// <summary>
/// 图片上画矩形和标记文字
/// </summary>
/// <param name="bmp">图片bitmap</param>
/// <param name="imgRectangle">矩形</param>
/// <param name="lineColor">线条的颜色</param>
/// <param name="lineWidth">线条</param>
/// <param name="text">矩形的文本</param>
/// <param name="fontSize">字体大小</param>
/// <param name="ds">线条的线型</param>
/// <returns></returns>
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;
//The origin of the drawing coordinates(用于测试)
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);//填充的颜色
//Calculation of font position
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
边栏推荐
- Flutter教程之 02 Flutter 桌面程序开发入门教程运行hello world (教程含源码)
- What is customer profile management?
- VOT2021比赛简介
- Audio alignment using cross-correlation
- 消息队列消息存储设计(架构实战营 模块八作业)
- 面试题:实现死锁
- 20. Support vector machine - knowledge of mathematical principles
- Design of Fire and Anti-theft System Based on Single Chip GSM
- 如何减少软件设计和实现之间鸿沟
- PHP三元(三目)运算符
猜你喜欢

逐步手撕轮播图3(保姆级教程)

Program processes and threads (concurrency and parallelism of threads) and basic creation and use of threads

网络安全--通过握手包破解WiFi(详细教程)

硬件设备计算存储及数据交互杂谈

20. Support vector machine - knowledge of mathematical principles

网易云信圈组上线实时互动频道,「破冰」弱关系社交

Shell常用脚本:Nexus批量上传本地仓库脚本

Drawing process of hand-drawn map of scenic spots

Advanced Algebra _ Proof _ Any matrix is similar to an upper triangular matrix

基于mysql的消息队列设计
随机推荐
Program processes and threads (concurrency and parallelism of threads) and basic creation and use of threads
How to get useragent
SQL注入 Less38(堆叠注入)
Interview assault 69: TCP reliable?Why is that?
一款国外开发的高质量WordPress下载站模板主题
C程序设计-方法与实践(清华大学出版社)习题解析
SQL注入 Less47(报错注入) 和Less49(时间盲注)
数据分析(一)——matplotlib
In Golang go-redis cluster mode, new connections are constantly created, and the problem of decreased efficiency is solved
如何减少软件设计和实现之间鸿沟
游戏安全03:缓冲区溢出攻击简单解释
(26) About menu of the top menu of Blender source code analysis
周总结
SVN服务器搭建+SVN客户端+TeamCity集成环境搭建+VS2019开发
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
/etc/sysconfig/network-scripts 配置网卡
「SDOI2016」征途 题解
Document management and tools in the development process
VOT2021 game introduction
【1161. 最大层内元素和】