Asma Good
Asma Good

Reputation: 421

erasing parts of the loaded image by mouse

I have loaded an image in my panel.I want to erase the parts of that image by using the mouse(dragging on the panel).Here is my code to load my image:

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

How can I do it? Thanks in advance. Updated: sorry not to say earlier,I have set another image(image2) as background of the panel and I want it to be seen after erasing myImage(image loaded with the code above).

Upvotes: 2

Views: 2157

Answers (3)

LarsTech
LarsTech

Reputation: 81645

A TextureBrush on a pen can be used for erasing.

Working example (image1 and image2 are the same size images):

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

Upvotes: 0

Renatas M.
Renatas M.

Reputation: 11820

Here I created simple example. Of course it can be done better, but I just wondering how to do it... so sharing my results.

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

...and lets test

enter image description here

Ha! scared that I deleted his eye :)

Upvotes: 1

Fio
Fio

Reputation: 79

Hi I'm going to assume that you want this feature to work like the eraser on paint.

there are 3 events you are going to need 1.mousedown - to call the first erase and open up the mousemove event method. 2.mouseup - to stop the mousemove event method 3.mousemove - just to call the erase method

Code: //part pseudo as im not in visual studio right now :(

//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?);
   }

Also it looks like you are going to have to make a graphics object for your panel :( I hope this helps because question was a bit vague.

Upvotes: 1

Related Questions