【发布时间】:2019-10-15 00:49:51
【问题描述】:
我有一个 PictureBox1,它的 sizemode 设置为 Stretch 和 PictureBox1。 PictureBox1 包含一个图像,让我选择它的一部分,然后裁剪它并将裁剪的部分存储在 PictureBox2 中。 当 sizemode 设置为 Stretch 且图片未缩放时效果很好,但当我缩放它或将 sizemode 设置为缩放时则不行。
working example - sizemode set to 'stretch'
我用来裁剪部分图片的代码 (original source)
try
{
float stretch1X = 1f * pictureBox1.Image.Width / pictureBox1.ClientSize.Width;
float stretch1Y = 1f * pictureBox1.Image.Height / pictureBox1.ClientSize.Height;
Point pt = new Point((int)(_mDown.X * stretch1X), (int)(_mDown.Y * stretch1Y));
Size sz = new Size((int)((_mCurr.X - _mDown.X) * stretch1X),
(int)((_mCurr.Y - _mDown.Y) * stretch1Y));
if (sz.Width > 0 && sz.Height > 0)
{
Rectangle rSrc = new Rectangle(pt, sz);
Rectangle rDest = new Rectangle(Point.Empty, sz);
Bitmap bmp = new Bitmap(sz.Width, sz.Height);
using (Graphics G = Graphics.FromImage(bmp))
G.DrawImage(pictureBox1.Image, rDest, rSrc, GraphicsUnit.Pixel);
return bmp;
}
return null;
}
catch (Exception ex)
{
throw ex;
}
如何正确计算?如何使裁剪功能以某种方式工作,以便用户放大/缩小并仍然裁剪图片的正确部分?
【问题讨论】:
-
当它被缩放然后stretch1X == stretch1Y。 Look here.
-
如何将它应用到我的场景中?你能再解释一下吗?你的解释对我来说不是很清楚@HansPassant
-
您需要知道显示图像的大小,该方法会计算它。只需复制缩放案例的代码。一旦你知道了这个大小,你可以将它除以 image.Width 来知道stretch1X。因此stretch1Y。显示的图像将被水平或垂直的信箱,由显示的图像大小和 PictureBox.ClientSize 之间的差异除以 2 偏移。
-
这个有点混乱,能不能根据我上面贴的代码贴一些提示代码?提前感谢@HansPassant
-
@Hans:你说的很对!有趣的是我怎么找不到那个帖子..!?我留下答案是因为它还会创建裁剪后的图像并证明它也可以在缩放模式下工作..
标签: c#