缩放C#后重新定位PictureBox

时间:2019-06-11 12:59:34

标签: c# winforms picturebox

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

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

enter image description here

我想要的是与Panel的中心相比,可以重新定位图像。请参见以下示例

enter image description here

例如,我尝试以这种方式定义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的位置是固定的。

2 个答案:

答案 0 :(得分:0)

这是因为您要更改图片框的大小,而不是其中的图像大小。为确保图像与图片框的大小匹配,请确保设置了StretchImage SizeMode

pbImg.SizeMode = PictureBoxSizeMode.StretchImage

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

请参阅:Fit Image into PictureBox

答案 1 :(得分:0)

如果您希望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 ...

enter image description here

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

  

我正在使用StretchImage作为SizeMode。是否有相同的行为但没有按钮?当我从左向右移动光标时,铅的含量从右向左增加和减小– 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;
}

enter image description here