Benutzer mit den meisten Antworten
Property Image Name und Pfad Speichren

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
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- Als Antwort vorgeschlagen Thorsten Dörfler Donnerstag, 6. Mai 2010 08:45
- Als Antwort markiert Robert Breitenhofer Donnerstag, 6. Mai 2010 16:40
-
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
- Als Antwort vorgeschlagen Thorsten Dörfler Donnerstag, 6. Mai 2010 08:45
- Als Antwort markiert Bernd Schlepütz Donnerstag, 6. Mai 2010 11:24
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 -
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- Als Antwort vorgeschlagen Thorsten Dörfler Donnerstag, 6. Mai 2010 08:45
- Als Antwort markiert Robert Breitenhofer Donnerstag, 6. Mai 2010 16:40
-
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 dankbernd
-
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
- Als Antwort vorgeschlagen Thorsten Dörfler Donnerstag, 6. Mai 2010 08:45
- Als Antwort markiert Bernd Schlepütz Donnerstag, 6. Mai 2010 11:24
-
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 -
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 -
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 -
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 -
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.