.heic Dateien anzeigen

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    .heic Dateien anzeigen

    Hi,

    ich bekomme immer öfter .heic Dateien von Bekannten zugeschickt ... das ist wohl ein gängiges Format von Picture-Dateien, das insbesondere von Cell Phones auf den Philippinen erstellt wird.

    Konvertieren kann man so eine Datei über eine (kostenfreie) URL ... oder man wird gebeten, die (kostenfreie) HEVC Erweiterung zu installieren ... aber eigentlich hab ich keine Lust für so einen Quatsch irgend eine Erweiterung auf meinem PC zu installieren. Und meine Dateien ständig auf einen Server hochzuladen, gefällt mir auch nicht so recht, vor allem weil ich mich bei kostenfreien URLs sofort frage, wo und wie die ihr Geld herbekommen. Denn umsonst ist nix im grenzenlosen Net der Dinge. :)

    Gibt es eine Möglichkeit über VB solche .heic Dateien entweder in eine .jpg Datei zu konvertieren ... es würde mir aber auch schon reichen, wenn man die Datei (in meinem privaten File Browser) am Bildschirm anzeigen kann. Vielleicht gibt es ja eine DLL, die so etwas vermag ...

    Vielleicht weiß jemand, wie man das handhaben kann.

    LG
    Peter

    Verschoben. ~Thunderbolt

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

    Ich glaube nicht, das .Net so eine Funktion hat.
    Du könntest dir imagemagick besorgen und dann mit [tt]magick mogrify -format jpg *.heic[tt] konvertieren.
    Hi

    Vorausgesetzt Du hast min. Win10 und den Codec aus dem Windows Store installiert, dann kannst Du per WIC (Windows Imaging Component) HEIC/HEIF Bilder laden und konvertieren. Alternativ geht zB auch: Unterstützte Bildformate laden und speichern (speichern nur in BMP und JPG) per Interface ITranscodeImage Zum Codec aus dem Windows Store: Den gab es mal kostenlos und soll jetzt glaub ich einmalig 99Cent kosten. Mit ein wenig Recherche und entsprechender legaler Website, kann man heute noch den kostenlosen Codec aus dem Store, ohne die App Windows Store, herunterladen und installieren. <- kleine Korrektur: Siehe auch hier: pcwelt.de/article/1197799/so-n…eif-heic-auf-windows.html Also der Bildcodec ist wohl immer noch kostenlos.

    Edit: Hier noch ein Nachreicher wie man HEIC/HEIF und andere Bildformate mit WIC laden kann. Wie immer fix zusammengeklöppelt und alles in einer Form.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Imaging
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Private Const S_OK As Integer = &H0
    5. Private Const WINCODEC_SDK_VERSION2 As Integer = &H237
    6. Private GUID_WICPixelFormat32bppBGRA As String = "6fddc324-4e03-4bfe-b185-3d77768dc90f"
    7. Private Enum WICAccessOption As Integer
    8. GENERIC_READ = &H80000000
    9. GENERIC_WRITE = &H40000000
    10. End Enum
    11. Private Enum WICDecodeOptions As Integer
    12. WICDecodeMetadataCacheOnDemand = &H0
    13. WICDecodeMetadataCacheOnLoad = &H1
    14. End Enum
    15. <DllImport("windowscodecs.dll", EntryPoint:="WICCreateImagingFactory_Proxy")>
    16. Private Shared Function CreateImagingFactory(
    17. <[In]> SDKVersion As Integer,
    18. <Out> ByRef ppIImagingFactory As IntPtr) As Integer
    19. End Function
    20. <DllImport("windowscodecs.dll", EntryPoint:="IWICImagingFactory_CreateDecoderFromFilename_Proxy")>
    21. Private Shared Function CreateDecoderFromFilename(
    22. <[In]> pFactory As IntPtr,
    23. <[In]> <MarshalAs(UnmanagedType.LPWStr)> wzFilename As String,
    24. <[In]> pguidVendor As IntPtr,
    25. <[In]> dwDesiredAccess As WICAccessOption,
    26. <[In]> metadataOptions As WICDecodeOptions,
    27. <Out> ByRef ppIDecoder As IntPtr) As Integer
    28. End Function
    29. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapDecoder_GetFrameCount_Proxy")>
    30. Private Shared Function GetFrameCount(<[In]> pIWICDecoder As IntPtr,
    31. <Out> ByRef pCount As Integer) As Integer
    32. End Function
    33. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapDecoder_GetFrame_Proxy")>
    34. Private Shared Function GetFrame(<[In]> pIWICDecoder As IntPtr,
    35. <[In]> index As Integer,
    36. <Out> ByRef ppIBitmapFrame As IntPtr) As Integer
    37. End Function
    38. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapSource_GetSize_Proxy")>
    39. Private Shared Function GetSize(<[In]> pIWICBitmapSource As IntPtr,
    40. <Out> ByRef puiWidth As Integer,
    41. <Out> ByRef puiHeight As Integer) As Integer
    42. End Function
    43. <DllImport("windowscodecs.dll", EntryPoint:="WICConvertBitmapSource")>
    44. Private Shared Function ConvertBitmapSource(<[In]> ByRef dstFormat As Guid,
    45. <[In]> pISrc As IntPtr,
    46. <Out> ByRef ppIDst As IntPtr) As Integer
    47. End Function
    48. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapSource_CopyPixels_Proxy")>
    49. Private Shared Function WicCopyPixels(<[In]> pIWICBitmapSource As IntPtr,
    50. <[In]> prc As IntPtr,
    51. <[In]> cbStride As Integer,
    52. <[In]> cbBufferSize As Integer,
    53. <[In]> pbBuffer As IntPtr) As Integer
    54. End Function
    55. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    56. Using Bmp As Bitmap = LoadImage("D:\Programming\VBC\VB_Source_Code_Examples\VB6 and Interfaces\VBC_WIC\VBC_WIC_Demo\Images\heic_files\c013.heic")
    57. If Bmp IsNot Nothing Then PictureBox1.Image = New Bitmap(Bmp)
    58. End Using
    59. End Sub
    60. Private Function LoadImage(ImagePath As String) As Bitmap
    61. Dim Ret As Bitmap = Nothing
    62. Dim pIImagingFactory As IntPtr
    63. If CreateImagingFactory(WINCODEC_SDK_VERSION2, pIImagingFactory) = S_OK Then
    64. Dim pIWICDecoder As IntPtr
    65. If CreateDecoderFromFilename(pIImagingFactory, ImagePath, IntPtr.Zero,
    66. WICAccessOption.GENERIC_READ,
    67. WICDecodeOptions.WICDecodeMetadataCacheOnLoad,
    68. pIWICDecoder) = S_OK Then
    69. Dim FrameCount As Integer
    70. If GetFrameCount(pIWICDecoder, FrameCount) = S_OK Then
    71. If FrameCount > 0 Then
    72. Dim pIWICBitmapFrame As IntPtr
    73. If GetFrame(pIWICDecoder, 0, pIWICBitmapFrame) = S_OK Then
    74. Dim pIWICBitmap As IntPtr
    75. If ConvertBitmapSource(New Guid(GUID_WICPixelFormat32bppBGRA),
    76. pIWICBitmapFrame,
    77. pIWICBitmap) = S_OK Then
    78. Dim Width As Integer
    79. Dim Height As Integer
    80. If GetSize(pIWICBitmap, Width, Height) = S_OK Then
    81. Dim Stride As Integer = Width * 4
    82. Dim Data As Byte() = New Byte((Height * Stride) - 1) {}
    83. Dim hPinnedData As GCHandle = GCHandle.Alloc(Data, GCHandleType.Pinned)
    84. Dim pPinnedData As IntPtr = hPinnedData.AddrOfPinnedObject
    85. If WicCopyPixels(pIWICBitmap, IntPtr.Zero, Stride,
    86. Data.Length, pPinnedData) = S_OK Then
    87. Ret = New Bitmap(Width, Height, Stride,
    88. PixelFormat.Format32bppArgb, pPinnedData)
    89. End If
    90. hPinnedData.Free()
    91. End If
    92. Marshal.Release(pIWICBitmap)
    93. End If
    94. Marshal.Release(pIWICBitmapFrame)
    95. End If
    96. End If
    97. End If
    98. Marshal.Release(pIWICDecoder)
    99. End If
    100. Marshal.Release(pIImagingFactory)
    101. End If
    102. Return Ret
    103. End Function
    104. End Class

    Mfg -Franky-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

    @Peter329 Die leben wahrscheinlich von Werbung, Sponsoren und Großkunden mit erweiterten Zugriffsrechten.
    Kannst Du bitte mal so eine Datei hochladen?
    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!
    @Bluespide Danke.
    Das System erkennt das als Image-Datei und weist ihr das IrfavView-Icon zu.
    @-Franky- Ich hab das mal mit Deinem Preview-Handler und Deinem Code hier probiert, da kam nix bei raus.
    Da muss man wohl doch noch den Codec installieren, das werde ich erst mal nicht tun.
    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!
    Hi. Joa, ohne Codec wird das nichts und der ist ja kostenlos im Windows Store. Es sei den es gibt einen Codec von einem Drittanbieter. Der müsste dann allerdings auch WIC kompatibel sein. Alles andere macht für mich keinen Sinn. Alternativ kann man sich ja auch selbst einen Codec für WIC schreiben. ;)
    Mfg -Franky-

    -Franky- schrieb:

    Alternativ kann man sich ja auch selbst einen Codec für WIC schreiben.
    Dazu fühle ich mich nicht berufen.
    Einst habe ich mal ein Programm geschrieben, mit dem ich spezielle Tiff-Dateien lesen konnte, die von speziellen Mikroskopen generiert wurden.
    Das war für meine Bildverarbeitung. Da ging es auch um 16 BPP Mono-Formate.
    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!

    RodFromGermany schrieb:

    Dazu fühle ich mich nicht berufen.
    Hier gibt es ein einfaches Beispiel wie man sich ein WIC Codec selbst schreiben kann: github.com/ReneSlijkhuis/example-wic-codec Natürlich setzt das auch voraus, das man sich mit der Spezifikation des Dateiformates auseinander setzt. Das letzte mal das ich mich intensiv mit einem Bildformat beschäftigt habe war ein Decoder von TGA zu Bitmap. Das ist aber auch schon wieder gefühlte 100 Jahre her. ;)
    Mfg -Franky-

    Peter329 schrieb:

    ... oder man wird gebeten, die (kostenfreie) HEVC Erweiterung zu installieren... aber eigentlich hab ich keine Lust für so einen Quatsch irgend eine Erweiterung auf meinem PC zu installieren....

    ... Vielleicht gibt es ja eine DLL, die so etwas vermag ...

    Erkennst Du den Wiederspruch in Deiner Aussage? Genau das macht der Codec aus dem Windows Store. Du bekommst darüber eine WIC kompatible DLL. Windows nutzt dann ebenfalls diese DLL um zB. diese Bilder in der Preview anzeigen zu können und Du kannst WIC direkt nutzen um solche Bilder in Deinem Programm zu laden, zu konvertieren usw. ;)
    Mfg -Franky-

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

    Erst mal ganz herlichen Dank an alle für eure Antworten.

    Ich habe versucht Franky's Spoiler aus Post #4 umzusetzen.

    Leider klappt der entscheidende Funktionsaufruf nicht. Ich habe den Code mal mit entsprechenden Debug.Print Anweisungen versehen:

    VB.NET-Quellcode

    1. If GetSize(pIWICBitmap, Width, Height) = S_OK Then
    2. Dim Stride As Integer = Width * 4
    3. Dim Data As Byte() = New Byte((Height * Stride) - 1) {}
    4. Dim hPinnedData As GCHandle = GCHandle.Alloc(Data, GCHandleType.Pinned)
    5. Dim pPinnedData As IntPtr = hPinnedData.AddrOfPinnedObject
    6. Debug.Print("pIWOCBitmap: " & pIWICBitmap.ToString)
    7. Debug.Print("Stride: " & Stride.ToString)
    8. Debug.Print("Data.Length: " & Data.Length.ToString)
    9. Debug.Print("pPinnedData: " & pPinnedData.ToString)
    10. Dim retval = WicCopyPixels(pIWICBitmap, IntPtr.Zero, Stride,
    11. Data.Length, pPinnedData)
    12. Debug.Print("retval: " & retval.ToString)


    Das ist die Ausgabe:

    pIWOCBitmap: 91572032
    Stride: 10416
    Data.Length: 48163584
    pPinnedData: 156045336
    retval: -1072868846

    Die Eingabeparameter sehen ja ganz vernünftig aus.

    Aber der Return Value ist weit von &H0 entfernt ...

    Schade eigentlich ... der Spoiler sieht so vielversprechend aus ... Irgendwelche Ideen was ich falsch mache ?

    LG
    Peter

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

    Peter329 schrieb:

    retval: -1072868846
    Frag mal Frau Google nach hresult=0xC00D5212.
    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!
    Hi. 0xC00D5212 = MF_E_TOPO_CODEC_NOT_FOUND Klingt eher danach das es sich hier um ein Video handelt (MF -> MediaFoundation) und kein Bild.

    @Peter329 Lade doch mal die Datei hier hoch die das Problem verursacht.

    @GPM Im Prinzip verwendet der entsprechende Namespace WIC. Nützt aber einem auch nicht viel wenn kein Codec für das Bildformat vorhanden ist. Bei WIC gibt es ein paar Build-In Codecs learn.microsoft.com/en-us/wind…aging-codec#native-codecs , den Rest muss man nach installieren.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

    Hi GPM.

    Kann sein das Paint.NET entsprechende WIC Codecs mitbringt. Ich kann mich noch dunkel daran erinnern, daß ich mir die Codecs aus dem Store gezogen habe (da war sogar noch der Videocodec, der jetzt 99Cent kostet, kostenlos).

    Ich hatte das ja schon einmal in einem anderen Thread gepostet.
    Auf meinem PC (Win10) kann WIC folgende Bildformate lesen:
    BMP Decoder: *.bmp;*.dib;*.rle
    GIF Decoder: *.gif
    ICO Decoder: *.ico;*.icon
    CUR Decoder: *.cur
    JPEG Decoder: *.jpeg;*.jpe;*.jpg;*.jfif;*.exif
    PNG Decoder: *.png
    TIFF Decoder: *.tiff;*.tif
    DNG Decoder: *.dng
    WMPhoto Decoder: *.wdp;*.jxr
    DDS Decoder: *.dds
    Microsoft HEIF Decoder: *.heic;*.heif;*.hif;*.avci;*.heics;*.heifs;*.avcs;*.avif;*.avifs
    Microsoft Webp Decoder: *.webp
    Microsoft Raw Image Decoder: *.3fr;*.ari;*.arw;*.bay;*.cap;*.cr2;*.cr3;*.crw;*.dcs;*.dcr;*.drf;*.eip;*.erf;*.fff;*.iiq;*.k25;*.kdc;*.mef;*.mos;*.mrw;*.nef;*.nrw;*.orf;*.ori;*.pef;*.ptx;*.pxn;*.raf;*.raw;*.rw2;*.rwl;*.sr2;*.srf;*.srw;*.x3f;*.dng
    Microsoft Camera Raw Decoder: *.arw;*.cr2;*.crw;*.erf;*.kdc;*.mrw;*.nef;*.nrw;*.orf;*.pef;*.raf;*.raw;*.rw2;*.rwl;*.sr2;*.srw;*.dng

    Und folgende schreiben:
    BMP Encoder: *.bmp;*.dib;*.rle
    GIF Encoder: *.gif
    JPEG Encoder: *.jpeg;*.jpe;*.jpg;*.jfif;*.exif
    PNG Encoder: *.png
    TIFF Encoder: *.tiff;*.tif
    WMPhoto Encoder: *.wdp;*.jxr
    DDS Encoder: *.dds
    Microsoft HEIF Encoder: *.heic;*.heif;*.hif

    Edit: Aha, steht sogar auf der MS Store Seite: Bilder, die in HEIF-Dateien mit der Dateierweiterung „.heic“ gespeichert sind, werden mit dem HEVC-Format komprimiert. Für diese Dateien muss außerdem das Paket mit den HEVC-Videoerweiterungen installiert sein. Wenn das Paket mit den HEVC-Videoerweiterungen nicht installiert ist, kann die HEIF-Bilderweiterung keine HEIC-Dateien lesen oder schreiben.

    Also man braucht zusätzlich zum Bildcodec, auch den Videocodec. Deswegen wohl auch der Errorcode, der auf die MediaFoundation schließen lässt.

    Edit2: Die HEVC Video Extensions kostet jetzt 99Cent. Wie geschrieben, die gab es auch mal kostenlos und hieß da noch "HEVC Video Extensions from Device Manufacturer". Nur die findet man im Store nicht mehr. Aber wer eine Suchmaschine seines Vertrauens bedienen kann, findet das Paket auch heute noch. zb auf archive.org. ;)
    Mfg -Franky-

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

    ok ... hier ist das Bildchen ... yellow mangos ... eine besondere Spezilaität auf den Phils ... :)

    [edit]

    sorry ... ich kriege die Meldung, dass .heic eine ungültige Dateiendung ist ... ich fürchte, ich kann die Datei hier nicht hochladen.

    Aber ich hab wenigstens die via heicjpeg.com als .jpg konvertierte Datei angehängt. Also nach einem Video sieht mir das nicht aus ....

    LG
    Peter
    Bilder
    • 20240602_161500.jpg

      2,9 MB, 2.604×4.624, 70 mal angesehen

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

    @Peter329 Siehe meine zwei Edits unten auf den langen Post von mir. Dann dürfte auch klar sein warum mein Code bei Dir fehlschlägt. Dir fehlt halt neben dem Bildcodec noch zusätzlich der Videocodec. War mir auch nicht mehr in Erinnerung da bei mir entsprechende Codecs vorhanden sind.
    Mfg -Franky-
    Ok ... ich denke ich habe das verstanden ... und jetzt versuche ich noch "High Efficiency Video Coding (HEVC)"zu installieren.

    Das Dingens kostet 0,99$ ... es gibt aber auch eine kostenfreie OEM Version. Beim Versuch das mit Download auf meinen PC zu bekommen erhalte ich (in beiden Versionen) die Fehlermeldung, dass irgendeine App fehtl. (s. Anhang)

    Wenn ich mich an meinen Microsoft Account anmelde, komme ich etwas weiter ... aber ich erhalte die Fehlermedlung, dass mein Gerät diese App nicht unterstützt (mein Gerät ist ein PC unter Windows 10).

    Ich verwende solche Downloads nur in Ausnahmefällen und bin deshalb furchtbar unerfahren. Kann mir jemand (nachsichtig) sagen, was ich falsch mache?

    LG
    Peter

    [edit]

    Ich hab das unter Firefox und Edge probiert und auch die Systemvoraussetzungen geprüft (mW. müssten die in Ordnung sein).
    Bilder
    • s 2024-06-09 08-47-271.jpg

      64,03 kB, 1.343×445, 64 mal angesehen
    • s 2024-06-09 08-54-514.jpg

      104,55 kB, 1.172×887, 70 mal angesehen

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