在c#面板中维护背景图像上的图形线

在c#面板中维护背景图像上的图形线,c#,graphics,scaling,lines,C#,Graphics,Scaling,Lines,我在c#面板的背景图像上画线。嵌板定位到窗体,以便窗体调整嵌板的大小。背景图像设置为拉伸,因此在调整窗体大小时所看到的只是背景图像 我最初的问题是: 当图像调整大小时,在面板上绘制的线(通过OnPaint事件)将保持原来绘制的位置 我当前的解决方案: 记录线的位置,并通过缩放X和Y坐标在新位图上重新绘制(工作正常) 我的新问题: 随着不断调整窗口大小和绘制线条,您无法从任何时间点计算缩放因子并将其应用于所有线条,因为这些线条最初都是在不同大小的图像中绘制的 我想我有两个选择: 在我重新绘制直线后

我在c#面板的背景图像上画线。嵌板定位到窗体,以便窗体调整嵌板的大小。背景图像设置为拉伸,因此在调整窗体大小时所看到的只是背景图像

我最初的问题是: 当图像调整大小时,在面板上绘制的线(通过OnPaint事件)将保持原来绘制的位置

我当前的解决方案: 记录线的位置,并通过缩放X和Y坐标在新位图上重新绘制(工作正常)

我的新问题: 随着不断调整窗口大小和绘制线条,您无法从任何时间点计算缩放因子并将其应用于所有线条,因为这些线条最初都是在不同大小的图像中绘制的

我想我有两个选择: 在我重新绘制直线后,通过我的直线阵列更新坐标信息,使其现在与当前比例匹配。 或 除了存储线的坐标信息外,还存储绘制时面板的尺寸信息,以便我始终可以根据绘制时间和新面板尺寸计算每条线的比例

我希望的是:
如果您对这两种方法中的任何一种都有想法,我们将不胜感激……更好的做法是为我指明一个更好的方法来实现这一点(我对c#中的图形处理相当陌生)。

无法写评论,尽管我很想写。您有几个选择:

  • 直接在原始位图上绘制线条。这可能不是您的选项,具体取决于任务

  • 像现在这样做,跟踪直线的坐标,在调整大小时更新它们,在绘制时重新绘制它们-如果使用此功能,也可以移动和删除它们

  • 或者通过引入“比例因子”(float)来实现,每次调整大小时都会更新该比例因子,并在绘制事件处理程序中使用该比例因子绘制所有内容。创建直线时,可以使用比例因子将其坐标计算回统一的坐标系(比例因子1),然后不必修改坐标。由于统一的坐标系,这可能很容易调试。这是我的建议,但也取决于你的任务

  • 绘制为与原始图像大小相同的全透明位图,使用与上一选项类似的比例因子。创建直线时,在统一坐标系中计算其坐标,在位图上绘制,然后在每次绘制时,在原始位图上绘制整个位图。同样,如果你需要删除或移动线条,或者你的内存很紧,或者你不想在放大时线条变得模糊,那么这可能不是一个选项,但不知何故,许多ppl像这样,因为它就像“Photoshop中的图层”。)


您的第三个选择是我在发布后不久就想到的,我正朝着这个方向努力。现在唯一让我犹豫不决的是,应用程序将来是否会有变化,可能需要初始坐标系必须是不同的尺寸,我真的不明白这一点;你总是在位图上画线,是吗?你不能把你的合作体系和那联系起来吗?您的坐标可能在原始位图的像素坐标中。我想您是在询问基本坐标系是否已更改?如果是这样的话,这是从应用程序发布的角度来看的(因此人们使用应用程序时定义了初始坐标系…在以后的某个版本中,我需要更改该基本坐标系)。如果我更改坐标系,我必须始终了解这两个坐标系,以便“升级”它们保存的工作。