Icon in Picture Box laden scheitert

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Icon in Picture Box laden scheitert

    Ich will ein Icon in eine PictureBox laden. So habe ich das kodiert:

    VB.NET-Quellcode

    1. Dim BaseFilename1 As String = "iexplore.ICO"
    2. Dim BaseFilename2 As String = "iexplore_32542.ICO"
    3. Dim myObject As String = ""
    4. Private Sub cmdLoad1_Click(sender As Object, e As EventArgs) Handles cmdLoad1.Click
    5. myObject = Path.Combine(BaseDirectory, BaseFilename1)
    6. LoadFile()
    7. End Sub
    8. Private Sub cmdLoad2_Click(sender As Object, e As EventArgs) Handles cmdLoad2.Click
    9. myObject = Path.Combine(BaseDirectory, BaseFilename2)
    10. LoadFile()
    11. End Sub
    12. Dim bitmap1 As Bitmap = Nothing
    13. Private Sub LoadFile()
    14. Using fs As New FileStream(myObject, FileMode.Open) 'Using is required to release lock on file
    15. bitmap1 = New Bitmap(fs)
    16. End Using
    17. 'PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    18. PictureBox1.Image = bitmap1
    19. End Sub


    Das Laden des ersten Icons (cmdLoad1) klappt ohne Probleme.

    Das Laden des zweiten Icons (cmdLoad2) bringt aber ein Error Display (rotes X). Merkwürdigerweise wird aber keine Exception ausgelöst ! Auch ein Copy in eine temporäre Bitmap ändert daran nichts.

    Und noch etwas: wenn ich nach cmdLoad2 nun noch einmal cmdLoad1 ausführe, dann klappt das jetzt auch nicht mehr ! Irgend etwas ist dauerhaft beschädigt worden.

    Um meine Verwirrung komplett zu machen: wenn ich das ganze als "Release" erstelle, dann erhalte ich mit cmdLoad2 eine GDI+ Exception ...

    Ich habe die beiden Icons angehängt ... mit Doppelclick lassen sich beide Files etwa im Windows Photo Viewer anschauen !

    Ich bin einfach ratlos ! Kann man jemand verraten, was ich falsch mache und vor allem wie ich das abfangen kann.

    LG
    Peter
    Bilder
    • iexplore.ico

      2,66 kB, 32×32, 182 mal angesehen
    Dateien

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

    Hi,
    versuch das mal:

    VB.NET-Quellcode

    1. Private Sub LoadIco(file As String)
    2. If IO.File.Exists(file) Then
    3. PictureBox1.Image = Image.FromFile(file)
    4. Else
    5. MsgBox("File not exist.")
    6. End If
    7. End Sub


    Und berichte ob es geht.

    Peter329 schrieb:

    Error Display (rotes X). Merkwürdigerweise wird aber keine Exception ausgelöst !
    Win10-64:
    Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.ExternalException" ist in System.Drawing.dll aufgetreten.
    Und dann so:

    VB.NET-Quellcode

    1. Private Sub LoadFile()
    2. Using fs As New FileStream(myObject, FileMode.Open) 'Using is required to release lock on file
    3. Dim ico = New Icon(fs)
    4. bitmap1 = ico.ToBitmap()
    5. End Using
    6. 'PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    7. PictureBox1.Image = bitmap1
    8. End Sub
    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!

    VB.NET-Quellcode

    Ich habe eure Vorschläge ausprobiert:

    1. @RFG

    VB.NET-Quellcode

    1. Dim ico = New Icon(fs)
    2. bitmap1 = ico.ToBitmap()


    Damit funktioniert jetzt zwar das ZWEITE Icon. Überraschenderweise bringt aber nun das ERSTE Icon eine Exception:

    Ein Ausnahmefehler des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten. Zusätzliche Informationen: Argument 'picture' must be a picture that can be used as a Icon.

    Verstehe ich nicht so ganz. Denn das Icon funktioniert ansonsten ganz prima !

    @Naifu

    VB.NET-Quellcode

    1. PictureBox1.Image = Image.FromFile(file)


    Das funktioniert mit BEIDEN Icons ! (Na also, geht doch ! :) )

    Aber ... leider wird ein Lock gesetzt und auch GEHALTEN ... Also wenn ich etwa das erste Icon anzeige, und dann zum zweiten Icon wechsle, kann ich das erste Icon immer noch NICHT umbenennen ... Das Lock wird erst freigegeben, wenn die Anwendung ENDET. Schhhhhhade !

    Meine diversen Versuche mit

    VB.NET-Quellcode

    1. Using myImage as Imge = Image.FromFile(file)


    haben das Problem auch nicht behoben.

    [Edit]

    In der Liste "Ähnliche Themen" ist ein älterer Beitrag von mir hochgepoppt "Solving Graphical Error" ... den habe ich zwar schon gesucht aber nicht mehr gefunden, hehehe ...

    Und da steht drin, wie man das Ganze lösen kann:

    VB.NET-Quellcode

    1. Private Sub LoadFile()
    2. Dim bytData(-1) As Byte
    3. bytData = IO.File.ReadAllBytes(myObject) 'Get object as byte array
    4. Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(Bitmap))
    5. Dim copyBitmap = DirectCast(converter.ConvertFrom(bytData), Bitmap) 'Convert byte array to bitmap
    6. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    7. PictureBox1.Image = copyBitmap
    8. End Sub


    Damit werden jetzt BEIDE icons angezeigt. Und Locks werden auch keine gehalten ! Ufff ...

    Danke für eure Hilfe und eure unendliche Geduld. Dieses Code Snippet merke ich mir jetzt !

    LG
    Peter

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

    @Peter329
    Wenn ich nicht irre wolltest die beiden Icons anzeigen, von umbenennen war nicht die Rede.
    Unter Umständen wäre es hilfreich wenn du uns sagst was du genau erreichen möchtest.
    Poste mal deinen Code.
    Nur um deine Frage zu beantworten:

    In meiner Anwendung will ich die Icons nicht umbenennen. Aber das ist natürlich blöde, wenn ich in meiner Anwendung der Reihe nach sagen wir 10 Icons anzeige ... und so lange meine Anwendung läuft, können ANDERE Anwendungen (z.B. der Explorer) auf keines dieser Icons mehr verändernd zugreifen. Nach dem Anzeigen eines Icons muss das Lock natürlich freigegeben werden. Das ist das Problem bei deiner Lösung.

    Aber wie schon geschrieben: das o.a. Code Snippet kommt jetzt mit allen graphical Files klar, und die Locks werden erfreulicherweise auch freigegeben.

    Danke für eure Hilfe !

    LG
    Peter
    @Peter329 Bei mir lief der Code mit mehreren Icons.
    Mit welchem Framework und welchem Betriebssystem arbeitest Du?
    Poste mal das Icon, bei dem bei Dir ne Exception kam.
    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!
    @Peter329
    Versuch mal diese Variante:

    VB.NET-Quellcode

    1. Private Sub LoadIco(file As String)
    2. If IO.File.Exists(file) Then
    3. Using img As Image = Image.FromFile(file)
    4. PictureBox1.Image = DirectCast(img.Clone, Image)
    5. End Using
    6. Else
    7. MsgBox("File not exist.")
    8. End If
    9. End Sub
    @RFG

    Windows 7, .Net 4.6.1

    und die beiden Icons hängen schon am Post #1

    Aber wie schon gesagt, meine Anwendung läuft jetzt mit dem obigen Coding....

    @Naifu

    Ok, probiere ich aus.

    Danke ihr beiden !

    LG
    Peter

    Peter329 schrieb:

    Ok, probiere ich aus.
    Aber bitte nur ohne VB6-Namespace ;) . Stichwort MsgBox <X
    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.

    Peter329 schrieb:

    die beiden Icons hängen schon am Post #1
    Das ist kein Icon, das ist eine PNG:
    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!
    Ungünstig hochgeladen? Der Dateiinhalt bestätigt zum Anfang: ‰PNG
    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 schrieb:

    Ungünstig hochgeladen? Der Dateiinhalt bestätigt zum Anfang: ‰PNG


    Also die beiden Icons wurden mit dem Programm iconsext.exe (frei im Internet zum Download verfügbar) aus einem .exe file extrahiert. Und dabei wird die Extension .ico generiert.

    Die Icons habe ich dann so wie sie sind hochgeladen. Und wie schon gesagt ... die beiden Icons verhalten sich überall sonst völlig normal.

    Ich denke, dass die Probleme schon damit zusammenhängen, dass der FileStream nicht immer richtig konvertiert. Und dass der ByteReader zusammen mit dem converter die deutlich bessere Alternative ist.

    Beim Testen habe ich jedenfalls bisher auch mit "exotischen" Dateien keine Fehler mehr feststellen können.
    @Peter329 Öffne die Dateien im IrfanView, der sagt sofort, wenn die Extension eien falsche ist:
    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!