在光标后的第二个图片框中缩放图像

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 之前的图像!此外 afterpbox2.SizeMode 设置为 Autosize 可以将其设置为 Zoom 并向上或向下缩放其 Size 以放大或出局,如果保持纵横比相同。

结果: