如何重新调整图像的大小C#.net Windows窗体

如何重新调整图像的大小C#.net Windows窗体,c#,.net,winforms,C#,.net,Winforms,我想知道,一旦我将一个图像加载到windows窗体中,是否有一种方法允许用户拖动该图像的角并重新调整其大小 目前,我知道PictureBox.Scale方法(但不推荐使用)。我还知道PictureBox.Image.Size。这是否意味着每次它们重新调整大小时,我都需要使用PictureBox.Image.size?另外,我如何允许他们抓取图像以重新调整大小?我想我正在考虑绘画,以及它如何允许用户选择图像,然后通过拖动角来重新调整大小 我不是在寻找一个完整的解决方案——只是一些指向正确方向的指针

我想知道,一旦我将一个图像加载到windows窗体中,是否有一种方法允许用户拖动该图像的角并重新调整其大小

目前,我知道PictureBox.Scale方法(但不推荐使用)。我还知道PictureBox.Image.Size。这是否意味着每次它们重新调整大小时,我都需要使用PictureBox.Image.size?另外,我如何允许他们抓取图像以重新调整大小?我想我正在考虑绘画,以及它如何允许用户选择图像,然后通过拖动角来重新调整大小

我不是在寻找一个完整的解决方案——只是一些指向正确方向的指针(伪代码或帮助我思考过程的一般描述就可以了)。我不太清楚如何处理这个问题

以下是我目前的代码:

        using (OpenFileDialog ofd = new OpenFileDialog())
        {
            ofd.Title = "Load Image";

            if (ofd.ShowDialog() == DialogResult.OK)
            {

                PictureBox pictureBox = new PictureBox();
                pictureBox.Image = new Bitmap(ofd.FileName);
                pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox.Size = pictureBox.Image.Size; 
                panelArea.Controls.Add(pictureBox); 

            }
        }
公共位图\u当前位图;
公共空间大小调整(int-newWidth、int-newHeight)
{
if(newWidth!=0&&newHeight!=0)
{
位图温度=(位图)\u当前位图;
位图bmap=新位图(新宽度、新高度、临时像素格式);
双nWidthFactor=(双)临时宽度/(双)新宽度;
双N权重系数=(双)温度高度/(双)新高度;
纽约州纽约州财政部双倍外汇;
int-cx,cy,fr_x,fr_y;
颜色1=新颜色();
颜色2=新颜色();
Color color3=新颜色();
Color color4=新颜色();
字节nRed、nGreen、nBlue;
字节bp1,bp2;
对于(int x=0;x=温度宽度)cx=fr\ux;
cy=fr_y+1;
如果(cy>=温度高度)cy=fr\u y;
fx=x*nWidthFactor-fr_x;
fy=y*n权重因子-fr_y;
nx=1.0-fx;
ny=1.0-fy;
color1=温度获取像素(fr_x,fr_y);
color2=温度获取像素(cx,fr_y);
color3=温度获取像素(fr_x,cy);
color4=温度获取像素(cx,cy);
//蓝色的
bp1=(字节)(nx*color1.B+fx*color2.B);
bp2=(字节)(nx*color3.B+fx*color4.B);
nBlue=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
//绿色的
bp1=(字节)(nx*color1.G+fx*color2.G);
bp2=(字节)(nx*color3.G+fx*color4.G);
nGreen=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
//红色的
bp1=(字节)(nx*color1.R+fx*color2.R);
bp2=(字节)(nx*color3.R+fx*color4.R);
nRed=(字节)(ny*(双字节)(bp1)+fy*(双字节)(bp2));
bmap.SetPixel(x,y,System.Drawing.Color.FromArgb(255,nRed,nGreen,nBlue));
}
}
_currentBitmap=(位图)bmap.Clone();
}
}

编辑:在您的情况下,Hans Passant的方法是最好的。我会保持我的答案,以防您最终有更复杂的编辑需求(例如,拖动多个形状)


有趣的部分是让鼠标交互工作。现在,假设您只想通过拖动图像的右下角来调整大小。我会这样做:

  • 创建名为的UserControl,例如,
    ImageCanvas
    。在此控件内,执行以下操作:

  • 添加一个字段以跟踪图像的大小/位置,可能是
    Rectangle imageRect

  • 覆盖
    OnPaint
    方法以显示图像:

     protected override void OnPaint(PaintEventArgs e)
     {
         e.Graphics.DrawImage(image, imageRect);
     }
    
  • 添加一个字段以跟踪用户何时调整图像大小,例如
    bool isdragingsize

  • 覆盖
    OnMouseDown
    onmousedup
    。当鼠标按钮分别向下或向上移动时,设置或清除
    isDragingSize

  • 覆盖OnMouseMove以执行以下操作:

    • 设置光标:如果
      isDragingSize
      或鼠标指针靠近图像的右下角,则设置
      cursor=Cursors.SizeNWSE
      ;否则,设置
      Cursor=Cursors.Default

    • 如果
      isDragingSize
      ,请根据鼠标位置更改
      imageSize
      字段。必要时调用
      Invalidate()
      ,或
      Refresh()
      ,以更新显示

  • 玩转它,修复所有的小细节——比如决定当用户试图调整大于控件的图像时会发生什么,以及如何消除闪烁


  • Winforms中已经有一个控件可以显示位图并支持使用鼠标调整大小:窗体。你只需要做一点手术就可以控制它:

            using (OpenFileDialog ofd = new OpenFileDialog()) {
                ofd.Title = "Load Image";
    
                if (ofd.ShowDialog() == DialogResult.OK) {
                    var box = new Form();
                    box.TopLevel = box.ControlBox = false;
                    box.Visible = true;
                    box.BackgroundImage = new Bitmap(ofd.FileName);
                    panelArea.Controls.Add(box);
                    box.Size = box.BackgroundImage.Size;
                }
            }
    

    谢谢贾斯汀,你的解决方案仍然非常有用-很高兴你留下了它。再次感谢!
            using (OpenFileDialog ofd = new OpenFileDialog()) {
                ofd.Title = "Load Image";
    
                if (ofd.ShowDialog() == DialogResult.OK) {
                    var box = new Form();
                    box.TopLevel = box.ControlBox = false;
                    box.Visible = true;
                    box.BackgroundImage = new Bitmap(ofd.FileName);
                    panelArea.Controls.Add(box);
                    box.Size = box.BackgroundImage.Size;
                }
            }