2012-01-19 2 views
0

Мне было интересно, как только я загружу изображение в форму окна, есть ли способ разрешить пользователю перетаскивать углы этого изображения и изменять размер Это?Как изменить размер изображения C# .net Windows Forms

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

      } 
     } 
+0

http://stackoverflow.com/questions/249587/high-quality-image-scaling-c-sharp HTTP: //stackoverflow.com/questions/87753/resizing-an-image-without-losing-any-quality http://stackoverflow.com/questions/1922040/resize-an-image-c-sharp http://stackoverflow.com/questions/703873/how-to-proportional-resize-image-of-any-type-in-net –

ответ

4

В 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; 
      } 
     } 
+0

+1 Очень элегантный - гораздо проще, чем мой ответ. – Justin

+0

@Hans Prassant, спасибо. – BigBug

0
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(); 
     } 
    } 
1

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


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

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

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

  3. Override метод OnPaint, чтобы отобразить изображение:

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

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

  6. Override OnMouseMove сделать следующее:

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

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

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

+0

Thanks Justin, yo Ур решение по-прежнему наиболее определенно полезно - рад, что вы оставили его. Еще раз спасибо! – BigBug

Смежные вопросы