PictureBox nach fülle leer

  • VB.NET

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

    PictureBox nach fülle leer

    Hallo zusammen,

    ich habe ein Problem beim befüllen einer Picturebox.
    Ich fülle die Box mit dem Stream aus einem Dataset.

    hier mal der Code

    VB.NET-Quellcode

    1. Dim _img() As Byte = Objektdaten._objektdaten.Rows(0)("od_image")
    2. Dim ms As New IO.MemoryStream(_img)
    3. Dim _image As Image
    4. _image = Image.FromStream(ms, False)
    5. PictureBox1.Image = _image


    die Picturebox zeigt das Bild nur kurz an und danach ist sie leer.
    Kann mir da jemand helfen?

    Gruß Udo
    Ausgeschnipselter Code. Schwierig zu bewerten. Keine Ahnung, was da sonst noch passiert. Bei mir klappt's.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim ByteArray = MeinTds.ImageTable(0).Data
    3. Using ms As New IO.MemoryStream(ByteArray)
    4. PictureBox1.Image = Image.FromStream(ms, False)
    5. End Using
    6. End Sub

    btw: typisiert wird's auf Dauer fehlerunanfälliger.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    grisu74 schrieb:

    und danach ist sie leer.
    Ich denke mal, dass beim Schließen des MemoryStreams das Bild verschwindet.
    Lerne zu debuggen :!:
    Setze auf Zeile 6 einen Haltepunkt, sieh Dir PictureBox1.Image in der Überwachung an und steppe das Programm durch.
    Debuggen, Fehler finden und beseitigen
    Irgendwann steht da nicht mehr {PictureBox.Image}, sondern Nothing. Diese Stelle musst Du erwischen.
    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!
    Hallo nochmal,

    also ich habe folgendes probiert.
    Debuggt bis zum schluss von Form_Shown.
    Da ist das Bild noch da.
    Im Direktfenster bekomme ich auch ein {System.Drawing.Bitmap}.

    Den Code in form_Shown geschrieben!
    Genau das gleiche passiert. Das Bild ist weg.
    Danach passiert im Code nichts mehr.

    Hierzu hätte ich noch eine Idee.
    {System.Drawing.Bitmap}? Ich speichere aber ein JPG.
    Ist das vielleicht das Problem?

    Hat noch jemand eine Idee?

    Gruß Udo
    Zeige mal den Aufruf der Form. Also den Code der die Form quasi öffnet.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Nein, JPG ist kein Problem.
    Kannst Du mal bitte das Projekt ohne bin-, obj-, .vs- und .git-Ordner, aber mit dem Bild, gezippt über [+ Erweiterte Antwort] hochladen? Vielleicht finden wir so das Problem und eine Lösung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.

    grisu74 schrieb:

    Hat noch jemand eine Idee?
    Da hilft nur der komplette Code.
    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!
    Danke erst mal,

    Erst mal das Form_Load Event usw.

    ​{System.Drawing.Bitmap} Flags: 77840 FrameDimensionsList: {Length=1} Height: 150 HorizontalResolution: 96 Identity: Nothing Palette: {System.Drawing.Imaging.ColorPalette} PhysicalDimension: {Width = 200 Height = 150} PixelFormat: Format24bppRgb {137224} PropertyIdList: {Length=0} PropertyItems: {Length=0} RawFormat: {[ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]} Size: {Width = 200 Height = 150} Tag: Nothing VerticalResolution: 96 Width: 200 __identity: Nothing nativeImage: {263213968} rawData: Nothing userData: Nothing

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.ComponentModel
    3. Imports System.Data
    4. Imports System.Drawing
    5. Imports System.Drawing.Imaging
    6. Imports System.IO
    7. Imports System.Windows.Forms
    8. Imports Telerik.WinControls.UI
    9. Public Class Objekt
    10. Private Sub BindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles BindingNavigatorSaveItem.Click
    11. 'Dim editbaleObject As IEditableObject = TryCast(ObjektdatenTableAdapter.GetData(FrmMain.int_objektnummer), IEditableObject)
    12. 'If editbaleObject IsNot Nothing Then
    13. ' editbaleObject.EndEdit()
    14. 'End If
    15. 'Dim dataRowView As DataRowView = TryCast(e.Row.DataBoundItem, DataRowView)
    16. 'If dataRowView IsNot Nothing Then
    17. Me.ObjektdatenBindingSource.EndEdit()
    18. Dim ms As New IO.MemoryStream()
    19. Dim _img As Image
    20. _img = PictureBox1.Image
    21. Dim _functions As New functions
    22. _img = _functions.AutoSizeImage(_img, 200, 200)
    23. _img.Save(ms, Imaging.ImageFormat.Jpeg)
    24. Me.ObjektdatenTableAdapter.UpdateObjekt(txtObjektname.Text, rdlStrassen.Text, txtHausnummer.Text, CInt(txtPLZ.Text),
    25. txtOrt.Text, System.DateTime.Now, "Begehungsintervall", CInt(txtMeldernummer.Text), PictureBox1.ImageLocation, CInt(rdlobjekttyp.SelectedValue), ms.GetBuffer, CInt(lblObjektNr.Text))
    26. objekte.V_objektdatenTableAdapter.Fill(objekte._Benutzer.v_objektdaten)
    27. End Sub
    28. Private Sub Objekt_Load(sender As Object, e As System.EventArgs) Handles MyBase.Load
    29. 'TODO: Diese Codezeile lädt Daten in die Tabelle "Objektdaten.objekttyp_full". Sie können sie bei Bedarf verschieben oder entfernen.
    30. Me.Objekttyp_fullTableAdapter.Fill(Me.Objektdaten.objekttyp_full)
    31. 'TODO: Diese Codezeile lädt Daten in die Tabelle "Objektdaten.strassen_nbg". Sie können sie bei Bedarf verschieben oder entfernen.
    32. Me.Strassen_nbgTableAdapter.Fill(Me.Objektdaten.strassen_nbg)
    33. 'TODO: Diese Codezeile lädt Daten in die Tabelle "Objektdaten.Objekttyp_full". Sie können sie bei Bedarf verschieben oder entfernen.
    34. Me.Objekttyp_fullTableAdapter.Fill(Me.Objektdaten.objekttyp_full)
    35. Me.Strassen_nbgTableAdapter.Fill(Me.Objektdaten.strassen_nbg)
    36. Me.SachgebietTableAdapter.Fill(Me.Benutzer.sachgebiet)
    37. 'TODO: Diese Codezeile lädt Daten in die Tabelle "Objektdaten._objektdaten". Sie können sie bei Bedarf verschieben oder entfernen.
    38. Me.ObjektdatenTableAdapter.FillBy(Me.Objektdaten._objektdaten, FrmMain.int_objektnummer)
    39. 'If Not Me.txtobjekttypId.Text = "" Then
    40. 'Dim dt As DataTable = ObjektdatenTableAdapter.GetData(0)
    41. Me.Ansprechpartner_objektTableAdapter.Fill(Me.Objektdaten.ansprechpartner_objekt, FrmMain.int_objektnummer)
    42. For Each column As GridViewDataColumn In rgvAnsprechpartner.Columns
    43. column.BestFit()
    44. Next
    45. Me.BindingNavigatorSaveItem.Enabled = True
    46. End Sub
    47. Public Function ConvertImageTypeToJPEG(Image As Bitmap) As Stream
    48. Dim SaveStream As New IO.MemoryStream
    49. Image.Save(SaveStream, ImageFormat.Jpeg)
    50. Return SaveStream
    51. End Function
    52. Private Sub RadMultiColumnComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs)
    53. Me.ObjekttypBindingSource.EndEdit()
    54. Me.ObjekttypTableAdapter.Update(Objektdaten)
    55. End Sub
    56. Private Sub cmdBildauswaehlen_Click(sender As Object, e As EventArgs) Handles cmdBildauswaehlen.Click
    57. Dim openFolderDialog As OpenFileDialog = New OpenFileDialog()
    58. openFolderDialog.ShowDialog()
    59. If DialogResult.OK = System.Windows.Forms.DialogResult.OK Then
    60. Dim folderName As String = openFolderDialog.FileName
    61. Me.PictureBox1.ImageLocation = folderName
    62. End If
    63. End Sub
    64. Private Sub Objekt_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    65. Dim _img() As Byte = Objektdaten._objektdaten.Rows(0)("od_image")
    66. Using ms As New IO.MemoryStream(_img)
    67. Dim _image As Image
    68. _image = Image.FromStream(ms, True)
    69. PictureBox1.Image = _image
    70. End Using
    71. End Sub
    72. End Class

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

    @grisu74 Lesen bildet:

    VaporiZed schrieb:

    Kannst Du mal bitte das Projekt ohne bin-, obj-, .vs- und .git-Ordner, aber mit dem Bild, gezippt über [+ Erweiterte Antwort] hochladen?
    Überzeuge Dich davon, dass Dein Code bei uns compiliert, indem Du ihn bei Dir in ein neues Projekt einfügst!

    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!
    Ich habe den Fehler gefunden!!

    Ich habe jetzt nochmal ein Testformular erstellt wo ich nur eine Picturebox drinnen habe. Da funktioniert es.
    Ich hatte in der Eigenschaft ImageLocation noch ein Binding von der Datenbank drinnen :cursing: .

    Trotzdem Danke für eure Hilfe. Echt ein super Forum hier.

    Beim nächsten mal prüfe ich erst alle Eigenschaften!!!

    Gruß Udo
    man braucht keinen MemoryStream um aus BildDaten im Dataset ein Image zu creiern.
    Ein Image wird im Dataset als Byte() vorgehalten (ich glaub, das wussteste shon).
    Probierma:

    VB.NET-Quellcode

    1. Private Shared Function ImageFromBytes(bytes As Byte()) As Bitmap
    2. Dim conv = TypeDescriptor.GetConverter(GetType(Image))
    3. Return DirectCast(conv.ConvertFrom(bytes), Bitmap)
    4. End Function
    TypeConverter ist die Technik, die auch beim Databinding im Hintergrund werkelt, etwa wenn ein Bild im Dataset per Databinding in einer DGV-Zelle angezeigt wird.



    Übrigens empfehle ich dir ein resourcenschonendes DB-DEsign: Bau dir eine Blob-Tabelle in der Datenbank (ID int PK NotNull) (Blob varbyte(max) NotNull), in der du alle Gross-Objekte ablegst (Bilder, Dokumente, was auch immer). Und keine andere Tabelle enthält Blob-Daten, sondern immer nur Fremdschlüssel, die einen Datensatz der BlobTable addressieren.
    Dann kannst du problemlos immer viele Datensätze abrufen, und in Extra-Calls dann die Blobs nachladen, die du tatsächlich aktuell anzeigen willst.
    Andernfalls wirds sehr resourcenfressend, wenn du mw 1000 Datensätze abrufst mit je einem Image drin.
    Bzw. es wird sehr umständlich, je eine Abfragen zu konstruieren, die den Blob erstmal ausschliesst, und on demand ihn dann aus derselben Tabelle nachlädt.

    Klar - zunächstmal sieht Sql so aus, als sei sowas vorgesehen (Auslassen bzw Nachladen einzelner Felder).
    Aber für eine Db-Anwendung möchtest du vielleicht ein Standard-Instrumentarium haben, was generisch jede Tabelle abrufen und updaten kann, ohne individuell für jede Tabelle was frickeln zu müssen.
    Db-Tabellen wo Blob und Verarbeitungs-Daten gemischt sind, sind über so ein Standard-Instrumentarium nicht zu bewältigen.

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

    Hallo,

    danke für die Info.
    Ich lagere die Bilder natürlich in einer Blob-Tabelle aus. Zum testen habe ich das ganze nur in eine Tabelle gepackt.
    Hierzu noch eine Frage.
    Ist es sinvoll das gabze über eine seperate Instanz mit eigenem Connectionstring zu machen?
    Ich habe gelesen, das es wegen Backup usw. auf dem SQL Server besser ist.

    Gruß Udo