【问题标题】:How To Re-size An Image C#.net Windows Forms如何调整图像大小 C#.net Windows 窗体
【发布时间】:2012-02-13 20:10:59
【问题描述】:

我想知道,一旦我将图像加载到 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); 

            }
        }

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    编辑:在你的情况下,Hans Passant 的方法是最好的。如果您最终有更复杂的编辑要求(例如,拖动多个形状),我会继续回答


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

    1. 创建一个名为的用户控件,例如 ImageCanvas。在此控件中,执行以下操作:

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

    3. 覆盖OnPaint 方法以显示您的图像:

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

    5. 覆盖 OnMouseDownOnMouseUp。分别在鼠标按钮向下或向上时设置或清除isDraggingSize

    6. 覆盖 OnMouseMove 以执行以下操作:

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

      • 如果是isDraggingSize,则根据鼠标位置更改imageSize 字段。如有必要,请致电Invalidate()Refresh() 以更新显示。

    7. 玩转它,并修复所有小细节 - 例如决定当用户尝试将图像大小调整为大于控件时会发生什么,以及如何消除闪烁。

      李>

    【讨论】:

    • 感谢贾斯汀,您的解决方案仍然非常有用 - 很高兴您放弃了它。再次感谢!
    【解决方案3】:
     public Bitmap _currentBitmap;
    
     public void Resize(int newWidth, int newHeight)
        {
            if (newWidth != 0 && newHeight != 0)
            {
                Bitmap temp = (Bitmap)_currentBitmap;
                Bitmap bmap = new Bitmap(newWidth, newHeight, temp.PixelFormat);
    
                double nWidthFactor = (double)temp.Width / (double)newWidth;
                double nHeightFactor = (double)temp.Height / (double)newHeight;
    
                double fx, fy, nx, ny;
                int cx, cy, fr_x, fr_y;
                Color color1 = new Color();
                Color color2 = new Color();
                Color color3 = new Color();
                Color color4 = new Color();
                byte nRed, nGreen, nBlue;
    
                byte bp1, bp2;
    
                for (int x = 0; x < bmap.Width; ++x)
                {
                    for (int y = 0; y < bmap.Height; ++y)
                    {
    
                        fr_x = (int)Math.Floor(x * nWidthFactor);
                        fr_y = (int)Math.Floor(y * nHeightFactor);
                        cx = fr_x + 1;
                        if (cx >= temp.Width) cx = fr_x;
                        cy = fr_y + 1;
                        if (cy >= temp.Height) cy = fr_y;
                        fx = x * nWidthFactor - fr_x;
                        fy = y * nHeightFactor - fr_y;
                        nx = 1.0 - fx;
                        ny = 1.0 - fy;
    
                        color1 = temp.GetPixel(fr_x, fr_y);
                        color2 = temp.GetPixel(cx, fr_y);
                        color3 = temp.GetPixel(fr_x, cy);
                        color4 = temp.GetPixel(cx, cy);
    
                        // Blue
                        bp1 = (byte)(nx * color1.B + fx * color2.B);
    
                        bp2 = (byte)(nx * color3.B + fx * color4.B);
    
                        nBlue = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
    
                        // Green
                        bp1 = (byte)(nx * color1.G + fx * color2.G);
    
                        bp2 = (byte)(nx * color3.G + fx * color4.G);
    
                        nGreen = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
    
                        // Red
                        bp1 = (byte)(nx * color1.R + fx * color2.R);
    
                        bp2 = (byte)(nx * color3.R + fx * color4.R);
    
                        nRed = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
    
                        bmap.SetPixel(x, y, System.Drawing.Color.FromArgb(255, nRed, nGreen, nBlue));
                    }
                }
                _currentBitmap = (Bitmap)bmap.Clone();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多