none
Property Image Name und Pfad Speichren RRS feed

  • Frage

  • Hallo zusammen,

    ich schreibe mir eine kleine routine mit der ich einstellungen meines Programms in eine TextDatei speichern kann.
    Das geht eigentlich ganz gut. Aber bei Image komme ich nicht klar.
    Wie kann ich den das dort eingebettete Image abfragen und speichern ?

    Mit String, Boolean usw.. geht das sehr schön. Bei Property BackGroundImage ist kein DateiName oder Pfad angegeben.

    vielen dank

    bernd

    Donnerstag, 6. Mai 2010 06:53

Antworten

  • Die Daten werden als XML Datei (.config) gespeichert, Applikationsbezogene in der DeineAppliaktion.config im Verzeichnis der App, User bezogene im Profil unter C:\Dokumente und Einstellungen\<UserName>\Anwendungsdaten\<Applikationsname>\

    Das sind wie gesagt einfache XML Dateien und die kannst Du auch einfach auf andere Rechner kopieren. Und das sind die My.Settings.


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 6. Mai 2010 07:43
  • Hallo Bernd,

    ergänzend zu Olafs Antwort:
    Ein Image ist zur Laufzeit im Kern ein Byte-Array,
    was sich aber nicht besonders gut in einer Textdatei macht.

    Um das Byte-Array in eine Text-kompatibles Format umzuwandeln
    verwende Convert.ToBase64String und für den umgekehrten Weg
    Convert.FromBase64String. Zusammengefaßt wäre das etwas wie:

      Public Shared Function ImageToBase64String(ByVal image As Image) As String
        Using imageStream As New MemoryStream
          image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Bmp)
          Return Convert.ToBase64String(imageStream.ToArray())
        End Using
      End Function
    
      Public Shared Function ImageFromBase64String(ByVal imageAsBase64 As String) As Image
        Dim imageBytes As Byte() = Convert.FromBase64String(imageAsBase64)
        Using imageStream As New MemoryStream(imageBytes)
          Return Image.FromStream(imageStream)
        End Using
      End Function
    

    Wobei Du bei großen Bildern aufpassen mußt, da dabei einige Bytes durch den Speicher geschaufelt werden.
    Verwenden kannst Du das z. B. als:

      Const ImageFileName As String = "C:\TEMP\Image.txt"
    
      ' Speichern einer PictureBox
      Me.PictureBox1.Image = ImageFromBase64String(File.ReadAllText(ImageFileName))
      ' und später laden
      Me.PictureBox1.Image = ImageFromBase64String(File.ReadAllText(ImageFileName))

    Oder auch über einen Stream in weitere Daten einbetten.
    Wobei sich zur Strukturierung am besten Xml eignet.

    Wo möglich solltest Du aber den Weg bevorzugen, den Olaf beschrieben hat.

    Gruß Elmar

    Donnerstag, 6. Mai 2010 08:14

Alle Antworten

  • Hallo Bernd,

    das BackroundImage ist eingebettet und nicht verlinkt, deswegen gibt es keine Pfad-Angaben.

    Warum verwendest Du nicht die ApplicationSettings, da ist die ganze Funktionalität doch schon enthalten und musst Dich um fast nichts kümmern? Bei jedem Control Property kannst Du angeben, ob es an ein ApplicationSetting gebunden ist und ob es im App oder User Scope ist. Es wird alles automatisch geladen und gespeichert. Und fürs BackgroundImage kannst Du mit den Resources arbeiten


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 6. Mai 2010 07:13
  • Hallo Olaf,

    wo werden denn diese Daten gespeichert ? kann der User mit dem Programm in ein anderes Verzeichnis umziehen oder gar auf einen anderen Comuter ? Weil bei My.Setting ist das ja nicht möglich ?

     

    lieben dank

    bernd

    Donnerstag, 6. Mai 2010 07:36
  • Die Daten werden als XML Datei (.config) gespeichert, Applikationsbezogene in der DeineAppliaktion.config im Verzeichnis der App, User bezogene im Profil unter C:\Dokumente und Einstellungen\<UserName>\Anwendungsdaten\<Applikationsname>\

    Das sind wie gesagt einfache XML Dateien und die kannst Du auch einfach auf andere Rechner kopieren. Und das sind die My.Settings.


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 6. Mai 2010 07:43
  • Hallo Olaf,

    das bring mich glaube ich nicht an Ziel.
    Mein Vorhaben,
    ich habe ein Control mit dem ich mir eine Uhr gestallten kann. In vielen verschiedenen Design's.
    Jedes Design soll aber gescpeichet werden können.
    Also
    Meine Schöne Uhr
    Meine Sonntags Uhr
    Meine Sonstige Uhr

    Das geht aber nur wenn ich die Property's einstelle und dann in je eine Datei ablege.
    Bei MySetting kann ich meines Wissens nur einmal Speichern !

    lieben dank

    bernd

    Donnerstag, 6. Mai 2010 08:01
  • Hallo Bernd,

    ergänzend zu Olafs Antwort:
    Ein Image ist zur Laufzeit im Kern ein Byte-Array,
    was sich aber nicht besonders gut in einer Textdatei macht.

    Um das Byte-Array in eine Text-kompatibles Format umzuwandeln
    verwende Convert.ToBase64String und für den umgekehrten Weg
    Convert.FromBase64String. Zusammengefaßt wäre das etwas wie:

      Public Shared Function ImageToBase64String(ByVal image As Image) As String
        Using imageStream As New MemoryStream
          image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Bmp)
          Return Convert.ToBase64String(imageStream.ToArray())
        End Using
      End Function
    
      Public Shared Function ImageFromBase64String(ByVal imageAsBase64 As String) As Image
        Dim imageBytes As Byte() = Convert.FromBase64String(imageAsBase64)
        Using imageStream As New MemoryStream(imageBytes)
          Return Image.FromStream(imageStream)
        End Using
      End Function
    

    Wobei Du bei großen Bildern aufpassen mußt, da dabei einige Bytes durch den Speicher geschaufelt werden.
    Verwenden kannst Du das z. B. als:

      Const ImageFileName As String = "C:\TEMP\Image.txt"
    
      ' Speichern einer PictureBox
      Me.PictureBox1.Image = ImageFromBase64String(File.ReadAllText(ImageFileName))
      ' und später laden
      Me.PictureBox1.Image = ImageFromBase64String(File.ReadAllText(ImageFileName))

    Oder auch über einen Stream in weitere Daten einbetten.
    Wobei sich zur Strukturierung am besten Xml eignet.

    Wo möglich solltest Du aber den Weg bevorzugen, den Olaf beschrieben hat.

    Gruß Elmar

    Donnerstag, 6. Mai 2010 08:14
  • Super,

    vielen lieben dank für eure mühe.
    Ich werde mein ganzes Konzept nochmals überdenke. Weil mich all diese Lösungen nicht wirklich zufrieden stellen.
    Ich denke ich werde im Cotrol etwas ändern.
    Wenn ich dort die Möglichkeit zur verfügungestelle ein Bild gleich als Dateiname auszusuchen, kann ich nachdem der User es ausgewählt hat in den Ordner Enviroment.CurrentDirectory kopieren. Dann den Namen in der Property als String spreichern.

    Dann bin auch flexible ohne das System mit zusätzlichen umrechnungen zu beschäftigen.

    vielen lieben dank
    bernd

    Donnerstag, 6. Mai 2010 11:24
  • Hallo Bernd,

    was erhoffst Du Dir davon, das Bild erst ins aktuelle Verzeichnis zu kopieren? Statt dessen wäre es doch sinnvoller den Pfad + Dateinamen zu speichern, den der User ausgewählt hat. Bedenke, dass sich das aktuelle Verzeichnis ändern kann. Durch die Verwendung des OpenFileDialog zum Beispiel, aber auch der Benutzer, kann dies beeinflussen, indem er bei einer Verknüpfung über die Deine Anwendung gestartet wird ein anderes Arbeitsverzeichnis angibt.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Donnerstag, 6. Mai 2010 11:33
  • Hallo Thorsten,

    das ist mal wieder mein pesimismus. schreibt man das so ?
    Ich habe mir derzeit mal ein sehr komplexes Programm geschrieben, welches für mich meine Datensicherung automatisch erledigt.
    Dort habe ich dann bemerkt das nicht alles so einfach ist. Verkrüpfungen zu spechern ist bei einer wirklichen Datensicherung "Mist".
    Gerade diese Woche ist meine PC wegen überhitzung ins jenseits gewandert. Nun habe ich aber alle Daten die Irgendwelche Programme benötigen komplett auf der Datensicherung. Ich stecke also nur die HD in den nächsten PC und bin sofort wieder am Start. Und genau so schreibe ich seither all meine Programme.
    Speicher kostet heute nichts mehr. Beim Datenverlust bin ich mir da nicht so sicher.

     

    lieben dank
    Bernd

    Donnerstag, 6. Mai 2010 11:50
  • Hallo Bernd,

    bei so viel professioneller Hilfe traue ich mich kaum noch zu fragen, tue es aber doch.  Wenn du die Einstellung in eine Textdatei speicherst, warum handelst du das dann nicht gleich wie eine (inzwischen veraltete) INI-Datei. Dort kannst du deine Einstellung doch jederzeit abfragen, verändern und speichern?


    Liebe Grüße Stefan
    Donnerstag, 6. Mai 2010 15:58
  • Hallo Giftzwockel,

    also wie gesagt möchte ich die Daten immer am Mann haben.
    Da fällt My.Settings also gleich raus.
    Die hier genannten Vorschläge sind natürlich Super und Profesionell, jedoch haben auch diese Tücken.
    Zitat:
    "Wobei Du bei großen Bildern aufpassen mußt, da dabei einige Bytes durch den Speicher geschaufelt werden."

    Also habe ich mich für einen Rückwärtsschritt entschieden.
    Ich lese also alle Properys aus und speichere sie in eine CSV Datei ab.
    Die Image.Datei kopiere ich ins CurrentDirektory um später bei der Datensicherung keine Datenverluste zu haben.

    INI Datei nehem ich nicht, da es ein veraltetes und auslaufendes System ist.
    XML Datei, ist vermutlich das Profesionellste, jedoch habe ich viel zu wenig Übungen und Erfarung damit gemacht.
    Das ist wohl ein Kapitel, welches ich auch noch in Angriff und genauestens unter die Lupe nehmen werde.

     

    vielen dank für dein Interesse und Mitgefühl

    bernd

     

    PS
    Es handels sich um folgendes Control
    http://supercontrol.pagedeluxe.de/
    nur für die die es wissen wollen.

    Donnerstag, 6. Mai 2010 18:56