Как изменить размер изображения C # .net Windows Forms - PullRequest
2 голосов
/ 19 января 2012

Мне было интересно, как только я загружу изображение в форму окна, можно ли мне позволить пользователю перетаскивать углы этого изображения и изменять его размер?

В настоящее время я знаю о методе 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); 

            }
        }

Ответы [ 3 ]

6 голосов
/ 19 января 2012

В 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 голосов
/ 19 января 2012

Редактировать : В вашем случае лучше использовать метод Ганса Пассанта.Я буду держать ответ на всякий случай, если в конечном итоге у вас появятся более сложные требования к редактированию (например, перетаскивание нескольких фигур)


Интересная часть - заставить работать взаимодействие с мышью.А пока давайте предположим, что вы хотите изменить размер только путем перетаскивания правого нижнего угла изображения.Я хотел бы сделать что-то вроде этого:

  1. Создать UserControl с именем, например, ImageCanvas.Внутри этого элемента управления сделайте следующее:

  2. Добавьте поле для отслеживания размера / местоположения изображения, возможно Rectangle imageRect

  3. Переопределите метод OnPaint для отображения вашего изображения:

     protected override void OnPaint(PaintEventArgs e)
     {
         e.Graphics.DrawImage(image, imageRect);
     }
    
  4. Добавьте поле, чтобы отслеживать, когда пользователь изменяет размер изображения, скажем bool isDraggingSize

  5. Переопределить OnMouseDown и OnMouseUp.Установите или снимите isDraggingSize, когда кнопка мыши опускается или поднимается соответственно.

  6. Переопределите OnMouseMove, чтобы сделать следующее:

    • Установите курсор: если isDraggingSize или указатель мыши находится близко к нижнему правому углу изображения, установите Cursor = Cursors.SizeNWSE;в противном случае установите Cursor = Cursors.Default.

    • Если isDraggingSize, измените поле imageSize в зависимости от местоположения мыши.Позвоните Invalidate() или Refresh(), если необходимо, чтобы обновить дисплей.

  7. Поиграйте с ним и исправьте все мелкие детали - например, решитечто происходит, когда пользователь пытается изменить размер изображения больше, чем элемент управления, и как избавиться от мерцания.

0 голосов
/ 19 января 2012
 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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...