2009-06-30 6 views
9

Mam PictureBox w mojej aplikacji Windows Forms.Jak zapisać formant obrazu graficznego jako plik jpeg po jego edycji

Załadowałem do niego zdjęcie i włączyłem zdarzenie w moim kodzie. Rysuje prostokąt.

Jak to:

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

I kliknij przycisk "zapisz":

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

ale zapisany plik nigdy nie zawiera prostokąt, który narysowałem.

Czy ktoś ma jakiś pomysł?

Odpowiedz

5

Prawdopodobnie nie powinien zwrócić się bezpośrednio na PictureBox.

Zamiast tego należy użyć mapy bitowej. Spróbuj umieścić mapę bitową w PictureBox.Image, a następnie wywołaj Save().

Sprawdź this więcej szczegółów

1

Do malowania obrazu potrzebna jest farba, a nie element sterujący Grafika w programie 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 można wyjaśnić/podać przykład? – tguclu

5

Thanks.Your anwers wszystko pomogło. To działało

 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

Udostępniasz wzór "using (...) {...}". Teraz możesz mieć pewne wycieki pamięci. A jeśli jakaś odpowiedź rozwiąże twoją odpowiedź, powinieneś ją zaakceptować;). – TcKs

3

Oto moje rozwiązanie z dodatkowym wsparciem dla różnych typów plików:

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

Oto mały przykład, który wyjaśnić kilka rzeczy dla mnie (miałem problemy z tym nieco zbyt).

pBox jest PictureBox na Form1, sprawiają, że co najmniej 50x50

AppPath pochodzi od System.Reflection jednak użyć dowolnego ścieżkę chcesz

Istnieją dwa przyciski, jeden do rysowania, jeden do zapisywania, ich kliknięcia znajdują się w kodzie poniżej.

Czego nauczyłem:

(1) „pBox.Image =” nic nie robi, ale zainicjować obraz pBox, to nie musi być nazwa pliku jak każdy przykład znalazłem używany (oszczędność miał problemu do tego samego pliku, ponieważ był zablokowany udział). Ponadto, jeśli Twoim celem jest widzieć rzeczy na całej powierzchni kontrolnej, prawdopodobnie będziesz chciał ustawić rozmiar w czasie inicjalizacji do potrzebnego rozmiaru. Użyłem rozmiaru pBox w tym przykładzie, ale zwykle używam rozmiaru bitmapy (ponieważ zwykle zaczynam od prawdziwego pliku obrazu).

(2) Zawsze miałem problemy, albo widząc, że moje losowania pojawiły się na kontrolce, albo widząc moje zmiany zapisane w pliku wyjściowym (lub obu). W moich wcześniejszych próbach duplikowałem remisy zarówno na kontrolce, jak i na bitmapie. Oczywiście nie jest to konieczne, ale edytowana bitmapa DOES musi zostać ponownie wczytana do pliku control.image ... i KTÓRA była kawałkiem tej układanki, której mi brakowało.

(A) Tworzenie bitmapy z control.image i narysować na bitmapę

(B) Załaduj bitmapę do control.Image (dzięki czemu można zobaczyć zmiany powodowane przez losowanie)

(C) Zapisz control.Image

(2 opcja) masz globalną (lub przekazany) bitmapy (prawdopodobnie z prawdziwego pliku)

(a) Narysuj na bitmapę

(B) Załaduj bitmapę do control.Image (dzięki czemu można zobaczyć zmiany)

(C) Zapisz 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"); 
    } 
Powiązane problemy