2009-06-30 9 views
9

Ho un PictureBox sulla mia applicazione Windows Form.Come salvare un controllo picturebox come file jpeg dopo la sua modifica

Carico un'immagine e ho abilitato l'evento Paint nel mio codice. Disegna un rettangolo.

Ti piace questa:

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

E fa clic sul pulsante "Salva":

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

Ma il file salvato non contiene il rettangolo che ho disegnato.

Qualcuno ha qualche idea?

risposta

5

Probabilmente non dovrebbe disegnare direttamente sul PictureBox.

È necessario invece utilizzare una bitmap. Prova a inserire la bitmap in PictureBox.Image e quindi chiama Save().

Controllare this per maggiori dettagli

1

È necessario dipingere l'immagine dell'immagine, non il controllo grafico sull'evento 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

Hi Può chiarire/fare un esempio? – tguclu

5

Thanks.Your anwers tutti hanno contribuito. Questo ha funzionato

 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

Si usa lo schema "using (...) {...}". Ora puoi avere perdite di memoria. E se qualche risposta risolve la tua risposta, dovresti accettarla;). – TcKs

3

Ecco la mia soluzione con supporto aggiuntivo per i vari tipi di file:

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

Ecco un piccolo esempio che chiarisce alcune cose per me (ero alle prese con questo un po 'troppo).

PBOX è un PictureBox in Form1, rendono almeno 50x50

AppPath è stato derivato da System.Reflection ma utilizzare qualsiasi percorso che ti piace

Ci sono due pulsanti, uno per il disegno, uno per il salvataggio, i loro eventi click sono nel codice qui sotto.

cose che ho imparato:

(1) "pBox.Image =" non fare nulla, ma inizializzare l'immagine PBOX, esso non deve essere un nome di file come ogni esempio ho trovato usato (risparmio problema avuto a quello stesso file perché è stato condiviso bloccato). Inoltre, se il tuo obiettivo è quello di vedere le cose sull'intera superficie del controllo, probabilmente ti piacerà impostare la dimensione al momento dell'inizializzazione in base alla dimensione che ti serve. Ho usato le dimensioni del pBox in questo esempio ma normalmente uso la dimensione bitmap (perché in genere inizio con un file di immagine reale).

(2) Ho sempre avuto problemi a vedere i miei disegni apparire sul controllo o vedere le mie modifiche salvate nel file di output (o entrambi). Nei miei tentativi precedenti avrei duplicato i disegni sia sul controllo che sulla bitmap. Ovviamente non è necessario ma la bitmap modificata deve essere ricaricata nel control.image ... e QUESTO è stato il pezzo di questo puzzle che mi mancava.

(A) Creare un bitmap dal control.image e disegnare sulla bitmap

(B) Caricare la bitmap nel control.Image (in modo da poter vedere i cambiamenti provocati dal sorteggio)

(C) Salvare il control.Image

(2-opzione) Si dispone di un bitmap globale (o passato) (probabilmente da un file vero e proprio)

(a) Disegnare sulla bitmap

(B) Caricare la bitmap nel control.Image (in modo da poter vedere i cambiamenti)

(C) Salvare il 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"); 
    } 
Problemi correlati