2009-06-30 9 views
9

J'ai un PictureBox sur mon application Windows Forms.Comment enregistrer un contrôle PictureBox en tant que fichier jpeg après son édition

Je charge une image dedans et j'ai activé l'événement Paint dans mon code. Il dessine un rectangle.

Comme ceci:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics gr = e.Graphics; 
    Pen p = new Pen(Color.Red); 
    p.Width = 5.0f; 
    gr.DrawRectangle(p, 1, 2, 30, 40); 
} 

Et je clique sur le bouton "Enregistrer":

private void button2_Click(object sender, EventArgs e) 
{ 
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
} 

Mais le fichier enregistré contient jamais le rectangle que j'ai dessiné.

Quelqu'un a-t-il une idée?

Répondre

5

Vous ne devriez probablement pas tirer directement sur le PictureBox.

Vous devez utiliser un bitmap à la place. Essayez de placer le bitmap dans PictureBox.Image, puis appelez Save().

Vérifiez this pour plus de détails

1

Vous devez peindre l'image de l'image, pas l'événement Contrôle graphique sur Paint.

EDIT:

using(Graphics g = Graphics.FromImage(pictureBox1.Image)) { 
    // there you will be do, what you do in Paint event 
} 

// ... somewhere else ... 
pictureBox1.Save(_required_parameters_); 
+2

Salut Pouvez-vous clarifier/donner un exemple? – tguclu

5

Thanks.Your Anwers tous aidé. Cela a fonctionné

 private void button1_Click(object sender, EventArgs e) 
    { 
     [email protected]"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg); 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pictureBox1.Image); 
     Graphics gr = Graphics.FromImage(bmp); 
     Pen p = new Pen(Color.Red); 
     p.Width = 5.0f; 
     gr.DrawRectangle(p, 1, 2, 30, 40); 
     pictureBox1.Image = bmp; 
    } 
+2

Vous pouvez utiliser le modèle "using (...) {...}". Maintenant, vous pouvez avoir des fuites de mémoire. Et si certaines réponses résolvent votre réponse, vous devriez l'accepter;). – TcKs

3

Voici ma solution avec un soutien supplémentaire aux différents types de fichiers:

public void ExportToBmp(string path) 
    { 
     using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) 
     { 
     pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle); 
     ImageFormat imageFormat = null; 

     var extension = Path.GetExtension(path); 
     switch (extension) 
     { 
      case ".bmp": 
       imageFormat = ImageFormat.Bmp; 
       break; 
      case ".png": 
       imageFormat = ImageFormat.Png; 
       break; 
      case ".jpeg": 
      case ".jpg": 
       imageFormat = ImageFormat.Jpeg; 
       break; 
      case ".gif": 
       imageFormat = ImageFormat.Gif; 
       break; 
      default: 
       throw new NotSupportedException("File extension is not supported"); 
     } 

     bitmap.Save(path, imageFormat); 
     } 
    } 
3

Voici un petit exemple qui a clarifié quelques choses pour moi (je luttais avec cela un peu trop).

Pbox est un PictureBox sur Form1, font au moins 50x50

appPath a été dérivé de System.Reflection mais utiliser le chemin que vous aimez

Il y a deux boutons, un pour le dessin, l'un pour l'enregistrement, leurs événements de clic sont dans le code ci-dessous.

que j'ai appris:

(1) « pBox.Image = » ne fait rien, mais initialiser l'image Pbox, il ne doit pas être un nom de fichier comme chaque exemple que j'ai trouvé utilisé (problème avait sauver à ce même fichier, car il était partagé). De même, si votre objectif est de voir des choses sur la surface entière du contrôle, vous voudrez probablement définir la taille au moment de l'initialisation à la taille dont vous avez besoin. J'ai utilisé la taille de la pBox dans cet exemple mais normalement j'utilise la taille de bitmap (parce que je commence généralement avec un vrai fichier d'image). (2) J'ai toujours eu des problèmes, soit voir mes dessins apparaître sur le contrôle ou voir mes modifications enregistrées dans le fichier de sortie (ou les deux). Dans mes tentatives précédentes, je voudrais dupliquer les tirages à la fois sur le contrôle et sur l'image bitmap. Bien sûr, ce n'est pas nécessaire, mais le bitmap édité DOIT être rechargé dans control.image ... et C'EST le morceau de ce puzzle qui me manquait.

(A) Créer une image bitmap de la control.image et tirer sur le bitmap

(B) Chargez le bitmap dans le control.Image (afin que vous puissiez voir les changements causés par le tirage au sort)

(C) Enregistrez le control.Image

(2-option) Vous disposez d'un bitmap global (ou passé) (probablement à partir d'un fichier réel)

(a) Dessiner sur le bitmap

(B) Charger le bitmap dans le control.Image (vous pouvez donc voir les changements)

(C) Enregistrez le bitmap

public Form1() 
    { 
     InitializeComponent(); 
     pBox.Image = new Bitmap(pBox.Width, pBox.Height); 
    } 

    private void DrawStuff1_Click(object sender, EventArgs e) 
    { 
     Bitmap bmp = new Bitmap(pBox.Image); 
     Graphics g = Graphics.FromImage(bmp); 

     g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter 

     pBox.Image = bmp; //this makes your changes visible 
    } 

    private void Save_Click(object sender, EventArgs e) 
    { 
     pBox.Image.Save(appPath + "SavedImage.bmp"); 
    } 
Questions connexes