在光标后的第二个图片框中缩放图像
zoom an image in a second picturebox following cursor
我有一个包含图像 (1280 X 720) 的图片框,我想创建第二个图片框,其中包含以光标为中心的图像的缩放版本(例如,围绕光标缩放的 40 X 40 正方形在一个 120 X 120 的方形图片框中)实时实时跟随光标(如果图片框中间也有一个十字可以显示光标的精确位置就更好了)。
private void Button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "All jpg files (*.jpg)|*.jpg";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Bitmap img = new Bitmap(openFileDialog1.FileName);
double imageHeight = img.Height;
double imageWidth = img.Width;
pictureBox1.Image = img;
}
}
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
int xupleft = e.X - 20;
int yupleft = e.Y - 20;
Rectangle myrectangle = new Rectangle(xupleft, yupleft, 40, 40);
pictureBox2.Image = pictureBox1.Image;
}
这是我在评论中描述的布局的简单示例:
- 两个图片框都嵌套在面板中。
- 第一个处于
Zoom
模式,在加载文件时调整其大小以避免两侧出现空白条纹。它的父面板用于重置为最大允许大小。
- 第二个处于
AutoSize
模式,其父面板用于 1) 隐藏外部和 2) 计算图像居中的偏移量。
这是 pbox1 的简单 Paint
事件:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Size sz = pictureBox1.ClientSize;
Point pt = pictureBox1.PointToClient(Control.MousePosition);
e.Graphics.DrawLine(Pens.OrangeRed, pt.X, 0, pt.X, sz.Height);
e.Graphics.DrawLine(Pens.OrangeRed, 0, pt.Y, sz.Width, pt.Y);
}
这是 MouseMove
触发 Paint
并移动 pbox2:
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
pictureBox1.Invalidate();
float f = 1f * pictureBox2.ClientSize.Width / pictureBox1.ClientSize.Width;
Size s2 = pictureBox2.Parent.ClientSize;
Point p2 = Point.Round(new PointF(s2.Width/2 - e.X * f , s2.Height/2 - e.Y * f ));
pictureBox2.Location = p2;
}
文件加载有点棘手,因为需要分析图片和pbox的宽高比:
void loadFile(string fileName)
{
if (File.Exists(fileName))
{
pictureBox1.Size = panel1.ClientSize;
pictureBox1.Location = Point.Empty;
pictureBox1.Image = Image.FromFile(fileName);
pictureBox2.Image = Image.FromFile(fileName);
pictureBox2.Location = Point.Empty;
}
Size csz = pictureBox1.ClientSize;
Size isz = pictureBox1.Image.Size;
float iar = 1f * isz.Width / isz.Height; // aspect..
float car = 1f * csz.Width / csz.Height; //..ratios
if (iar < car)
{
pictureBox1.ClientSize = new Size((int)(pictureBox1.ClientSize.Height * iar),
pictureBox1.ClientSize.Height);
}
else if (iar > car)
{
pictureBox1.ClientSize = new Size((pictureBox1.ClientSize.Width,
(int)(pictureBox1.ClientSize.Width / iar));
}
}
请注意,在加载新图像之前,应该 Dispose
之前的图像!此外 after 将 pbox2.SizeMode
设置为 Autosize
可以将其设置为 Zoom
并向上或向下缩放其 Size
以放大或出局,如果保持纵横比相同。
结果:
我有一个包含图像 (1280 X 720) 的图片框,我想创建第二个图片框,其中包含以光标为中心的图像的缩放版本(例如,围绕光标缩放的 40 X 40 正方形在一个 120 X 120 的方形图片框中)实时实时跟随光标(如果图片框中间也有一个十字可以显示光标的精确位置就更好了)。
private void Button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "All jpg files (*.jpg)|*.jpg";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Bitmap img = new Bitmap(openFileDialog1.FileName);
double imageHeight = img.Height;
double imageWidth = img.Width;
pictureBox1.Image = img;
}
}
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
int xupleft = e.X - 20;
int yupleft = e.Y - 20;
Rectangle myrectangle = new Rectangle(xupleft, yupleft, 40, 40);
pictureBox2.Image = pictureBox1.Image;
}
这是我在评论中描述的布局的简单示例:
- 两个图片框都嵌套在面板中。
- 第一个处于
Zoom
模式,在加载文件时调整其大小以避免两侧出现空白条纹。它的父面板用于重置为最大允许大小。 - 第二个处于
AutoSize
模式,其父面板用于 1) 隐藏外部和 2) 计算图像居中的偏移量。
这是 pbox1 的简单 Paint
事件:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Size sz = pictureBox1.ClientSize;
Point pt = pictureBox1.PointToClient(Control.MousePosition);
e.Graphics.DrawLine(Pens.OrangeRed, pt.X, 0, pt.X, sz.Height);
e.Graphics.DrawLine(Pens.OrangeRed, 0, pt.Y, sz.Width, pt.Y);
}
这是 MouseMove
触发 Paint
并移动 pbox2:
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
pictureBox1.Invalidate();
float f = 1f * pictureBox2.ClientSize.Width / pictureBox1.ClientSize.Width;
Size s2 = pictureBox2.Parent.ClientSize;
Point p2 = Point.Round(new PointF(s2.Width/2 - e.X * f , s2.Height/2 - e.Y * f ));
pictureBox2.Location = p2;
}
文件加载有点棘手,因为需要分析图片和pbox的宽高比:
void loadFile(string fileName)
{
if (File.Exists(fileName))
{
pictureBox1.Size = panel1.ClientSize;
pictureBox1.Location = Point.Empty;
pictureBox1.Image = Image.FromFile(fileName);
pictureBox2.Image = Image.FromFile(fileName);
pictureBox2.Location = Point.Empty;
}
Size csz = pictureBox1.ClientSize;
Size isz = pictureBox1.Image.Size;
float iar = 1f * isz.Width / isz.Height; // aspect..
float car = 1f * csz.Width / csz.Height; //..ratios
if (iar < car)
{
pictureBox1.ClientSize = new Size((int)(pictureBox1.ClientSize.Height * iar),
pictureBox1.ClientSize.Height);
}
else if (iar > car)
{
pictureBox1.ClientSize = new Size((pictureBox1.ClientSize.Width,
(int)(pictureBox1.ClientSize.Width / iar));
}
}
请注意,在加载新图像之前,应该 Dispose
之前的图像!此外 after 将 pbox2.SizeMode
设置为 Autosize
可以将其设置为 Zoom
并向上或向下缩放其 Size
以放大或出局,如果保持纵横比相同。
结果: