[C#] Problem mit speichern von Bildern



  • Moin

    Ich habe ein programm geschreiben was einen kurzen Text auf ein Bild schreibt. Jetzt kann ich das Bild auch speichern wenn ich C:\\test0.jpg in die img.Save Methode schreibe. Wenn ich jetzt ein Variable eintrage klappt es auch noch wenn der Pafd ein anderer ist als der von wo das Bild geladen wurde.

    Mein Code sieht momentan so aus:

    private void schreiben(string path, int x, int y)
            {
                //Die Variablen x und y werden neu berechnet um eine neue Position zu erstellen.
                x = x - 390;
                y = y - 75;
    
                //Die Sachen zum schreiben des Textes auf dem Bild 
                //wird Initialisiert und Deklariert.
                Image img = Image.FromFile(path);
                Graphics gbmp = Graphics.FromImage(img);
                Font style = new Font("Times", 35, FontStyle.Bold | FontStyle.Italic);
                gbmp.DrawString("tewesonline.de.ms", style, Brushes.Silver, x, y);
                gbmp.Dispose();
                img.Save(path);
            }
    

    Ich hoffe ihr konntet meine Problmstellung verstehen....

    Danke im vorraus

    tewes



  • tewes schrieb:

    Moin

    Ich habe ein programm geschreiben was einen kurzen Text auf ein Bild schreibt. Jetzt kann ich das Bild auch speichern wenn ich C:\\test0.jpg in die img.Save Methode schreibe. Wenn ich jetzt ein Variable eintrage klappt es auch noch wenn der Pafd ein anderer ist als der von wo das Bild geladen wurde.

    Mein Code sieht momentan so aus:

    private void schreiben(string path, int x, int y)
            {
                //Die Variablen x und y werden neu berechnet um eine neue Position zu erstellen.
                x = x - 390;
                y = y - 75;
                
                //Die Sachen zum schreiben des Textes auf dem Bild 
                //wird Initialisiert und Deklariert.
                Image img = Image.FromFile(path);
                Graphics gbmp = Graphics.FromImage(img);
                Font style = new Font("Times", 35, FontStyle.Bold | FontStyle.Italic);
                gbmp.DrawString("tewesonline.de.ms", style, Brushes.Silver, x, y);
                gbmp.Dispose();
                img.Save(path);
            }
    

    Ich hoffe ihr konntet meine Problmstellung verstehen....

    Danke im v******

    tewes

    Was glaubst Du warum man bei der Save-Methode einen [auch anderen] Pfad angeben kann!?!

    Man kann das Originalbild ändern.
    Man lässt das Originalbild so und speichert die Änderung woanders.

    Wenn Dir was unklar ist probier dochmal mit dem Cod zu experimentieren
    das schafft Erkenntnissgewinne.
    🙂



  • private void schreiben(string Quellpfad, string Zielpfad, int x, int y) 
            { 
                //Die Variablen x und y werden neu berechnet um eine neue Position zu erstellen. 
                x = x - 390; 
                y = y - 75; 
    
                //Die Sachen zum schreiben des Textes auf dem Bild 
                //wird Initialisiert und Deklariert. 
                Image img = Image.FromFile(path); 
                Graphics gbmp = Graphics.FromImage(img); 
                Font style = new Font("Times", 35, FontStyle.Bold | FontStyle.Italic); 
                gbmp.DrawString("tewesonline.de.ms", style, Brushes.Silver, x, y); 
                gbmp.Dispose(); 
                img.Save(Zielpfad); 
            }
    

    würde mal sagen so, willst Du Quelle überschreiben dann:
    Quellpfad == Zielpfad

    willst Du die Änderung xtra haben:

    Quellpfad != Zielpfad

    im Aufruf Deiner schreiben-Meethode 👍



  • Ich will das die Quellpfad == Zeilpfad ist.
    Hab schon rausgefunden das es daran liegt das noch irgendein Teil meines Programms noch auf das Bild zurückgreift. Weiss aber noch nich welcher Teil und wie ich das dann beheben soll.

    MFG

    tewes



  • hier habs so umgeändert das ein Multizugriff auf die Datei möglich ist!

    private void schreiben(string Quellpfad, string Zielpfad, string msg, int x, int y) 
    		{ 
    			//Die Variablen x und y werden neu berechnet um eine neue Position zu erstellen. 
    			try
    			{
    
    				//Die Sachen zum schreiben des Textes auf dem Bild 
    				//wird Initialisiert und Deklariert.
    				if(Quellpfad == Zielpfad)
    				{
    					System.IO.FileStream fstr = new System.IO.FileStream(Quellpfad,
    						System.IO.FileMode.OpenOrCreate,
    						System.IO.FileAccess.ReadWrite);
    
    					Image img = Image.FromStream(fstr,true);
    
    					Graphics gbmp = Graphics.FromImage(img);
    
    					gbmp.DrawString(msg,this.Font, Brushes.Salmon, x, y);
    
    					gbmp.Dispose();
    					fstr.Seek(0,System.IO.SeekOrigin.Begin);
    					img.Save(fstr,System.Drawing.Imaging.ImageFormat.Jpeg);
    					fstr.Close();
    				}
    				else
    				{
    					Image img = Image.FromFile(Quellpfad); 
    					Graphics gbmp = Graphics.FromImage(img); 
    					gbmp.DrawString(msg,this.Font, Brushes.Salmon, x, y);
    					gbmp.Dispose(); 
    					img.Save(Zielpfad); 
    				}
    
    			}
    			catch(System.Exception ex)
    			{
    				MessageBox.Show(ex.Message);
    			}
    		}
    

    Müsstest nur noch folgendes machen (dazu habe ich jetzt nicht weiter die Zeit)
    an der Stelle

    img.Save(fstr,System.Drawing.Imaging.ImageFormat.Jpeg);
    

    müsstest Du die sache so flexibilisieren das zur Datei auch immer das richtig Bildformat ausgewählt wird (ich habs auf JPG festgellegt), also System.Drawing.Imaging.ImageFormat.Jpeg-Parameter variabel machen.

    Unter Windooz einfach Weg etwa so:
    Quellpfad-Parameter oder Zielpfad-Parameter
    nehmen auf .bmp -----> .gif -----> .png -----> etc.
    untersuchen nen switch(Endung)( einbauen und je nach Fall

    img.Save(fstr,System.Drawing.Imaging.ImageFormat. ...);
    

    machen. Das ist ein System.Drawing.Imaging.ImageFormat-Enumerationstyp der für alle gängigen Bildformate was parat hat.

    Kopier Dir obige geänderte Funktion erstmal rein experimentiere damit, bei mir funzt das Ding, damit Du verstehst wie das teil läuft 👍 !

    mfg sclearscreen 🙂


Anmelden zum Antworten