Wie eine picturebox Kontrolle als JPEG-Datei zu speichern, nachdem es bearbeitet hat

StackOverflow https://stackoverflow.com/questions/1063505

  •  21-08-2019
  •  | 
  •  

Frage

Ich habe ein PictureBox auf meinem Windows-Forms-Anwendung.

Ich lade Sie ein Bild drin und ich habe die Paint Ereignis in meinem Code aktiviert. Es zeichnet ein Rechteck.

Wie folgt aus:

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

Und ich klicken Sie auf die Schaltfläche "Speichern":

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

Aber die gespeicherte Datei enthält nie das Rechteck, das ich gezogen hat.

Hat jemand eine Idee?

War es hilfreich?

Lösung

Sie sollten wahrscheinlich nicht direkt auf der PictureBox ziehen.

Sie müssen stattdessen eine Bitmap verwenden. Versuchen Sie setzen die Bitmap in der PictureBox.Image und rufen Sie dann Save ().

Überprüfen Sie diese weitere Details

Andere Tipps

Thanks.Your alle geholfen beantworten. Das funktionierte

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

Hier ist meine Lösung mit zusätzlicher Unterstützung für verschiedene Dateitypen:

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

Hier ist ein kleines Beispiel, dass ein paar Dinge für mich geklärt (ich war mit diesem ein wenig zu kämpfen).

PBOX ist ein PictureBox auf Form1, machen es mindestens 50x50

appPath wurde von System.Reflection abgeleitet, sondern verwenden einen beliebigen Pfad Sie wie

Es gibt zwei Tasten, eine zum Zeichnen, eine zum Speichern, deren Click-Ereignisse in der unten stehenden Code sind.

Dinge, die ich gelernt habe:

(1) „pBox.Image =“ nichts tun, aber das PBOX Bild initialisieren, es muss nicht ein Dateiname wie jedes Beispiel sein habe ich gefunden (hatte Problem zu derselben Datei zu speichern, weil sie Aktien gesperrt wurden ). Auch wenn es Ihr Ziel ist, die Dinge auf der gesamten Steuerung der Oberfläche zu sehen, werden Sie wahrscheinlich die Größe bei Initialisierungsdauer der Größe wie Einstellung, die Sie benötigen. Früher habe ich die Größe des PBOX in diesem Beispiel aber normalerweise verwende ich die Bitmap-Größe (weil ich in der Regel mit einer realen Bilddatei beginnen).

(2) Ich hatte immer Probleme entweder zu sehen, meine zieht zeigen, bis auf der Steuerung oder sieht meine Änderungen in der Ausgabedatei gespeichert (oder beides). In meinem früheren Versuchen würde ich duplizieren die zieht sowohl an der Steuerung und auf dem Bitmap. Natürlich ist das nicht nötig, aber die bearbeitete Bitmap in die control.image neu geladen werden muss ... und das war das Stück dieses Puzzle ich fehlte.

Erstellen

(A) eine Bitmap aus der control.image und zeichnet auf dem Bitmap

(B) Legen Sie das Bitmap in die control.Image (so dass Sie die Änderungen durch das Ziehen verursacht sehen kann)

(C) Speichern Sie die control.Image

(2-Option) Sie haben einen globalen (oder übergab) Bitmap (wahrscheinlich von einer realen Datei)

(A) Zeichnen auf dem Bitmap

(B) Legen Sie das Bitmap in die control.Image (so können Sie die Änderungen sehen)

(C) Speichern Sie die 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");
    }

Sie malen müssen von Bild zu Bild, nicht auf die Grafiksteuerung auf Paint-Ereignisse.

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_ );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top