前面解决了缩放的问题,但用PictureBox显示图像时,受到控件大小的限制,图像的最大放大长宽是受限的:65535
解决思路:通过虚拟一个PictureBox画布 矩形画布 Canvas RectangleF类型,长宽无限制。
下载地址:https://download.csdn.net/download/weixin_42253874/85299154https://download.csdn.net/download/weixin_42253874/85299154
2022-05-05 16-38-27-313
bandicam 2022-05-05 16-35-33-896
/// <summary>
/// 画布大小
/// </summary>
private RectangleF Canvas;
private Bitmap image;
多边形结构体
/// <summary>
/// 多边形
/// </summary>
public struct PolygonF
{
public List<PointF> PointFs;
public static readonly PolygonF Empty;
public PolygonF(float x,float y)
{
PointFs = new List<PointF>();
PointFs.Add(new PointF(x, y));
}
public PolygonF(PointF[] points)
{
PointFs = new List<PointF>();
PointFs.AddRange(points);
}
public PointF[] points
{
get => PointFs.ToArray();
}
public void Add(PointF point)
{
PointFs.Add(point);
PointFs.TrimExcess();
}
public void AddRange(PointF[] points)
{
PointFs.AddRange(points);
PointFs.TrimExcess();
}
public void Replace(int index, PointF point)
{
if (PointFs.Count>index)
{
PointFs.RemoveAt(index);
PointFs.Insert(index, point);
}
}
public void RemoveLast()
{
if (PointFs.Count>3)
{
PointFs.RemoveAt(PointFs.Count - 1);
}
}
public int Count
{
get => PointFs.Count;
}
public static bool operator ==(PolygonF left, PolygonF right)
{
return left.points == right.points;
}
public static bool operator !=(PolygonF left, PolygonF right)
{
return !(left == right);
}
}
绘制时判断是画了一个点,还是线,还是三个点以上(面)
else if (selectrect is PolygonF)
{
if (selectrect.points.Length > 2)
{
PointF[] points = selectrect.points;
PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
e.Graphics.DrawPolygon(MyPens.Select, pos);
e.Graphics.DrawEllipse(MyPens.Select,
new RectangleF(pos[polygonPoint].X - 10, pos[polygonPoint].Y - 10, 20, 20));
}
else if (selectrect.points.Length == 2)
{
PointF[] points = selectrect.points;
PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
e.Graphics.DrawLines(MyPens.Select, pos);
e.Graphics.DrawEllipse(MyPens.Select,
new RectangleF(pos[1].X - 10, pos[1].Y - 10, 20, 20));
}
else
{
PointF[] points = selectrect.points;
PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
e.Graphics.DrawEllipse(MyPens.Select,
new RectangleF(pos[0].X - 10, pos[0].Y - 10, 20, 20));
}
}
绘制时的思路和画圆画矩形一样,但不能通过鼠标松开判断是否结束,这里通过邮件菜单结束
private void 结束绘制ToolStripMenuItem_Click(object sender, EventArgs e)
{
isdrawing = false;
drawpolygon = false;
selectrect = null;
drawrect = null;
}