2017-07-08 1 views
1

Dans les formulaires Windows et Visual Studio Windows, j'ai chargé une image dans une zone d'image (pictureBox2), puis l'ai recadrée et affichée dans une autre zone d'image (pictureBox3).Comment enregistrer des graphiques créés sur un PictureBox?

Maintenant, je veux enregistrer ce qui est à l'intérieur de PictureBox3 en tant que fichier image.

Comment est-ce que je peux faire ceci?

private void crop_bttn_Click(object sender, EventArgs e) 
{ 
    Image crop = GetCopyImage("grayScale.jpg"); 
    pictureBox2.Image = crop; 

    Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
            pictureBox2.Width, pictureBox2.Height); 
    Graphics g = pictureBox3.CreateGraphics(); 

    g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
       pictureBox3.Width, pictureBox3.Height), rectCropArea, GraphicsUnit.Pixel); 
    sourceBitmap.Dispose(); 
} 
+0

Avez-vous essayé: https://msdn.microsoft.com/en-us/library/ system.drawing.bitmap.save (v = vs.110) .aspx? – Stefan

+0

_'Graphics g = pictureBox3.CreateGraphics(); '_ Les objets créés avec cet objet Graphics (invalide) ne peuvent pas être sauvegardés. Changez votre code pour dessiner seulement dans Paint même en utilisant l'objet e.Graphics t !!! - Ou (ici probablement mieux) dessiner dans un bitmap. Le premier peut être enregistré avec pbox.DrawToBitMap, puis (pour les deux) bitmap.Save. Pour ce dernier, utilisez un 'Graphics g = Graphics.FromImage (bmp)' – TaW

+0

@TaW - Je n'ai pas tout à fait ce que vous avez dit.Pouvez-vous s'il vous plaît expliquer un peu ou me montrer le code. Je veux vraiment résoudre ce problème, mon projet entier est bloqué ici. –

Répondre

1

Jamais utilisez control.CreateGraphics! Soit attirer dans un Bitmap bmp en utilisant un Graphics g = Graphics.FromImage(bmp)ou en cas Paint d'un contrôle, en utilisant le paramètre e.Graphics ..

Voici un code de culture qui puise dans une nouvelle Bitmap et qui fait usage de vos commandes, etc. mais change quelques choses:

  • il utilise un objet Graphics qui est créé à partir d'une nouvelle Bitmap
  • il fait usage de clauses using pour vous assurer qu'il Wo pas de fuite
  • Il prend la taille de la pictureBox3.ClientSize de sorte qu'il ne comprend pas les frontières ..

private void crop_bttn_Click(object sender, EventArgs e) 
{ 
    Image crop = GetCopyImage("grayScale.jpg"); 
    pictureBox2.Image = crop; 
    Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
            pictureBox3.ClientSize.Height); 
    using (Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
       pictureBox2.ClientSize.Width, pictureBox2.ClientSize.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(targetBitmap)) 
     { 
      g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
         pictureBox3.ClientSize.Width, pictureBox3.ClientSize.Height), 
         rectCropArea, GraphicsUnit.Pixel); 
     } 
    } 
    if (pictureBox3.Image != null) pictureBox3.Image.Dispose(); 
    pictureBox3.Image = targetBitmap; 
    targetBitmap.Save(somename, someFormat); 
} 

L'alternative serait de ..:

  • déplacer tout votre code à l'événement Paint
  • remplacer le Graphics g = pictureBox3.CreateGraphics(); être Graphics g = e.Graphics;
  • insérer ces deux lignes à l'événement click:

Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
           pictureBox3.ClientSize.Height); 
pictureBox3.DrawToBitmap(targetBitmap, pictureBox3.ClientRectangle); 
+0

Merci beaucoup. J'ai suivi la 1ère méthode et cela a résolu mon problème. –

1

La méthode PictureBox.CreateGraphics() ne doit pas être utilisé sauf si vous savez ce que vous faites, car il peut causer des problèmes pas si évidents. Par exemple, dans votre scénario, l'image dans pictureBox3 disparaîtra lorsque vous réduisez ou redimensionnez la fenêtre.

Une meilleure façon est de tirer un bitmap, que vous pouvez également enregistrer:

var croppedImage = new Bitmap(pictureBox3.Width, pictureBox3.Height); 
var g = Graphics.FromImage(croppedImage); 
g.DrawImage(crop, new Point(0, 0), rectCropArea, GraphicsUnit.Pixel); 
g.Dispose(); 
//Now you can save the bitmap 
croppedImage.Save(...); 
pictureBox3.Image = croppedImage; 

BTW, s'il vous plaît utiliser les noms de variables plus raisonnables, en particulier pour pictureBox1..3.