如果PictureBox比图片小,将图像调整适应PictureBox

3
我有一个PictureBox,它可以具有多种不同的大小(取决于屏幕分辨率、窗口状态等)。我想要的是,当图像的任一维度(宽度或高度)低于PictureBox的相应维度时,将我的图像适配到PictureBox。
例如:如果图像的宽度大于PictureBox的宽度,但图像的高度小于PictureBox的高度,则会调整图像的宽度,直到与PictureBox的宽度相等,保持原始纵横比,并在垂直方向上居中图像。
如果PictureBox大于图像的两个尺寸,则只需将图像居中。我已经使用PictureBoxSizeMode.AutoSize完成了这部分工作,并编写了一些代码来根据图像和PictureBox的大小居中图像。
picbx.ImageLocation = "Image path here";
picbx.SizeMode = PictureBoxSizeMode.AutoSize;
picbx.Anchor = AnchorStyles.None;
picbx.Location = new Point((picbx.Parent.ClientSize.Width / 2) - (picImage.Width / 2),
                           (picbx.Parent.ClientSize.Height / 2) - (picImage.Height / 2));
picbx.Refresh();

有一件事情我不需要考虑,那就是实时调整大小。窗口不允许调整大小,除了初始加载之外,没有必要考虑任何其他情况。

我发现很多帖子似乎都接近问题所在,但没有一个完全解决问题。 Stretch 会扭曲图片,imageAutoSize 不会根据容器大小调整大小,Zoom 可能适用于当 image 大于 PictureBox 时,但我还没有找到防止缩放使 image 大小适应 PictureBox 的方法。

因为我将其设置为 picbx.ImageLocation 而不是设置 picbx.Image 属性,所以我还没有找到一种方法来根据需要调整大小的尺寸(宽度或高度)来调整 PictureBox 内部的 image 的大小。

1个回答

8
如果您知道 PictureBoxImage 的大小,您可以简单地设置适当的 SizeMode - 当图像的宽度或高度大于图片框时使用 Zoom,否则使用 CenterImage
var imageSize = picbx.Image.Size;
var fitSize = picbx.ClientSize;
picbx.SizeMode = imageSize.Width > fitSize.Width || imageSize.Height > fitSize.Height ?
    PictureBoxSizeMode.Zoom : PictureBoxSizeMode.CenterImage;

正是我所需要的。只需要正确的组合。谢谢! - Hank
有没有一种方法可以将缩放设置为适合特定尺寸而不是默认方式?比如说,如果我想切换到按宽度缩放而不是高度,以模仿一种缩放的效果? - Hank
我不这么认为。它可以按比例缩放以适应两个维度,仍然保持原始图像的比例,这是有意义的。你所说的适应特定尺寸是什么意思?适应一个并裁剪另一个吗? - Ivan Stoev
1
我找到了解决我的情况的方法。我的意思是让一个适应并为另一个强制出现滚动条。但是我找到了一个有效的解决方案。 - Hank

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