【问题标题】:Relocate PictureBox after zoom C#缩放 C# 后重新定位 PictureBox
【发布时间】:2019-10-25 21:55:32
【问题描述】:

我在Panel 中有一个PictureBox,并且我已经使用TrackBar 实现了缩放功能。

当我增加(或减少)PictureBox 时,图像的位置保持固定在PictureBox 的左侧。 查看示例以更好地理解问题。

我想要的是与Panel 的中心相比重新定位图像的可能性。看下面的例子

例如我尝试用这种方式定义PictureBox X 原点:

  1. 在缩放之前,我计算PictureBox (x0) 的原点和Panel (x1) 的中心之间的距离 (Δdx)。
  2. 我使用缩放系数 (Δdx') 增加距离。
  3. 我将图像的新原点 (x0') 计算为 x1 - Δdx'

我对 Y 执行相同操作,并使用 x0' 和 y0' 定义新的 PictureBox 位置。

代码如下:

// new image width after the zoom
double width = pbImg.Image.Width + (pbImg.Image.Width * trackbar.Value / 100);

// new image height after the zoom
double height = pbImg.Image.Height + (pbImg.Image.Height * trackbar.Value / 100);

// panel center
int cX = panel.Width / 2;
int cY = panel.Height / 2;

// actual origin for the picturebox
int imgX = pbImg.Location.X;
int imgY = pbImg.Location.Y;

// distance the panel center and the picturebox origin
int distFromXc = cX - imgX;
int distFromYc = cY - imgY;

// new distance with zoom factor
distFromXc = distFromXc + (distFromXc * trackbar.Value / 100);
distFromYc = distFromYc + (distFromYc * trackbar.Value / 100);

// new origin point for the picturebox
int pbX = (cX - distFromXc);
int pbY = (cY - distFromYc);

// new dimension for the picturebox
pbImg.Size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));

// relocate picturebox
Point p = new Point(pbX, pbY);
pbImg.Location = p;

我试图修改这个C#代码,但我不熟悉。

就我而言,我想将Picturebox 和其中的图像作为同一个对象进行管理(如果可能的话)。

我想要的是增加(或减少)Picturebox(和里面的图像)的可能性,但我希望Picturebox 保持在当前位置的中心。

图片的SizeModeStretchImage

Trackbar 的最小值为 0%,最大值为 100%。 Picturebox 的大小和旁边的图片是可变的,我从其他软件接收图片。

放大后的Picturebox 可以大于Panel,但这不是问题,因为我可以移动它。

问题如下: 1. 如果我使用上面写的代码,重新定位似乎可以工作,但 Picturebox 没有调整大小。 2.如果我使用固定值作为图片框的原点(例如Point p = new Point(50, 50)),调整大小有效,但显然Picturebox的位置是固定的。

【问题讨论】:

  • imgY.Location 没有意义,请贴出你使用的真实代码。
  • 出现错误,我已更正。这是我正在使用的功能
  • 这里的过程描述有些混乱。目前尚不清楚您是否要调整图片框的大小/重新定位图片框、其中的图像或两者兼而有之。您至少可以指定 PictureBox 的 SizeMode 是什么吗?将一个矩形保持在另一个矩形中间所涉及的数学运算,无论两者的大小如何,都非常简单。
  • @Jimi 我编辑了我的问题,希望这次更清楚
  • 缺失部分:TrackBar 的最小值和最大值是什么,它们代表什么?一个百分比,其中100 等于...什么?容器的大小?图片的实际大小?在这种情况下,该值是否可以超过 100%?或者 TrackBar 值代表像素大小?您发布的图片可能会有所帮助,但实现细节更重要,因为您在实现方法时寻求帮助。

标签: c# winforms picturebox


【解决方案1】:

如果您希望 PictureBox 保持在当前位置的中心,并且仅“原地”展开或缩小,请尝试以下操作:

double width = pbImg.Width * trackbar.Value / 100;
double height = pbImg.Height * trackbar.Value / 100;
Rectangle rc = pbImg.Bounds;
rc.Inflate((int)((width - pbImg.Width) / 2), (int)((height - pbImg.Height) / 2));
pbImg.Bounds = rc;

请注意,这都是基于 PictureBox 本身的大小,不是里面的图像。不确定您为 PB 设置了什么 SizeMode...

--------- 编辑 ----------

我使用 StretchImage 作为 SizeMode。是否可能具有相同的行为但没有按钮?当我从左到右移动光标时,Pb 从右到左增加和减少 – Scarj

当然。将我的代码放入 ValueChanged() 和/或 Scroll() 事件中。 - Idle_Mind

原始帖子根据 PictureBox 的当前大小工作。您可能希望存储 PB 的原始 Bounds()(可能在 Tag() 属性中),然后始终根据它计算新的大小。

这是一个例子:

private void Form1_Load(object sender, EventArgs e)
{
    pbImg.Tag = pbImg.Bounds;
}

private void button1_Click(object sender, EventArgs e)
{

}

private void trackBar1_Scroll(object sender, EventArgs e)
{
    ZoomPB();
}

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
    ZoomPB();
}

private void ZoomPB()
{
    Rectangle rc = (Rectangle)pbImg.Tag;
    double width = rc.Width * trackbar.Value / 100;
    double height = rc.Height * trackbar.Value / 100;
    rc.Inflate((int)((width - rc.Width) / 2), (int)((height - rc.Height) / 2));
    pbImg.Bounds = rc;
}

【讨论】:

  • 我使用 StretchImage 作为 SizeMode。是否可能具有相同的行为但没有按钮?当我从左到右移动光标时,Pb 从右到左增加和减少
  • 当然。将我的代码放入 ValueChanged() 和/或 Scroll() 事件中。
  • 我用一个不使用按钮的例子编辑了我的帖子。
  • 我试过了,但是这样当我增加(或减少)时,图片框总是重新定位在面板的中心。我的图片框可以比面板大,我已经实现了移动图片框的可能性。
  • 使用我的代码,PB 将始终居中。大小将围绕中心点增加或减少。您是否在使用我的代码时遇到了不同的行为?
【解决方案2】:

这是因为您正在更改图片框的大小,而不是其中的图像大小。为确保图像与图片框的大小匹配,请确保您设置了拉伸图像大小模式

pbImg.SizeMode = PictureBoxSizeMode.StretchImage

要使其正常工作,您可以在更改图片框大小之前添加此行,但我建议在创建图片框时将其设置为。

参考:Fit Image into PictureBox

【讨论】:

  • 我照你说的做了,但没有任何改变。这里的代码 this.pbImg.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
  • 那么我建议您提供一个更广泛的代码示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多