стирание частей загруженного изображения мышью - PullRequest
2 голосов
/ 13 декабря 2011

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

 private void drawP_Paint(object sender, PaintEventArgs e)
    {
            e.Graphics.DrawImage(myImage, new Point(0, 0));
    }

Как я могу это сделать? Заранее спасибо. Обновлено: извините, чтобы не сказать ранее, я установил другое изображение (image2) в качестве фона панели, и я хочу, чтобы оно было видно после стирания myImage (изображение загружено с кодом выше).

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Здесь я создал простой пример. Конечно, это можно сделать лучше, но мне просто интересно, как это сделать ... так что делюсь своими результатами.

public partial class mainForm : Form
{
    private Bitmap image;
    private Rectangle imgRect;

    public mainForm()
    {
        InitializeComponent();
        BackColor = Color.Chartreuse;
        image = new Bitmap(@"C:\image.jpg");
        imgRect = new Rectangle(0,0,image.Width, image.Height);
    }

    private void main_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawImage(image, 0, 0);
    }

    private void main_MouseMove(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left && e.X < image.Width && e.Y < image.Height)
        {
           image.SetPixel(e.X, e.Y, Color.Magenta);//change pixel color;
           image.MakeTransparent(Color.Magenta);//Make image transparent
           Invalidate(imgRect);
        }
    }
}

... и давайте проверим

enter image description here

Ха! страшно, что я удалил глаз :))

1 голос
/ 13 декабря 2011

Привет, я собираюсь предположить, что вы хотите, чтобы эта функция работала как ластик на краске.

есть 3 события, которые вам понадобятся 1.mousedown - чтобы вызвать первое стирание и открытьметод события mousemove.2.mouseup - остановить метод события mousemove. 3.mousemove - просто вызвать метод erase.

Code: // псевдо часть, так как я сейчас не в Visual Studio: (

//global vars 
   bool enable = false;

   void erase(Point mousepoint)
   {
      Point f = (mousepoint.X - yourpanel.left?, mousepoint.Y - yourpanel.top?); 
      //gets mouse position on accual picture;

      yourImageGraphics.fillreactangle( f.X - 10, f.Y+10, 20,20 ,Color.White)
      //                                 int X  ,  int Y, width , height, color
   }

   void mousedown(?)
   {
        enable=true;
        erase(Cursor.Position //but you get this from e?);
   }

   void mouseup(?);
   {
        enable=false;
   }

   void mousemove(?)
   {
       if (enable) 
          erase(e.Position?);
   }
* 1007.* Также похоже, что вам нужно будет сделать графический объект для вашей панели :( Надеюсь, это поможет, потому что вопрос был немного расплывчатым.
0 голосов
/ 13 декабря 2011

A TextureBrush на ручке можно использовать для стирания.

Рабочий пример (изображения 1 и 2 изображения одинакового размера):

Bitmap bmp1;
TextureBrush tb;
Point _LastPoint;

public Form1()
{
  InitializeComponent();
  this.DoubleBuffered = true;

  bmp1 = new Bitmap(@"c:\image1.png");
  tb = new TextureBrush(new Bitmap(@"c:\image2.png"));
}

private void Form1_MouseMove(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Left) {
    if (!_LastPoint.IsEmpty) {
      using (Graphics g = Graphics.FromImage(bmp1))
      using (Pen p = new Pen(tb, 15)) {
        p.StartCap = LineCap.Round;
        p.EndCap = LineCap.Round;
        g.DrawLine(p, _LastPoint, e.Location);
      }
    }
    _LastPoint = e.Location;
    this.Invalidate();
  }
}

private void Form1_MouseUp(object sender, MouseEventArgs e) {
  _LastPoint = Point.Empty;
}

private void Form1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.DrawImage(bmp1, new Point(0, 0));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...