Prüfe ob Datei ein Bild ist!

  • VB.NET
  • .NET 2.0

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Prüfe ob Datei ein Bild ist!

    Moin! :)
    Ich versuche gerade eine Funktion zu programmieren.
    Diese überprüfen soll, ob der Parameter ein Bildpfad ist.
    Falls es ein Bild ist, soll es True ausgeben, sonst Else.
    Nun das Problem: :!:
    Wenn ich später weiter programmieren und auf das Bild zugreifen möchte, weil ich dieses Kopieren möchte.
    Erscheint eine Fehlermeldung, dass man keinen Zugriff hat auf die Datei, da diese gerade verwendet wird.
    Deshalb muss ich diese Funktion anders aufbauen.
    Freue mich auf Tipps.
    BIG THX

    VB.NET-Quellcode

    1. Private Function PrüfeObBildatei(strPfad As String) As Boolean
    2. Try
    3. Dim img As Image = Image.FromFile(strPfad)
    4. img.Dispose()
    5. Return True
    6. Catch
    7. Return False
    8. End Try
    9. End Function



    edit1:
    Mir ist noch was Wichtiges eingefallen!
    Wenn die Datenendung z.B ein JPG ist, aber in Wirklichkeit kein Bild ist.
    Soll es dies merken.
    Also nur auf JPG/PNG usw.. prüfen ist nicht die Lösung.
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    @Cheffboss Machst Du ein Using drumherum und lädtst über einen Stream:

    VB.NET-Quellcode

    1. Dim bmp As Bitmap
    2. Try
    3. Using fs = New IO.FileStream("Datei", IO.FileMode.Open)
    4. bmp = New Bitmap(fs)
    5. Return True
    6. End Using
    7. Catch
    8. End Catch
    9. Return False
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich kann das Problem nicht nachstellen. Dein Code klappt bei mir. Kommt aber auch drauf an, was danach mit der Datei gemacht wird. Ich habe:

    VB.NET-Quellcode

    1. Dim Pfad = PfadZurDatei
    2. PrüfeObBildatei(Pfad)
    3. Dim Bild = Image.FromFile(Pfad)
    4. PictureBox1.Image = Bild

    Läuft.

    Wenn Du den anderen Weg gehen willst, müsstest Du den Dateiinhalt hernehmen und den Header auslesen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Oder anstatt die gesamte Datei zu laden, einfach die ersten Bytes lesen und die file signature prüfen.

    slice schrieb:

    einfach die ersten Bytes lesen
    ist aber ein riesen Aufwand, von Einfach kann da wohl keine Rede sein.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @a.b_om Glückwunsch, Du hast die meisten Posts diesen Monat.
    Die Qualität Deiner Antworten lässt jedoch manchmal zu wünschen übrig.
    @slice meint, die Signatur einer Datei, das sind die ersten Bytes des Dateiinhalts.
    Du meinst wahrscheinlich die Extension eines Dateinamens, die nicht notwendig mit dem Dateiinhalt korrespondieren muss.
    Und:
    Zur Ermittlung der Extension wird nicht Split verwendet, sondern Path.GetExtension(...).
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    RodFromGermany schrieb:

    @a.b_om Glückwunsch, Du hast die meisten Posts diesen Monat.
    Die Qualität Deiner Antworten lässt jedoch manchmal zu wünschen übrig.

    What?? Was meinst du mit meisten Post in diesem Monat. ?(

    Das mit der Qualität ist mir bewusst, aber ich bin nicht allwissend und ich versuche zu helfen, mit unortodoxen Methoden, die meistens nur mir einfallen.

    RodFromGermany schrieb:

    @slice meint, die Signatur einer Datei, das sind die ersten Bytes des Dateiinhalts.
    Du meinst wahrscheinlich die Extension eines Dateinamens, die nicht notwendig mit dem Dateiinhalt korrespondieren muss.
    Und:
    Zur Ermittlung der Extension wird nicht Split verwendet, sondern Path.GetExtension(...).

    Gut, dass ich eine weitere Methode kenne :thumbsup: , der Lehrer sagte, man muss Split nehmen.
    Und das ist ein Lehrer, der behauptet, er habe immer recht. :thumbdown:

    a.b_om schrieb:

    Was meinst du mit meisten Post in diesem Monat.

    Ich bin geneigt, den meisten Lehrern erst mal Unkenntnis zu unterstellen, ;)
    bei manchen allerdings auch Dummheit.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ach... Jetzt verstehe ichs. Ich versuche nur zu helfen. Indem ich reinschreibe und eine winzige Hilfe gab, lerne ich noch etwas dabei, wie das besser geht, oder wie es überhaupt geht. Lehre umgewandelt in ein Verb ist gleich lernen und das muss ich.
    @a.b_om
    Wenn du allerdings totalen Quatsch postest, ist das eher kontraproduktiv !

    Du musst dich nicht in jedem Thread profilieren ! ;)

    a.b_om schrieb:

    Ach... Jetzt verstehe ichs. Ich versuche nur zu helfen. Indem ich reinschreibe und eine winzige Hilfe gab, lerne ich noch etwas dabei, wie das besser geht, oder wie es überhaupt geht. Lehre umgewandelt in ein Verb ist gleich lernen und das muss ich.

    Ich glaube nicht, daß du verstanden hast, denn was du da schreibst, ist vollkommen egoistisch, nur auf dich bezogen !
    Und auch in diesem Thread bitte keine Privatkonversation, sondern beim Thema bleiben.

    a.b_om schrieb:

    Lehre umgewandelt in ein Verb ist gleich lernen und das muss ich.
    Dass »Lehre« zu »lehren« wird, also Wissenweitergabe(versuch) und Lernen das Empfangen und Verstehen von Wissen, ist für diesen Thread kein relevanter Diskussionspunkt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Dann lösche meine unnötigen Antworten. Auch diesen, indem ich den SuperModerator darauf hinweise. Es ist doch für alle besser, dass meine Antworten in diesem Thread verschwinden. Ich kann keine Löschen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    slice schrieb:

    Oder anstatt die gesamte Datei zu laden, einfach die ersten Bytes lesen und die file signature prüfen.

    Habe ich mir zu Hausaufgabe erklärt und haue das Ergebnis einfach mal raus.

    VB.NET-Quellcode

    1. Private Function HaveFileSignature(ByVal _fileName As String, ByVal _fileSignatures As String()) As Boolean
    2. Dim buffer As Byte() = New Byte(_fileSignatures.Max.Length - 1) {}
    3. Using fileStream As New FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.None)
    4. fileStream.Read(buffer, 0, buffer.Length)
    5. End Using
    6. Dim firstBytesFromFile As String = String.Join(" ", Array.ConvertAll(buffer, Function(b) b.ToString("X2")))
    7. Dim firstBytesFromFilePart As String = firstBytesFromFile
    8. For Each fileSignature As String In _fileSignatures
    9. firstBytesFromFilePart = firstBytesFromFilePart.Remove(fileSignature.Length)
    10. If firstBytesFromFilePart.Equals(fileSignature) Then Return True
    11. firstBytesFromFilePart = firstBytesFromFile
    12. Next
    13. Return False
    14. End Function

    Variante

    VB.NET-Quellcode

    1. Private Function HaveFileSignature(ByVal _fileName As String, ByVal _fileSignatures As String()) As Boolean
    2. Dim buffer As Byte() = New Byte(_fileSignatures.Max.Length - 1) {}
    3. Using fileStream As New FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.None)
    4. fileStream.Read(buffer, 0, buffer.Length)
    5. End Using
    6. Dim firstBytesFromFile As String = String.Join(" ", Array.ConvertAll(buffer, Function(b) b.ToString("X2")))
    7. For Each fileSignature As String In _fileSignatures
    8. If String.Join("", firstBytesFromFile.Take(fileSignature.Length)).Equals(fileSignature) Then Return True
    9. Next
    10. Return False
    11. End Function

    Die anwendung könnte dan so aussehen:

    VB.NET-Quellcode

    1. Dim bmp As String = "42 4D"
    2. Dim png As String = "89 50 4E 47 0D 0A 1A 0A"
    3. Dim jpgraw As String = "FF D8 FF DB"
    4. Dim jpgjfif As String = "FF D8 FF E0 00 10 4A 46 49 46 00 01"
    5. Dim jpgexif As String = "FF D8 FF E1 ?? ?? 45 78 69 66 00 00"
    6. Dim gif As String = "47 49 46 38 37 61"
    7. Dim gif2 As String = "47 49 46 38 39 61"
    8. Dim imageFileSignatures As String() = {png, jpgraw, jpgjfif, jpgexif, gif, gif2, bmp}
    9. Debug.WriteLine(HaveFileSignature(fileName, imageFileSignatures).ToString)

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

    @FormFollowsFunction Warum packst Du die Kennungen nicht gleich in je ein Byte-Array?

    VB.NET-Quellcode

    1. Dim bmp As Byte() = { 0x42, 0x4D }
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Du mischst mal wieder C# und VB.Net: Dim bmp As Byte() = {&H42, &H4D} ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    :thumbsup:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Weil die Signaturen meistens in der Form vorliegt.
    en.wikipedia.org/wiki/List_of_file_signatures
    garykessler.net/library/file_sigs.html
    filesignatures.net/index.php?page=all

    Ich habe aber nochmal etwas überarbeitet, indem ich Variablennamen deutlicher benannt habe und in die Strings werden jetzt Leerzeichen eingefühgt, damit die einzelnen bytes optisch besser dargestellt werden.