2016-08-08 4 views
0

Я закодировал это, чтобы поцарапать изображение на картинке.Scratch Image на 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)); 
    } 

Но когда я сохранил изображение с помощью этого:

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

Изображение поцарапана на PictureBox не был поцарапан.

Это поцарапан изображение на PictureBox перед сохранением: enter image description here

Но когда я сэкономил, используя выше кода, царапины пропали без вести: enter image description here

Как спасло картину вместе с царапинами ?, Большое спасибо.

+0

Маленькая нитпик. В вашем заявлении switch ('Path.GetExtension (sfd.FileName) .ToUpper()') вам не нужно включать в себя строчные варианты: 'case '.gif": ', поскольку они никогда не будут удалены. – FrankerZ

+0

Нам нужно увидеть больше кода 'SaveFileDialog()'. (Как вы это называете?) – FrankerZ

+0

Я закодировал, что SaveFileDialog() в кнопке, которая сохранит изображение на картинке. –

ответ

1

Две распространенные ошибки:

  1. с помощью CreateGraphics не будет создавать настойчивые графику. Итак: Alwas нарисовать все в Paint событии PictureBox! MouseMove должен только собрать баллы в List<Point> или List<List<Point>>. Все рисунок должен происходить в Paint событием, используя его e.Graphics объект!

  2. Рисунок на поверхности только сохранялось, если вы используете DrawToBitmap, чтобы создать новое растровое изображение, которое будет сочетать в себе до три слоя: в BackgroundImage, в Image и всех стойких чертежи.

См here на примере рисунка и here для примера использования DrawToBitmap!

В качестве альтернативы этому рекомендуемому способу нанесения рисунка Image вы также можете нарисовать его непосредственно. Это то, что на самом деле делает в MouseMove, но позже вы игнорируете изображение и рисуете его ненастроенным способом.

последнее: Save процедура сохранения bmp whichyou не показали нам, поэтому мы можем только заключить, что это оригинал Image вы загрузили .. Может drawing.Save(..) бы помочь ..

Но есть очень много вопросов, с кодом, что вы действительно должны сделать полную переписывание, начиная с запутывающих имен! (Подсказка: не вызывайте объект именем другого типа, например !!!) И, очевидно, переменная типа Pen или Color также поможет избежать повторений ...

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

  • Нет связанных вопросов^_^