按比例调整pictureBox大小以适应窗体大小调整

3

我希望每次用户调整表单大小时,pictureBox中的图像也按比例相同的值进行调整。

我在互联网上搜索了一些代码,并在StackOverFlow中找到了这个答案https://dev59.com/Rmw15IYBdhLWcg3wntAQ#6501997

static public Bitmap ScaleImage(Image image, int maxWidth, int maxHeight)
{
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);
    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);
    var newImage = new Bitmap(newWidth, newHeight);
    Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
    Bitmap bmp = new Bitmap(newImage);
    return bmp;
}

我给我的代码添加了一个函数,但不确定MaxHeight和MaxWidth的作用,也就是为什么需要通过参数传递。

Form1_Resize事件处理程序中,我写下了以下代码:

private void Form1_Resize(object sender, EventArgs e)
{
    Bitmap NewImg = ScaleImage(pictureBox1.Image, 1000, 1000);
    pictureBox1.Image = NewImg;
}

但是它不起作用... 当我调整表单大小时,什么也没有发生

更新:尝试了所有方法,结果相同

请查看下面的图片,黑点是PictureBox的左边,它不能移动,你提出的建议很好,但我希望,在开始时图片的左边保持在同一位置

调整前:

Before

调整后:

enter image description here


WinForms?为什么不使用WinForms控件属性呢? - Austin T French
他的意思是右键单击控件,然后单击属性,在那里您可以停靠图片框,然后它将自动随窗体调整大小。 - Syed Farjad Zia Zaidi
1
我假设这是WinForm并添加了标签,如果不是,请添加相关标签。 - Sriram Sakthivel
你有检查过 PictureBox.SizeMode 属性 吗? - Sriram Sakthivel
@SyedFarjadZiaZaidi 好的,我已经将pictureBox停靠了,但它只在我调整窗体大小时移动,而不会随之调整大小! - GabourX
显示剩余7条评论
2个回答

8
在Winforms中,您可以使用PictureBox属性来实现此目的,无需编写代码:
添加一个图片框,进入控件属性
这会显示5个选项。下面是Winform上相同图像的效果:
1. Normal仅显示图像并适合(我认为从像素0,0开始),不进行缩放或移动。 2. StretchImage将缩放并强制适应图像,即使这意味着扭曲图像。 3. AutoSize在这种情况下显示完整的图像,在这种情况下,图像比窗体大,因此只有一个巨大的蓝色块。 4. Centerimage保留控件不变,并显示图像的中心区域。 5. Zoom缩放图像,以便它在picturebox控件中完全显示。
结合控件的锚定或停靠使用,以使控件保持在所需位置并缩放图像。
听起来你可能想要使用Zoom。
缩放动作,设置所有边缘的锚点(并添加一个组框来模拟控件框):
然后,我可以调整表单的大小(在此例中为最大化),PictureBox控件会自行处理而无需额外的代码:
请注意,因为我正在使用非常矩形的图像,所以我已经设置了灰色背景来显示控件与图像的位置。您可以设置控件颜色背景来使其不那么明显,或者使用stretchImage而不是zoom来强制图像始终填充控件,虽然这会在非正方形图像上创建大量丑陋的伪影。
拉伸伪影示例:

那么,我的问题是,@GabourX,您要用代码做什么?始终查看完整的图像?您希望代码能够为您执行哪些Winform控件无法执行的操作?尝试删除代码(注释)并查看是否可以仅使用属性完成所需操作。 - Austin T French
我需要的在下面更新的答案中已经解释了,但是你是否确切地理解我想要的? - GabourX
@GabourX 我可以通过将 sizeMode 设置为“Zoom”,然后将 anchor 设置为顶部、右侧、左侧、底部来实现。或者将 sizeMode 设置为 Stretch 来消除边框/盒子。 - Austin T French
@GabourX 我给你提供了更多的例子,说明它是如何工作的。 - Austin T French

4
我建议您使用两个 GroupBox 控件,将按钮添加到左边的一个GroupBox中,将图像添加到右边的另一个GroupBox中,并使用它们的 Dock 属性。以下是适合您需求的示例:


调整大小之前

Before resizing

调整大小之后 After resizing

groupBox1Dock 属性为 Left,另一个 groupBox2 的同一属性为 Fill。此外,图像(位于第二个 groupBox 中)的 Dock 属性设置为 Fill


完美运行,只有一个小问题,现在鼠标事件不再发生。可能是因为GroupBox遮挡了图片? - GabourX
啊!我把图片删掉然后重新添加了,却忘记再次添加处理程序了,我的错 :) - GabourX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接