2016-08-08 32 views
0

Ich habe dies zu Bild auf Bildbox scratchen.Scratch Bild auf PictureBox C#

bool draw = false; 

int pX = -1; 
int pY = -1; 

Bitmap drawing; 

public Form1() 
{ 
    drawing = new Bitmap(transformedImage.Width, transformedImage.Height, transformedImage.CreateGraphics()); 
    Graphics.FromImage(drawing).Clear(Color.Transparent); 
} 

private void transformedImage_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (draw) 
     { 
      int penWidth = Convert.ToInt32(penWidthValue.Value); 
      if(blackCheck.Checked == true) ///black pen 
      { 
       Graphics panel = Graphics.FromImage(drawing); 

       Pen pen = new Pen(Color.Black, penWidth); 

       pen.EndCap = LineCap.Round; 
       pen.StartCap = LineCap.Round; 

       panel.DrawLine(pen, pX, pY, e.X, e.Y); 

       transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));      
      } 
      else if(redCheck.Checked == true) /// red pen 
      { 
       Graphics panel = Graphics.FromImage(drawing); 

       Pen pen = new Pen(Color.Red, penWidth); 

       pen.EndCap = LineCap.Round; 
       pen.StartCap = LineCap.Round; 

       panel.DrawLine(pen, pX, pY, e.X, e.Y); 

       transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0)); 
      } 
      else if(yellowCheck.Checked == true) /// yellow 
      { 
       Graphics panel = Graphics.FromImage(drawing); 

       Pen pen = new Pen(Color.Yellow, penWidth); 

       pen.EndCap = LineCap.Round; 
       pen.StartCap = LineCap.Round; 

       panel.DrawLine(pen, pX, pY, e.X, e.Y); 

       transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0)); 
      } 
      else /// green 
      { 
       Graphics panel = Graphics.FromImage(drawing); 

       Pen pen = new Pen(Color.Green, penWidth); 

       pen.EndCap = LineCap.Round; 
       pen.StartCap = LineCap.Round; 

       panel.DrawLine(pen, pX, pY, e.X, e.Y); 

       transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0)); 
      } 

     } 

     pX = e.X; 
     pY = e.Y; 
    } 

    private void transformedImage_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (scratchCheck.Checked == true) 
     { 
      draw = true; 
      pX = e.X; 
      pY = e.Y; 
     } 
    } 

    private void transformedImage_MouseUp(object sender, MouseEventArgs e) 
    { 
     draw = false; 
    } 

    private void transformedImage_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawImageUnscaled(drawing, new Point(0, 0)); 
    } 

Aber wenn ich Bild dieses mit gespeichert:

SaveFileDialog sfd = new SaveFileDialog(); 
       sfd.Title = "Select Save Location"; 
       sfd.InitialDirectory = @"Save_Path"; 
       sfd.AddExtension = true; 
       if (sfd.ShowDialog() == DialogResult.OK) 
       { 
        switch (Path.GetExtension(sfd.FileName).ToUpper()) 
        { 
         case ".BMP": 
          bmp.Save(sfd.FileName, ImageFormat.Bmp); 
          break; 
         case ".gif": 
          bmp.Save(sfd.FileName, ImageFormat.Gif); 
          break; 
         case ".JPG": 
          bmp.Save(sfd.FileName, ImageFormat.Jpeg); 
          break; 
         case ".JPEG": 
          bmp.Save(sfd.FileName,ImageFormat.Jpeg); 
          break; 
         case ".PNG": 
          bmp.Save(sfd.FileName, ImageFormat.Png); 
          break; 
         case ".png": 
          bmp.Save(sfd.FileName, ImageFormat.Png); 
          break; 
         default: 
          break; 
        } 
       } 

Das Bild auf picturebox zerkratzt wurde nicht zerkratzt.

Dies wird Bild auf picturebox zerkratzt vor dem Speichern: enter image description here

Aber wenn ich über Code gespeichert verwenden, wurden die Kratzer verschwunden: enter image description here

Wie gespeichert zusammen mit den Kratzern das Bild ?, Vielen Dank.

+0

Kleinen nitpick zu vermeiden. In Ihrer switch-Anweisung ('Path.GetExtension (sfd.FileName) .ToUpper()') müssen Sie die Kleinbuchstaben-Varianten nicht einschließen: 'case" .gif ":' da sie niemals getroffen werden. – FrankerZ

+0

Wir müssen mehr vom 'SaveFileDialog()' Code sehen. (Wie nennst du es?) – FrankerZ

+0

Ich habe das SaveFileDialog() in der Schaltfläche, die das Bild in der Bildbox speichern wird, codiert. –

Antwort

1

Zwei häufige Fehler:

  1. mit CreateGraphics nicht persistent Grafiken erstellen. Also: Alwas zeichne alles im Paint Event der PictureBox! Die MouseMove sollte nur sammeln die Punkte in einer List<Point> oder List<List<Point>>. Alle Zeichnung müssen passieren im Paint Ereignis mit seinem e.Graphics Objekt!

  2. Die Zeichnung auf der Oberfläche nur dann gespeichert wird, wenn Sie DrawToBitmap verwenden, um eine neue Bitmap zu erstellen, die zu drei Schichten kombinieren up wird: die BackgroundImage, die Image und alle persistent Zeichnungen.

Siehe here für ein Beispiel des Zeichnens und here ein Beispiel für DrawToBitmap mit!

Als Alternative zu dieser empfohlenen Art des Zeichnens über eine Image können Sie auch direkt hinein zeichnen. Dies geschieht tatsächlich in der MouseMove, aber später ignorierst du das Bild und zeichnest es in einer nicht beständigen Art und Weise.

endlich soweit: Die Save Routine wird ein bmp Speichern whichyou nicht uns gezeigt haben, so können wir nur feststellen, dass es die ursprüngliche Image ist geladen Sie .. Vielleicht drawing.Save(..) helfen würde ..

Aber es gibt so viele Fragen mit dem Code, den du wirklich komplett neu schreiben solltest, beginnend mit den verwirrenden Namen! (Hinweis: rufen Sie nicht ein Objekt den Namen eines anderen Typs, wie Graphics panel !!!) Und natürlich eine Variable vom Typ Pen oder Color würde auch helfen, diese Wiederholungen ...