我在PictureBox
内有一个Panel
,并且已经用TrackBar
实现了缩放功能。
当我增加(或减少)PictureBox
时,图像的位置保持固定在PictureBox
的左侧。
请参见示例以更好地理解问题。
我想要的是与Panel
的中心相比,可以重新定位图像。请参见以下示例
例如,我尝试以这种方式定义PictureBox
X的原点:
PictureBox
(x0)的原点与Panel
(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
保持居中。
图片的SizeMode
是StretchImage
。
Trackbar
的最小值为0%,最大值为100%。
Picturebox
的大小和图像的旁边是可变的,我从其他软件接收图像。
缩放后的Picturebox
可以比Panel
大,但这不是问题,因为我可以移动它。
问题如下:
1.如果我使用上面编写的代码,则重新定位似乎可行,但是Picturebox
的大小未调整。
2.如果我对图片框的原点使用固定值(例如Point p = new Point(50, 50)
),则可以调整大小,但是显然Picturebox
的位置是固定的。
答案 0 :(得分:0)
这是因为您要更改图片框的大小,而不是其中的图像大小。为确保图像与图片框的大小匹配,请确保设置了StretchImage SizeMode
pbImg.SizeMode = PictureBoxSizeMode.StretchImage
要使其正常工作,您可以在更改图片框的大小之前添加此行,但是我建议在创建图片框时对其进行设置。
答案 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 ...
----------编辑----------
我正在使用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;
}