gpt4 book ai didi

c# - 根据 SizeMode 转换 PictureBox 选区矩形

转载 作者:行者123 更新时间:2023-11-30 20:43:34 25 4
gpt4 key购买 nike

我有两个PictureBoxes pbOriginal 和pbFace。从 pbOriginal 中的图像中选择“面孔”后,我克隆矩形选区并将其放入 pbFace 中。但是,由于 pbOriginal 使用 SelectionMode=Stretch,实际复制的区域与选择的区域不同。

如何转换 Rectangle 的坐标,使它们真正反射(reflect) Stretched Image 的坐标?

最佳答案

下面是一个示例,它在您绘制第一个矩形的同时绘制第二个矩形……:

enter image description here

Point mDown = Point.Empty;
Point mCurr = Point.Empty;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{ mDown = e.Location; }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{ mCurr = e.Location; pictureBox1.Invalidate(); }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Rectangle r = new Rectangle(mDown.X, mDown.Y, mCurr.X - mDown.X, mCurr.Y - mDown.Y);
e.Graphics.DrawRectangle(Pens.Orange, r);
pictureBox2.Invalidate();
}

private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
if (pictureBox2.Image == null) return;

float stretch1X = 1f * pictureBox1.Image.Width / pictureBox1.ClientSize.Width;
float stretch1Y = 1f * pictureBox1.Image.Height / pictureBox1.ClientSize.Height;

int x = (int)(mDown.X * stretch1X);
int y = (int)(mDown.Y * stretch1Y);
int x2 = (int)(mCurr.X * stretch1X);
int y2 = (int)(mCurr.Y * stretch1Y);

Rectangle r = new Rectangle(x, y, x2 - x, y2 - y);
e.Graphics.DrawRectangle(Pens.Orange, r);
}

请注意,它假设您正在从左上角到右下角绘制..

如果您想复制选区,您可以使用相同的因素和相同的 Rectangle 作为 DrawImage 调用的源:

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));


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);
pictureBox2.Image = bmp;

您可能希望对 MouseUp 事件进行编码以存储 finla mCurr 位置并触发复制..

关于c# - 根据 SizeMode 转换 PictureBox 选区矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30436313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com