用鼠标擦除加载图像的部分

时间:2011-12-13 10:32:32

标签: c# winforms

我在面板中加载了一个图像。我想用鼠标擦除图像的各个部分(在面板上拖动)。这是加载图像的代码:

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

我该怎么办? 提前致谢。 更新: 抱歉不说早些时候,我已经设置了另一个图像(image2)作为面板的背景,我希望在擦除myImage(加载上面代码的图像)后看到它。

3 个答案:

答案 0 :(得分:1)

您好我会假设您希望此功能像油漆上的橡皮擦一样工作。

您将需要3个活动    1.mousedown - 调用第一个擦除并打开mousemove事件方法。    2.mouseup - 停止mousemove事件方法    3.mousemove - 只是调用擦除方法

代码://部分伪现在我不在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?);
   }

此外,您似乎必须为您的面板制作图形对象:( 我希望这有帮助,因为问题有点模糊。

答案 1 :(得分:1)

这里我创建了一个简单的例子。当然它可以做得更好,但我只是想知道如何做...所以分享我的结果。

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

哈!害怕我删掉了他的眼睛:)。

答案 2 :(得分:0)

笔上的TextureBrush可用于擦除。

工作示例(image1和image2是相同大小的图像):

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