Domanda

Ho un PictureBox sul mio Windows Form.

I caricare un'immagine in esso e ho permesso alla Paint evento nel mio codice. Si disegna un rettangolo.

In questo modo:

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?

È stato utile?

Soluzione

Probabilmente non dovrebbe disegnare direttamente sul PictureBox.

È necessario utilizzare una bitmap, invece. Prova a mettere il bitmap nel PictureBox.Image e quindi chiamare Save ().

questo per maggiori dettagli

Altri suggerimenti

Thanks.Your rispondere a tutte aiutato. Questo ha funzionato

        private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.ImageLocation=@"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;
    }

Questa è la mia soluzione con il 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);
        }
    }

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 ti piace

Ci sono due pulsanti, uno per il disegno, uno per il risparmio, i loro eventi click sono nel seguente codice.

Le 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 (dovuto problema durante il salvataggio a quello stesso file perché è stato bloccato quota ). Inoltre, se il vostro obiettivo è quello di vedere le cose sulla superficie di tutto il controllo, probabilmente vi piacerà impostare le dimensioni in fase di inizializzazione per il formato che avete bisogno. Ho usato la dimensione del PBOX in questo esempio, ma normalmente io uso la dimensione bitmap (perché io di solito iniziano con un file di immagine reale).

(2) ho sempre avuto problemi né vedere il mio pareggi compare sul controllo o di vedere le mie modifiche salvate nel file di output (o entrambi). Nei miei precedenti tentativi avrei duplicare il pareggi sia sul controllo e sulla bitmap. Naturalmente questo non è necessario, ma la bitmap a cura ha bisogno di essere ricaricato nel control.image ... e che era 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 le modifiche)

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

È necessario dipingere a immagine di immagine, non al controllo di grafica su eventi Paint.

Modifica

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

// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top