jpg String to picture box

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    jpg String to picture box

    Hi,

    Ich habe einen verschlüsselten File der eine .jpg Datei enthält. Die Routine zum Entschlüsseln stellt die .jpg Daten in einem String bereit.

    Ich möchte diese .jpg Daten in einem Vorschaufenster anzeigen. Bisher sind mir dazu folgende Möglichkeiten eingefallen:

    Ich kann die entschlüsselten Daten als File abspeichern. Und dann kann ich die PictureBox damit befüllen.

    VB.NET-Quellcode

    1. picPreview.ImageLocation = DisplayObject


    Oder aber ich wandle den entschlüsselten File in eine Bitmap um, die ich dann der PictureBox zuweise.

    VB.NET-Quellcode

    1. Dim copyBitmap As New Bitmap(DisplayObject)
    2. picPreview.Image = copyBitmap


    Beide Methoden funktionieren. Aber blöde ist halt, dass ich die jpg Daten in der entschlüsselten Datei "DisplayObject" zwischenspeichern muss.

    Gibt es keine Methode, mit der ich die PictureBox DIREKT aus den entschlüsselten jpg Daten befüllen kann ?

    Ich hoffe, ich habe mein Problem verständlich machen können ! Wie kann ich einen String der jpg Daten enthält ohne Umwege in eine PictureBox füllen.

    LG
    Peter
    @Peter329 Probier mal, die Bitmap-Instanz über einen FileStream zu instanziieren.
    msdn.microsoft.com/de-de/library/z7ha67kw(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bitmap hat 11 Überlagerungen. Eine davon akzeptiert als Eingabe einen FileStream. Wenn ich also einen .jpg FILE laden möchte, dann geht das problemlos wie folgt:

    VB.NET-Quellcode

    1. Dim fs As New FileStream(fileRealObject, FileMode.Open)
    2. copyBitmap = New Bitmap(fs)
    3. myPicturebox.Image = copyBitmap


    Das Problem ist aber, dass ich den FILE nicht direkt lade, sondern zum entschlüsseln erst in einen STRING umwandle. Meine entschlüsselten .jpg Daten stehen also in

    Dim strData as String = ...

    Wie kriege ich denn jetzt strData auf einen FileStream ?

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 OK. Als Zwischenpuffer könntest Du einen MemoryStream verwenden, da kannst Du reinpacken was Du brauchst, musst aber zum Auslesen den Lese-Zeiger wieder auf den Anfang stellen:
    msdn.microsoft.com/de-de/libra…tream.seek(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das klingt eigentlich sehr vielversprechend:

    VB.NET-Quellcode

    1. Dim strByte As Byte() = Encoding.Default.GetBytes(strData)
    2. Dim memStream As New MemoryStream
    3. memStream.Write(strByte, 0, strByte.Length)
    4. memStream.Seek(0, SeekOrigin.Begin)
    5. copyBitmap = New Bitmap(memStream)


    Aber leider scheitert die Bitmap(memStream) Anweisung:

    Ausnahme ausgelöst: "System.ArgumentException" in System.Drawing.dll

    Das sieht so aus, als würde nur ein FileStream akzeptiert und kein MemoryStream. Oder hab ich etwas falsch gemacht ?

    Schade !

    Gibt es andere Ideen ?

    LG
    Peter
    zunächst verifiziere mal, ob Encoding.Default.GetBytes(strData) wirklich sinnvolle Bild-Daten ergibt - mir sieht das ziemlich abenteuerlich aus.

    Ansonsten kannste dir auch mit TypeDescriptor.GetConverter(gettype(Bitmap)) einen Konverter holen, der ein ByteArray in eine Bitmap wandelt und zurück.
    Databinding arbeitet intern so.



    Nochwas: Es ist keine gute Idee, Bilddaten in Strings zu wandeln. Bild-Daten sind Bild-Daten, also Bytes, und das sollten sie auch bleiben.
    Verschlüsselung nach Stand der Technik ver- und ent- schlüsselt auch nur Byte-Folgen - Strings haben inne Kryptologie überhaupt nichts verloren, mit Ausnahme der "Schnittstelle zum Menschen": BenutzerName und Passwort.
    Wenn wolle gugge Verschlüsseln und Autentifizieren

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Das klingt ja super gut. So habe ich das versucht:

    VB.NET-Quellcode

    1. Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(Bitmap))
    2. copyBitmap = New Bitmap(DirectCast(converter.ConvertFrom(strByte), Bitmap)) 'Does not work
    3. copyBitmap = New Bitmap(DirectCast(converter.ConvertTo(strByte, GetType(Bitmap)), Bitmap)) 'Does not work


    Erstens weiß ich nicht, ob ich .ConvertFrom oder .ConvertTo verwenden soll.

    Und zweitens: beide Befehle enden mit einer Exception.

    ConvertFrom - Ausnahme ausgelöst: "System.ArgumentException" in System.Drawing.dll

    ConvertTo - Ausnahme ausgelöst: "System.NotSupportedException" in System.dll

    Was mache ich denn falsch ?

    LG
    Peter

    P.S.: Das mit dem String und der Encryption ist mir jetzt auch aufgefallen. Das werde ich korrigieren und Byte() zurückliefern.
    @Peter329 Speicher mal den Stream als Datei und sieh Dir das Resultat an.
    Kannst Du mal den Code und die Daten posten, meinetwegen auch als PN?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    und um zu klären, wie man mit einem Converter umgeht, guck in den Objectbrowser.
    Na - haste ja vlt. - aber trotzdem komisch, was du da machst - probierma

    VB.NET-Quellcode

    1. copyBitmap =(DirectCast(converter.ConvertFrom(strByte), Bitmap)

    Wie gesagt: funzt nur, wenn die Bytes auch wirklich eine Bitmap darstellen.

    Auch interessant für dich könnte sein, mal einen Haltepunkt draufzusetzen, und gucken, was .GetConverter denn wirklich zurückgibt.
    Und wie gesagt ObjectBrowser - die Summary von .ConvertFrom und .ConvertTo lesen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Na klar, einfach mal mit gültigen Daten testen:

    VB.NET-Quellcode

    1. Dim bytData As Byte() = My.Computer.FileSystem.ReadAllBytes(fileRealObject)
    2. Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(Bitmap))
    3. copyBitmap = DirectCast(converter.ConvertFrom(bytData), Bitmap)
    4. 'copyBitmap = DirectCast(converter.ConvertTo(bytData, GetType(Bitmap)), Bitmap) 'Does not work
    5. PictureBox2.Image = copyBitmap


    Die Sache mit dem "ConvertFrom" funktioniert ! Und damit habe ich eine Lösung für mein Problem.

    Offensichtlich liegt der Fehler also in meiner Byte Aufbereitung. Nun gut, die wollte ich ohnehin überarbeiten.

    Warum die Sache mit dem "ConvertTo" auch mit gültigen Daten nicht funktioniert ("System.NotSupportedException" in System.dll) lasse ich jetzt mal dahingestellt sein.

    Also, vielen Dank und Daumen hoch. Ihr habt mir SEHR geholfen !

    LG
    Peter