Bild in Picturebox laden als Thread

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

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    xX-Nick-Xx schrieb:

    Aber das .GIF (jetzt als Beispiel) soll halt weiter Funktionieren.
    Es gibt 3 Sorten von GIF-Dateien in .NET:
    Die, die laufen,
    die, die einen GIF-Animator benötigen, um zu laufen
    und die, die nicht laufen.
    Was ist Deine GIF für eine?
    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!
    @xX-Nick-XxnullDu könntest das laden der DDS, bzw auch anderer Bildformate die WIC unterstützt, etwas beschleunigen. Zum einen musst Du ja nicht jedesmal WIC starten/beenden wenn Du ein Bild laden möchtest. Es reicht wenn Du WIC einmal beim Start der MainForm initialisierst bzw im Closing beendest. WIC steht nach Initialisierung Programmweit zur Verfügung. Du könntest auch die APIs CreateFormatConverter und InitializeFormatConverter durch die API WICConvertBitmapSource ersetzen. Die ersten beiden APIs braucht man nur wenn man Pixelformatmäßig downgraden (32bpp -> 8bpp) möchte da man hier noch ein Ditherformat und Palettetype für die Konvertierung angeben kann. Bei der anderen API entfällt entsprechende Optimierung beim konvertieren was schneller sein dürfte. Evtl ist das erstellen der .NET-Bitmap aus dem ByteArray etwas schneller wenn Du das ByteArray direkt bei New Bitmap an Scan0 übergibst anstelle das ByteArray über LockBits/UnlockBits an Scan0 zu kopieren. Das alles könnte evtl. noch mal ein paar Millisekunden pro Bild herauskitzeln.

    Edit: Hab mal meinen ursprünglichen Code etwas umgebaut. Kannst ja mal mit einer StopWatch messen ob dieser etwas schneller ist als der alte Code.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.ComponentModel
    4. Imports System.Drawing.Imaging
    5. Imports System.Runtime.InteropServices
    6. Public Class Form1
    7. Private Const S_OK As Integer = &H0
    8. Private Const WINCODEC_SDK_VERSION2 As Integer = &H237
    9. Private GUID_WICPixelFormat32bppBGRA As Guid = New Guid("{6fddc324-4e03-4bfe-b185-3d77768dc90f}")
    10. Private Enum WICAccessOption As Integer
    11. GENERIC_READ = &H80000000
    12. GENERIC_WRITE = &H40000000
    13. End Enum
    14. Private Enum WICDecodeOptions As Integer
    15. WICDecodeMetadataCacheOnDemand = &H0
    16. WICDecodeMetadataCacheOnLoad = &H1
    17. End Enum
    18. <DllImport("windowscodecs.dll", EntryPoint:="WICCreateImagingFactory_Proxy")>
    19. Private Shared Function CreateImagingFactory(
    20. <[In]> ByVal SDKVersion As Integer,
    21. <Out> ByRef ppIImagingFactory As IntPtr) As Integer
    22. End Function
    23. <DllImport("windowscodecs.dll", EntryPoint:="IWICImagingFactory_CreateDecoderFromFilename_Proxy")>
    24. Private Shared Function CreateDecoderFromFilename(
    25. <[In]> ByVal pFactory As IntPtr,
    26. <[In]> <MarshalAs(UnmanagedType.LPWStr)> ByVal wzFilename As String,
    27. <[In]> ByVal pguidVendor As IntPtr,
    28. <[In]> ByVal dwDesiredAccess As WICAccessOption,
    29. <[In]> ByVal metadataOptions As WICDecodeOptions,
    30. <Out> ByRef ppIDecoder As IntPtr) As Integer
    31. End Function
    32. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapDecoder_GetFrameCount_Proxy")>
    33. Private Shared Function GetFrameCount(
    34. <[In]> ByVal pIWICDecoder As IntPtr,
    35. <Out> ByRef pCount As Integer) As Integer
    36. End Function
    37. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapDecoder_GetFrame_Proxy")>
    38. Private Shared Function GetFrame(
    39. <[In]> ByVal pIWICDecoder As IntPtr,
    40. <[In]> ByVal index As Integer,
    41. <Out> ByRef ppIBitmapFrame As IntPtr) As Integer
    42. End Function
    43. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapSource_GetSize_Proxy")>
    44. Private Shared Function GetSize(
    45. <[In]> ByVal pIWICBitmapSource As IntPtr,
    46. <Out> ByRef puiWidth As Integer,
    47. <Out> ByRef puiHeight As Integer) As Integer
    48. End Function
    49. <DllImport("windowscodecs.dll", EntryPoint:="WICConvertBitmapSource")>
    50. Private Shared Function ConvertBitmapSource(
    51. <[In]> ByRef dstFormat As Guid,
    52. <[In]> ByVal pISrc As IntPtr,
    53. <Out> ByRef ppIDst As IntPtr) As Integer
    54. End Function
    55. <DllImport("windowscodecs.dll", EntryPoint:="IWICBitmapSource_CopyPixels_Proxy")>
    56. Private Shared Function WicCopyPixels(
    57. <[In]> ByVal pIWICBitmapSource As IntPtr,
    58. <[In]> ByVal prc As IntPtr,
    59. <[In]> ByVal cbStride As Integer,
    60. <[In]> ByVal cbBufferSize As Integer,
    61. <Out> ByVal pbBuffer As IntPtr) As Integer
    62. End Function
    63. Private m_WICInit As Boolean = False
    64. Private m_pIImagingFactory As IntPtr = IntPtr.Zero
    65. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    66. ' WIC starten
    67. If CreateImagingFactory(WINCODEC_SDK_VERSION2, m_pIImagingFactory) = S_OK Then
    68. m_WICInit = True
    69. End If
    70. End Sub
    71. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    72. ' ist WIC initialisiert?
    73. If m_WICInit = True Then
    74. ' WIC beenden
    75. Marshal.Release(m_pIImagingFactory)
    76. End If
    77. End Sub
    78. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    79. Dim strImage As String = "D:\Downloads\VBC_Prog\VBC_WIC\VBC_WIC_ImageLoader\test.dds"
    80. PictureBox1.Image = LoadImage(strImage)
    81. End Sub
    82. Private Function LoadImage(ByVal sImagePath As String) As Bitmap
    83. Dim intWidth As Integer = 0
    84. Dim intHeight As Integer = 0
    85. Dim intFrameCount As Integer = 0
    86. Dim pIWICBitmap As IntPtr = IntPtr.Zero
    87. Dim pIWICDecoder As IntPtr = IntPtr.Zero
    88. Dim pIWICBitmapFrame As IntPtr = IntPtr.Zero
    89. Dim bmp As Bitmap = Nothing
    90. Dim arrData As Byte() = New Byte() {}
    91. ' ist WIC initialisiert?
    92. If m_WICInit = True Then
    93. ' einen Decoder vom Bild erstellen
    94. If CreateDecoderFromFilename(m_pIImagingFactory, sImagePath, IntPtr.Zero,
    95. WICAccessOption.GENERIC_READ,
    96. WICDecodeOptions.WICDecodeMetadataCacheOnLoad,
    97. pIWICDecoder) = S_OK Then
    98. ' Anzahl der Frames ermitteln
    99. If GetFrameCount(pIWICDecoder, intFrameCount) = S_OK Then
    100. ' mindestens ein Frame vorhanden?
    101. If intFrameCount > 0 Then
    102. ' erstes Frame laden
    103. If GetFrame(pIWICDecoder, 0, pIWICBitmapFrame) = S_OK Then
    104. ' Frame in das 32bppBGRA PixelFormat konvertieren
    105. If ConvertBitmapSource(GUID_WICPixelFormat32bppBGRA, pIWICBitmapFrame,
    106. pIWICBitmap) = S_OK Then
    107. If GetSize(pIWICBitmap, intWidth, intHeight) = S_OK Then
    108. ' Stride berechnen
    109. Dim intStride As Integer = intWidth * 4
    110. ' ByteArray entsprechend redimensionieren
    111. Array.Resize(arrData, intHeight * intStride)
    112. ' ByteArray pinnen
    113. Dim hPinnedData As GCHandle = GCHandle.Alloc(arrData, GCHandleType.Pinned)
    114. ' Pointer von gepinnten ByteArray
    115. Dim pPinnedData As IntPtr = hPinnedData.AddrOfPinnedObject
    116. ' Pixeldaten vom WIC-Bitmap in das ByteArray kopieren
    117. If WicCopyPixels(pIWICBitmap, IntPtr.Zero, intStride,
    118. arrData.Length, pPinnedData) = S_OK Then
    119. ' neues Bitmap vom ByteArray in gleicher Größe und Pixelformat
    120. ' wie das WIC-Bitmap erstellen
    121. bmp = New Bitmap(intWidth, intHeight, intStride,
    122. PixelFormat.Format32bppArgb, pPinnedData)
    123. End If
    124. ' ByteArray unpinnen
    125. hPinnedData.Free()
    126. End If
    127. ' WIC-Bitmap löschen
    128. Marshal.Release(pIWICBitmap)
    129. End If
    130. ' geladenes Frame löschen
    131. Marshal.Release(pIWICBitmapFrame)
    132. End If
    133. End If
    134. End If
    135. ' Decoder löschen
    136. Marshal.Release(pIWICDecoder)
    137. End If
    138. End If
    139. Return bmp
    140. End Function
    141. End Class

    Mfg -Franky-

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

    Vieleicht versuchtst Du einen ganz anderen Ansatz.
    Du könnstest alle Bilder in interne Variablen laden und während diesen Ladens einfach eine Statusanzeige zeigen.
    Wenn die Bilder alle im Speicher sind, dann kannst Du die Form laden und befüllst direkt aus dem Ram-Speicher.
    Somit entfällt die "Hauptbremse", das Laden von der Platte.

    Ich habe mir gerade auch noch das Video angesehen.
    Ich denke, dass nicht nur das Laden von der Platte so viele Zeit in Anspruch nimmt, sondern das Positionieren am Control.
    Listboxen mit vielen Fotos kann schon seeeeehr langsam werden.
    Ich befülle die Listboxen mit Grafiken und der User sieht dabei einen Fortschrittsbalken und nach jeder Zeile wird das Listbox aktualisiert.
    Das dauert zwar insgesamt 1-2 Sekunden länger, aber da der User sieht "es tut sich was" ist es gefühlt für den User "schneller".
    Bilder
    • rm2th.jpg

      348,9 kB, 2.234×1.480, 48 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    Ich muss den Thread doch nochmal wieder Eröffnen da sich mit der Funktion von @-Franky- ein Problem ergeben hat

    und zwar lässt sich alles ohne Problem laden im Spiel 1

    aber bei Spiel 2 bekomme ich einen Fehler von der Funktion, und ich hab keine Ahnung wieso oder weshalb...

    evtl. kannst du mir ja Helfen @-Franky- oder ein anderer.

    Aktuelle Funktion

    VB.NET-Quellcode

    1. Function LoadDDSX(ByVal DDSPath As String) As Bitmap '<- Hier soll die Zuständige Picturebox Zugewiesen werden
    2. Dim strPicture As String = DDSPath
    3. Dim intWidth As Integer = 0
    4. Dim intHeight As Integer = 0
    5. Dim intBuffSize As Integer = 0
    6. Dim intFrameCount As Integer = 0
    7. Dim tWICRect As WICRect = New WICRect
    8. Dim pIWICLock As IntPtr = IntPtr.Zero
    9. Dim pIWICBitmap As IntPtr = IntPtr.Zero
    10. Dim pIWICDecoder As IntPtr = IntPtr.Zero
    11. Dim pIImagingFactory As IntPtr = IntPtr.Zero
    12. Dim pIWICBitmapFrame As IntPtr = IntPtr.Zero
    13. Dim pIWICFormatConverter As IntPtr = IntPtr.Zero
    14. Dim pData As IntPtr = IntPtr.Zero
    15. Dim bmp As Bitmap = Nothing
    16. ' WIC starten
    17. If CreateImagingFactory(WINCODEC_SDK_VERSION2, pIImagingFactory) = S_OK Then
    18. ' ein Decoder vom Bild erstellen
    19. If CreateDecoderFromFilename(pIImagingFactory, strPicture, IntPtr.Zero,
    20. WICAccessOption.GENERIC_READ,
    21. WICDecodeOptions.WICDecodeMetadataCacheOnLoad,
    22. pIWICDecoder) = S_OK Then
    23. ' Anzahl der Frames ermitteln
    24. If GetFrameCount(pIWICDecoder, intFrameCount) = S_OK Then
    25. ' mindestens ein Frame vorhanden?
    26. If intFrameCount > 0 Then
    27. ' erstes Frame laden
    28. If GetFrame(pIWICDecoder, 0, pIWICBitmapFrame) = S_OK Then
    29. ' ein FormatConverter erstellen
    30. If CreateFormatConverter(pIImagingFactory, pIWICFormatConverter) = S_OK Then
    31. ' FormatConverter initialisieren -> PixelFormat32bppBGRA
    32. If InitializeFormatConverter(pIWICFormatConverter, pIWICBitmapFrame,
    33. GUID_WICPixelFormat32bppBGRA,
    34. WICBitmapDitherType.WICBitmapDitherTypeNone,
    35. IntPtr.Zero, 0,
    36. WICBitmapPaletteType.WICBitmapPaletteTypeMedianCut) = S_OK Then
    37. ' ein WIC-Bitmap vom FormatConverter erstellen
    38. If CreateBitmapFromSource(pIImagingFactory, pIWICFormatConverter,
    39. WICBitmapCreateCacheOption.WICBitmapCacheOnLoad, pIWICBitmap) = S_OK Then
    40. ' Dimensionen der WIC-Bitmap ermitteln
    41. If GetSize(pIWICBitmap, intWidth, intHeight) = S_OK Then
    42. With tWICRect
    43. .X = 0
    44. .Y = 0
    45. .Width = intWidth
    46. .Height = intHeight
    47. End With
    48. ' WIC-Bitmap zum auslesen der Pixeldaten sperren
    49. If WicLockBits(pIWICBitmap, tWICRect, WICBitmapLockFlags.WICBitmapLockRead, pIWICLock) = S_OK Then
    50. ' Pointer auf die Pixeldaten und Größe der Pixeldaten ermitteln
    51. If GetDataPointer(pIWICLock, intBuffSize, pData) = S_OK Then
    52. ' entsprechend ein ByteArray dimensionieren
    53. Dim arrData As Byte() = New Byte(intBuffSize - 1) {}
    54. ' Pixeldaten vom Pointer in das ByteArray kopieren
    55. Marshal.Copy(pData, arrData, 0, intBuffSize)
    56. ' neues Bitmap in gleicher Größe und Pixelformat wie das WIC-Bitmap erstellen
    57. bmp = New Bitmap(intWidth, intHeight, PixelFormat.Format32bppArgb)
    58. ' Bitmap zum schreiben der Pixeldaten sperren
    59. Dim bmpdata As BitmapData = bmp.LockBits(New Rectangle(0, 0, intWidth, intHeight),
    60. ImageLockMode.WriteOnly, bmp.PixelFormat)
    61. ' Pixeldaten aus dem ByteArray in das Bitmap schreiben
    62. Marshal.Copy(arrData, 0, bmpdata.Scan0, intBuffSize)
    63. ' Sperre der Bitmap aufheben
    64. bmp.UnlockBits(bmpdata)
    65. ' Bild ausgeben
    66. 'For Each C As Panel In FlowLayoutPanel1.Controls
    67. ' For Each TB As Control In C.Controls
    68. ' If TB.GetType() Is GetType(PictureBox) Then
    69. ' TB.Name = bmp
    70. ' End If
    71. ' Next
    72. 'Next
    73. 'For Each C As Panel In FlowLayoutPanel1.Controls
    74. ' For Each TB As Control In C.Controls
    75. ' If TB.GetType() Is GetType(PictureBox) Then
    76. ' TB.BackgroundImage = bmp
    77. ' End If
    78. ' Next
    79. 'Next
    80. End If
    81. ' Sperre der WIC-Bitmap aufheben
    82. Marshal.Release(pIWICLock)
    83. End If
    84. End If
    85. ' WIC-Bitmap löschen
    86. Marshal.Release(pIWICBitmap)
    87. End If
    88. ' FormatConverter löschen
    89. Marshal.Release(pIWICFormatConverter)
    90. End If
    91. End If
    92. ' geladenes Frame löschen
    93. Marshal.Release(pIWICBitmapFrame)
    94. End If
    95. End If
    96. End If
    97. ' Decoder löschen
    98. Marshal.Release(pIWICDecoder)
    99. End If
    100. ' WIC beenden
    101. Marshal.Release(pIImagingFactory)
    102. End If
    103. ' Next
    104. Return bmp
    105. End Function


    im Anhang habe ich eine Zip Hinzugefügt mit 2 DDS Dateien dabei lässt sich "canload" laden aber "cannotload" lässt sich nicht Laden.

    Aufruf

    VB.NET-Quellcode

    1. Dim bt As Bitmap = LoadDDSUX.LoadDDSX("C:\Users\nico9\Desktop\store_manureDirector14.dds")
    2. PictureBox9.Image = New Bitmap(bt)


    Fehlermeldung bei "cannotload": System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Danke im voraus
    Dateien
    • ddsload.zip

      (91,42 kB, 35 mal heruntergeladen, zuletzt: )

    @xX-Nick-Xx Das ist leider korrekt.
    canload.dds wird vom IrfanView geladen, cannotload.dds nicht:

    Ich frage mich, warum Du diesen Test nicht selbst gemacht hast.
    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

    Ich komme gerade nicht zum testen. Aber was ich sagen kann, es liegt nicht an der Funktion zum Laden der DDS. Die Funktion gibt stumpf ein Bitmap-Objekt zurück. Du prüfst aber nicht ob das Bitmap-Objekt <> Nothing ist bevor du die Bitmap der PB per New Bitmap zuweist. Du könntest auch die Funktion umbauen und zwar so das die Funktion ein Boolean zurück gibt und die Bitmap per ByRef Parameter.

    Wie auch immer. Wenn die Funktion ein Bitmap = Nothing zurück gibt, dann ist entweder die DDS defekt oder es ist eine valide DDS die von WIC nicht decodiert werden kann.

    Ich hatte Dir doch mal in einem anderen Thread eine etwas bessere Funktion zu laden von DDS Bilder gepostet. Die behebt zwar auch nicht das Problem, war aber etwas übersichtlicher und kürzer.

    Edit: Ach ich sehe grade das der etwas bessere Code ja auch hier in diesem Thread ist.
    Mfg -Franky-

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

    xX-Nick-Xx schrieb:

    Lässt sich das irgendwie beheben?
    Woher kommt denn das (Nicht-)Bild?
    ====
    Die Header unterscheiden sich ein wenig, aber mir ist das Format nicht geläufig:
    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!

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

    Hi

    Vllt kommt man ja hiermit weiter: docs.microsoft.com/de-de/windo…2/wic/dds-format-overview

    Im speziellen -> Pixelformatunterstützung und dann schaust Du hier: docs.microsoft.com/de-de/windo…32/direct3ddds/dds-header wie der Header einer DDS Aufgebaut ist. Evtl wird ja für die DDS ein PixelFormat verwendet das vom WIC Deoder nicht unterstützt wird.
    Mfg -Franky-

    -Franky- schrieb:

    Im speziellen -> Pixelformatunterstützung und dann schaust Du hier: docs.microsoft.com/de-de/windo…32/direct3ddds/dds-header wie der Header einer DDS Aufgebaut ist. Evtl wird ja für die DDS ein PixelFormat verwendet das vom WIC Deoder nicht unterstützt wird.

    schau ich mir morgen mal an, Danke

    Kannst du den "Etwas Besseren Code" nochmal Verlinken?

    Hi

    Hab mal etwas recherchiert. Falls der Aufruf von CreateDecoderFromFilename noch S_OK sein sollte, dann könnte man von pIWICDecoder per QueryInterface ein Interface IWICDdsDecoder erstellen. IWICDdsDecoder hat eine Funktion GetParameters mit der man eine Structure WICDdsParameters befüllen lassen kann. Diese Structure hat einen Member DxgiFormat -> Enum DXGI_FORMAT. Darüber sollte sich feststellen lassen welches PixelFormat die DDS hat. Nur so eine Idee falls die DDS ein PixelFormat enthält das von WIC für DDS nicht unterstützt wird.
    Mfg -Franky-

    -Franky- schrieb:

    Hab mal etwas recherchiert. Falls der Aufruf von CreateDecoderFromFilename noch S_OK sein sollte, dann könnte man von pIWICDecoder per QueryInterface ein Interface IWICDdsDecoder erstellen. IWICDdsDecoder hat eine Funktion GetParameters mit der man eine Structure WICDdsParameters befüllen lassen kann. Diese Structure hat einen Member DxgiFormat -> Enum DXGI_FORMAT. Darüber sollte sich feststellen lassen welches PixelFormat die DDS hat. Nur so eine Idee falls die DDS ein PixelFormat enthält das von WIC für DDS nicht unterstützt wird.


    Ähm... Ich Versteh nur Bahnhof xD
    Ich würde mich um deine Hilfe dabei doch sehr Freuen, da du dich doch sehr gut in dem Bereich auskennst @-Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xX-Nick-Xx“ ()

    xX-Nick-Xx schrieb:

    Ähm... Ich Versteh nur Bahnhof xD

    Da bist Du nicht der einzige wenn ich schreibe verwende dieses oder jenes COM Interface. ;)

    Bevor ich da was zusammen bastel, müsstest Du folgende Hausaufgabe machen. Gibt die API CreateDecoderFromFilename noch ein S_OK zurück? Denn wenn nicht, brauchen wir nicht weiter machen da ein QueryInterface auf pIWICDecoder dann auch nicht aufgerufen werden kann.

    Und selbst wenn CreateDecoderFromFilename ein S_Ok zurück gibt, erfährst Du maximal ein paar Info zur DDS wie das PixelFormat und anderes. Laden lässt sich die cannotload.dds dennoch nicht weil vermutlich dann nachfolgende APIs fehlschlagen weil die DDS entweder defekt oder ein nicht von WIC unterstütztes DDS Format ist.

    Nur mal so eine Frage am Rande. Warum verwendest Du das DDS Format?
    Mfg -Franky-

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

    -Franky- schrieb:

    Nur mal so eine Frage am Rande. Warum verwendest Du das DDS Format?

    Das DDS Format wird vom Spiel "Farming Simulator 22" Verwendet, deswegen doof :D
    Bei "Farming Simulator 19" hat alles Funktioniert, aber in der 22er Version wird jetzt wohl irgendwie DX 10 Verwendet (siehe Bild in Picturebox laden als Thread )

    Laut Google soll S_OK wohl Funktionieren
    Link (Ist C)
    Link 2

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xX-Nick-Xx“ ()

    Hi

    xX-Nick-Xx schrieb:

    Laut Google soll S_OK wohl Funktionieren

    Öhm. Klar kann die API S_OK zurück geben. Die Frage war, macht sie das auch bei der cannotload.dds. Nööö, macht sie nicht. Die API gibt einen Errorcode 0x88982F61 (WINCODEC_ERR_BADHEADER) zurück. Hätte man ganz leicht testen können.

    VB.NET-Quellcode

    1. Debug.Print("0x" & CreateDecoderFromFilename(pIImagingFactory, sImagePath, IntPtr.Zero,
    2. WICAccessOption.GENERIC_READ,
    3. WICDecodeOptions.WICDecodeMetadataCacheOnLoad,
    4. pIWICDecoder).ToString("X2"))

    Von daher gibt es "derzeit" keine Chance diese DDS per WIC zu laden oder ich weis nicht das es da noch andere Möglichkeiten gibt. Im übrigen ist diese cannotload.dds ein grüner Traktor auf transparentem Hintergrund. ;) Diese DDS habe ich mit Paint.NET laden können, und diese wieder als DDS (BC1 (Linear, DXT1)) gespeichert und dann klappt das auch wieder mit WIC.

    Fazit: Es ist eine valide DDS die WIC derzeit nicht decodieren kann. Evtl. gibt es ja hier ein paar Spezialisten die Dir sagen können wie man so eine DDS mit DirectX lädt oder wie Paint.NET so eine DDS laden kann.
    Mfg -Franky-