2016-04-20 6 views
1

Zuerst bin ich auf der PictureBox1 mit der MausWie kann ich das Bild in PictureBox1 durch ein Bild von einem auf der PictureBox1 Rechteck gezeichneten Bereich ersetzen?

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     rect = new Rectangle(e.X, e.Y, 0, 0); 
     painting = true; 
    } 
} 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     rect = new Rectangle(
      rect.Left, 
      rect.Top, 
      Math.Min(e.X - rect.Left, pictureBox1.ClientRectangle.Width - rect.Left), 
      Math.Min(e.Y - rect.Top, pictureBox1.ClientRectangle.Height - rect.Top)); 
    } 
    this.pictureBox1.Invalidate(); 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (painting == true) 
    { 
     using (Pen pen = new Pen(Color.Red, 2)) 
     { 
      e.Graphics.DrawRectangle(pen, rect); 
     } 
    } 
} 

Die Variable rect ist global Rechteck und Malerei ist global Bool ein Rechteck zeichnen.

Dann habe ich in der PictureBox1 mouseup Ereignis

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    pictureBox1.Image = SaveRectanglePart(pictureBox1.Image, rect); 
} 

Und die Methode SaveRectanglePart

Bitmap bmptoreturn; 
public Bitmap SaveRectanglePart(Image image, RectangleF sourceRect) 
{ 
    using (var bmp = new Bitmap((int)sourceRect.Width, (int)sourceRect.Height)) 
    { 
     using (var graphics = Graphics.FromImage(bmp)) 
     { 
      graphics.DrawImage(image, 0.0f, 0.0f, sourceRect, GraphicsUnit.Pixel); 
     } 
     bmptoreturn = bmp; 
    } 

    return bmptoreturn; 
} 

Was ich will ist tun, wenn ich das Rechteck in der mouseup Ereignis fertig Ziehen des PictureBox1 löschen und ersetzen Sie das Bild dort nur durch das Rechteckbild.

Aber ich bin immer Ausnahme Parameter nicht gültig in der mouseup Ereignis

pictureBox1.Image = SaveBitmapPart(pictureBox1.Image, rect); 

Und sollte ich irgendwo die Variable bmptoreturn entsorgen?

Antwort

0

In der Funktion SaveRectanglePart die Variable bmp ist Dispose der vor der Funktion gibt als Ergebnis der using Aussage. Sie müssen die using-Anweisung entfernen und der Code sollte funktionieren.

Bitmap bmptoreturn; 
public Bitmap SaveRectanglePart(Image image, RectangleF sourceRect) 
{ 
    var bmp = new Bitmap((int)sourceRect.Width, (int)sourceRect.Height) 
    using (var graphics = Graphics.FromImage(bmp)) 
    { 
     graphics.DrawImage(image, 0.0f, 0.0f, sourceRect, GraphicsUnit.Pixel); 
    } 
    bmptoreturn = bmp; 

    return bmptoreturn; 
} 

Aber wir haben die Frage, was bmptoreturn und pictureBox1.Image Referenzierung wurden, bevor sie eingestellt wurden. Die alte Image/Bitmap Referenz wird im Speicher verloren gehen, bis Garbage Collection kommt, um ihren Speicher freizugeben. Um ein guter Programmierer zu sein, müssen wir Dispose dieser Image/Bitmap, wenn wir damit fertig sind.

Image tmp = bmptoreturn; 
bmptoreturn = bmp; 
if(tmp != null) 
    tmp.Dispose(); 
... 
Image tmp = pictureBox1.Image; 
pictureBox1.Image = SaveBitmapPart(pictureBox1.Image, rect); 
if(tmp != null) 
    tmp.Dispose(); 

Auch bin ich nicht sicher, warum Sie bmptoreturn verwenden, aber es ist nicht im Code benötigt, von dem, was ich sagen kann. Sie können einfach bmp zurückgeben, wenn bmptoreturn nicht an anderer Stelle verwendet wird.

+0

KDecker Ich habe den Code ausprobiert jetzt habe ich die Methode SaveRectanglePart entsprechend Ihrer Lösung geändert und verwende jetzt nur noch bmp. Und in dem MouseUp-Ereignis habe ich den Code mit dem Bild tmp = pictureBox1.Image; .... und dem ret hinzugefügt, aber was es tut, ist wie das Bild zu zoomen, das Rechteck. Es ersetzt nicht das Rechteckteil, aber macht Zoom herein. –

+0

@DanielVoit Von was ich von der Frage "sagen kann, um die pictureBox1 zu löschen und das Bild dort nur durch das Rechteckbild zu ersetzen." Genau das wollen Sie tun. – KDecker

Verwandte Themen