Bilder in ImageList mit richtigem Seitenverhältnis darstellen?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Lümmel.

    Bilder in ImageList mit richtigem Seitenverhältnis darstellen?

    Guten Abend! Und danke für dieses schöne Forum. Ich schreibe jetzt seit einer Woche VB-Code und habe unendlich viele Tipps hier gefunden. Nun zu meinem Problem:

    Ich habe ein Programm geschrieben, dass mir Bilder in einer ListView zusammen mit einigen Details der Bilder auflistet. Die Details (Stichwörter, Bewertung) können im Programm geändert werden.

    Die Bilder werden als SmallImageList während der Laufzeit eingebunden. Hierbei habe ich das folgende Problem:

    Da es Fotos sind, haben die ein anderes Seitenverhältnis als 1:1. Gibt es eine Möglichkeit, das Seitenverhältnis der einzelnen Bilder (kann unterschiedlich sein) in der Liste beizubehalten? Bisher werden alle Bilder quadratisch angezeigt.

    Quellcode

    1. Private Sub Fill_ListView()
    2. Dim lstv As New ListViewItem
    3. Dim Filename As String = System.IO.Path.GetFileName(pfad)
    4. Dim ShellIcon As New ShellThumbnail.ShellThumbnail
    5. Dim ShellBitmap As Bitmap = ShellIcon.GetThumbnail(pfad)
    6. ImageList1.Images.Add(picnr, ShellBitmap)
    7. ListView1.SmallImageList = ImageList1
    8. Exiv2VB.StartInfo.FileName = "exiv2.exe"
    9. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.dc.subject -g Iptc.Application2.Keywords " + AZ + pfad + AZ
    10. Exiv2VB.StartInfo.RedirectStandardOutput = True
    11. Exiv2VB.StartInfo.UseShellExecute = False
    12. Exiv2VB.StartInfo.CreateNoWindow = True
    13. Exiv2VB.Start()
    14. Dim ParseResultKey As String = Exiv2VB.StandardOutput.ReadToEnd
    15. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.xmp.Rating " + AZ + pfad + AZ
    16. Exiv2VB.StartInfo.RedirectStandardOutput = True
    17. Exiv2VB.StartInfo.UseShellExecute = False
    18. Exiv2VB.StartInfo.CreateNoWindow = True
    19. Exiv2VB.Start()
    20. Dim ParseResultStar As String = Exiv2VB.StandardOutput.ReadToEnd
    21. Dim sPath As String = IO.Path.GetDirectoryName(pfad)
    22. Dim SPD As String
    23. If My.Computer.FileSystem.FileExists(sPath + "\SILKYPIX_DS\" + Filename + ".4.spd") Then
    24. SPD = "entwickelt"
    25. Else : SPD = "nicht entwickelt"
    26. End If
    27. Dim item As New ListViewItem
    28. item.Text = Filename
    29. item.Tag = pfad
    30. item.ImageKey = picnr
    31. With ListView1.Items.Add(item)
    32. .SubItems.Add(ParseResultKey)
    33. .SubItems.Add(ParseResultStar)
    34. .SubItems.Add(SPD)
    35. End With
    36. picnr = picnr + 1
    37. args &= arg & " "
    38. ExifToolVB.Close()
    39. End Sub
    Deine Lösung basiert , - soweit ich es nachvollziehen kann, auf der command-Line Lösung von Exiv2 (C++). Der Code ist zwar eine bemerkenswerte Leistung für einen Newcomer, allerdings ist das Einbinden per CommandLine-Extraction eher suboptimal. Vielleicht solltest Du eher eine echte .NET Library bevorzugen die man direct ohne Umwege ansprechen kann. Lt. Google wäre vielleicht die ExifLib eine Lösung.

    Um auf Deine Frage zurückzukommen: hinter jedem Image steht eine Bitmap: das Zoomen von Bitmaps geht am Einfachsten über GDI, siehe hier: Zoom an image in VB.NET

    Entweder Du definierst ein Rectangle und passt Dein Image dort rein oder Du definierst einen Zoom-Factor und wendest den im Beispiel vorgegeben Code an.

    Gruss Kangaroo

    P.S: achja - und Willkommen im Forum ;)
    Danke für die Blumen :) . Ja, der Code ruft Exiv2 auf, aber nur um die Stichwörter und das Rating aus den Bilder zu holen. Die von dir genannte DLL kann das auch, aber nur für Bitmaps, nicht für DNG, deswegen brauche ich Exiv2. Es gibt davon auch eine Exiv2NETdll, aber die ist von 2008 und wird nicht mehr gewartet. Und .NET selbst kann offenbar zwar Tags aus Jpeg und Tiff lesen, aber eben nicht aus DNG.

    Vielen herzlichen Dank für den Tipp mit dem Skalieren, da hatte ich noch gar nicht dran gedacht. Das Skalieren selbst funktioniert mit der Funktion jetzt auch, aber im ListView ist das Bild immer noch quadratisch ;(. Das muss irgendwo an dem ListView liegen.

    Quellcode

    1. Public Shared Function Image_Resize(ByVal img As Image) As Image Dim scale As Double If img.Width >= img.Height Then scale = img.Width / 120 Else scale = img.Height / 120 End If Dim New_Width As Integer = img.Width / scale Dim New_Height As Integer = img.Height / scale Dim New_Image As New System.Drawing.Bitmap(img, New_Width, New_Height) Dim converted As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(New_Image) converted.InterpolationMode = InterpolationMode.HighQualityBicubic Return New_Image
    2. End Function


    Quellcode

    1. Private Sub Fill_ListView() Dim lstv As New ListViewItem Dim Filename As String = System.IO.Path.GetFileName(pfad) Dim iSource As ImageSource = ThumbnailGenerator.GenerateThumbnail(pfad) Dim original As Image = ThumbnailGenerator.BitmapSourceToBitmap(iSource) Dim resized As Image = Image_Resize(original) MsgBox(resized.Width) MsgBox(resized.Height)
    2. ImageList1.Images.Add(picnr, resized) ListView1.LargeImageList = ImageList1 Exiv2VB.StartInfo.FileName = "exiv2.exe" Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.dc.subject -g Iptc.Application2.Keywords " + AZ + pfad + AZ Exiv2VB.StartInfo.RedirectStandardOutput = True Exiv2VB.StartInfo.UseShellExecute = False Exiv2VB.StartInfo.CreateNoWindow = True Exiv2VB.Start() Dim ParseResultKey As String = Exiv2VB.StandardOutput.ReadToEnd Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.xmp.Rating " + AZ + pfad + AZ Exiv2VB.StartInfo.RedirectStandardOutput = True Exiv2VB.StartInfo.UseShellExecute = False Exiv2VB.StartInfo.CreateNoWindow = True Exiv2VB.Start() Dim ParseResultStar As String = Exiv2VB.StandardOutput.ReadToEnd Dim sPath As String = IO.Path.GetDirectoryName(pfad) Dim SPD As String If My.Computer.FileSystem.FileExists(sPath + "\SILKYPIX_DS\" + Filename + ".4.spd") Then SPD = "entwickelt" Else : SPD = "nicht entwickelt" End If Dim item As New ListViewItem item.Text = Filename item.Tag = pfad item.ImageKey = picnr With ListView1.Items.Add(item) .SubItems.Add(ParseResultKey) .SubItems.Add(ParseResultStar) .SubItems.Add(SPD) End With picnr = picnr + 1 args &= arg & " " ExifToolVB.Close() End Sub

    Das mit dem Rectangle habe ich leider nicht verstanden. Hast du dazu ein paar mehr Informationen? Ist das als Rahmen gedacht?

    Vielen Dank für die Hilfe!

    Lümmel
    Ich hab jetzt noch mal schnell ins Forum geschaut: ich befürchte ich weiss immer noch nicht genau wo Deine Probleme liegen, aber werde wohl auch wg. akuten Zeit- (und Schlaf)mangel nicht dazu kommen mir das näher anzusehen (selbst wenn Du es schaffen solltest Deinen Code untereinander statt nebeneinander zu stellen - Chrome ?).

    Daher nur aus Helikoptersicht: wenn ich es richtig verstehe möchtest Du Dir Deine Imagesvon der Festplatte samt Exif Daten in ein ListView Control laden.

    Die ImageList hat eine Property ImageSize mit der Du die DefaultGrösse aller Images einstellen kann. Leider hat sie auch die dumme Angewohnheit Bilder beim Laden auf diese ImageSize zu 'stretchen'.

    Daher wirst Du die Bilder vor dem Laden in die Imagelist skalieren müssen, könnte sinngemäss so aussehen (Schreibfehler bitte korrigieren)

    VB.NET-Quellcode

    1. ' imagelist anlegen
    2. Dim il As ImageList = meineImageList
    3. il.Images.Clear()
    4. il.ImageSize = New Size(128, 64)
    5. ' bilder laden
    6. Dim img As Image = Image.FromFile("xxx.jpg")
    7. Dim bmp As New Bitmap(il.ImageSize.Width, il.ImageSize.Height)
    8. ' Bitmap zeichnen und skalieren
    9. Using g As Graphics = Graphics.FromImage(bmp)
    10. ' selber skalieren, positionieren und zeichnen
    11. 'g.DrawImage(img, x, y, Rect)
    12. End Using
    13. ' add
    14. il.Images.Add(bmp)

    -> DrawImage Methode
    Nochmal Danke, der Hinweis auf Rectangel hat es gebracht.

    Das Problem ist, dass in einer ListView im Modus "View" die dort per ImageList eingebrachten Bilder auf Quadrat skaliert werden. Aber wenn ich die BIlder erst im reichtigen Seitenverhältnis auf ein weißes Quadrat zeichne, dann bleibt das Seitenverhältnis erhalten.

    Hiermit funktioniert es:

    Public Shared Function Image_Resize(ByVal img As Image) As Image
    Dim WhiteSpace As System.Drawing.Bitmap
    Dim myGraphics As Graphics
    Dim myDestination As Rectangle
    WhiteSpace = New System.Drawing.Bitmap(120, 120)
    myGraphics = Graphics.FromImage(WhiteSpace)
    Dim scale As Double
    If img.Width >= img.Height Then
    scale = img.Width / 120
    Else
    scale = img.Height / 120
    End If
    Dim New_Width As Integer = img.Width / scale
    Dim New_Height As Integer = img.Height / scale
    myDestination = New Rectangle(x:=0, y:=0, Width:=New_Width, Height:=New_Height)
    myGraphics.DrawImage(image:=img, rect:=myDestination)
    Image_Resize = WhiteSpace
    End Function

    (Ja, Chrome :-/) Beim ersten Post ging es noch...


    Ein frohes Fest wünscht Lümmel

    Lümmel schrieb:

    Hiermit funktioniert es:

    Aha, das 1.Mal dass ich Deinen Code lesen kann ;)

    'Funktionieren' ist immer der 1.Schritt, danach kommen die Verbesserungen, ein paar Vorschläge die Du möglicherweise schon implementiert hast.
    - trenne Daten von der Präsentation: lade Deine Bilddaten in eine Klasse , die aus den Bilddaten + Image besteht (Erben von der Image Klasse ?). Man operiert nie direkt am lebenden Object sprich auf den sperrigen Items in der Listview

    - bei grösseren Bildmengen wird Deine Anzeige ziemlich heftig ruckeln während Du die BildDaten lädst (gerade über CommandLine). Lagere das Laden in einen Thread aus und schmeiss ein Event wenn wieder ein Image fertig ist. Deine GUI fügrt dann die fertige Klasse in Dein Listview ein. Das Skalieren kann ja schon im Thread oder der Klasse erfolgen.

    - ich kann immer noch nicht glauben dass es keine Library für die Extraction des RohDaten - Formats gibt

    Gruss und ebenfalls Schönes Fest

    Kangaroo schrieb:

    'Funktionieren' ist immer der 1.Schritt, danach kommen die Verbesserungen, ein paar Vorschläge die Du möglicherweise schon implementiert hast.
    - trenne Daten von der Präsentation: lade Deine Bilddaten in eine Klasse , die aus den Bilddaten + Image besteht (Erben von der Image Klasse ?). Man operiert nie direkt am lebenden Object sprich auf den sperrigen Items in der Listview

    - bei grösseren Bildmengen wird Deine Anzeige ziemlich heftig ruckeln während Du die BildDaten lädst (gerade über CommandLine). Lagere das Laden in einen Thread aus und schmeiss ein Event wenn wieder ein Image fertig ist. Deine GUI fügrt dann die fertige Klasse in Dein Listview ein. Das Skalieren kann ja schon im Thread oder der Klasse erfolgen.

    - ich kann immer noch nicht glauben dass es keine Library für die Extraction des RohDaten - Formats gibt







    Hmm, hört sich gut an. Ich habe allerdings nur sehr bedingt eine Ahnung von dem, was du vorschlägst :) . Vielleicht zur Erläuterung: Meine letzten Programmiererfahrungen fanden auf Computern der Typen "ZX-81" und "ZX Spectrum" statt :S . Aber falls du oder jemand anderes mir Tipps geben könnten, wo ich mehr zu deinen Punkten oben herausfinden kann, immer her damit. Ich bin lernfähig. Hier mal der ganze Code des Programms:

    Quellcode

    1. Imports VistaToolbelt.Shell
    2. Imports System.Windows.Media.Imaging
    3. Imports System.Text
    4. Imports System.Drawing
    5. Imports System.Drawing.Drawing2D
    6. Imports System.Windows.MediaImports System.IO
    7.  
    8. Public Class Form1
    9. Const AZ As String = Chr(34)
    10. Dim stich As String
    11. Dim rating As String
    12. Dim args As String
    13. Dim picnr As Integer
    14. Dim ExifToolVB As New Process
    15. Dim Exiv2VB As New Process
    16. Dim arg As String
    17. Dim pfad As String
    18. 'Open Files with Drag&Drop
    19. Private Sub ExifComplete()
    20. ListView1.Items.Clear()
    21. picnr = 0
    22. For Each arg As String In My.Application.CommandLineArgs
    23. pfad = argCall Fill_ListView()
    24. Next
    25. End Sub
    26. 'Main Form
    27. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    28. ExifToolVB.StartInfo.FileName = "exiftool.exe"
    29. ExifToolVB.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    30. ExifComplete()
    31. End Sub
    32. 'Typing Keywords
    33. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles keyWord.TextChanged
    34. stich = keyWord.Text
    35. End Sub
    36. 'Add the Keywords
    37. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, addButton.Click, Button1.Click
    38. Dim Pfade As String = ""
    39. Dim Pfad As String = ""For a = 0 To ListView1.SelectedItems.Count - 1
    40. Pfad = ListView1.SelectedItems(a).Tag
    41. Pfade &= AZ + Pfad + AZ & " "
    42. NextExifToolVB.StartInfo.Arguments = " -sep " + AZ + "," + AZ + " -L -keywords+=" + AZ + stich + AZ + " -overwrite_original " + Pfade
    43. ExifToolVB.Start()
    44. ExifToolVB.WaitForExit()
    45. ExifToolVB.Close()Call Update_Keywords()
    46. End Sub
    47. 'Delete Keywords
    48. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    49. Dim Pfade As String = ""
    50. Dim Pfad As String = ""
    51. For a = 0 To ListView1.SelectedItems.Count - 1
    52. Pfad = ListView1.SelectedItems(a).Tag
    53. Pfade &= AZ + Pfad + AZ & " "
    54. Next
    55. ExifToolVB.StartInfo.Arguments = " -sep " + AZ + "," + AZ + " -L -xmp:subject-=" + AZ + stich + AZ + " -L -keywords-=" + AZ + stich + AZ + " -overwrite_original " + Pfade
    56. ExifToolVB.Start()
    57. ExifToolVB.WaitForExit()
    58. ExifToolVB.Close()
    59. Call Update_Keywords()
    60. End Sub
    61. 'End Application
    62. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    63. End
    64. End Sub
    65. 'Open Files in Programm
    66. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    67. Dim fd As OpenFileDialog = New OpenFileDialog()
    68. Dim strFileName As String
    69. fd.Title = "Datei(en) öffnen"
    70. fd.InitialDirectory = Environment.SpecialFolder.MyPictures
    71. fd.Filter = "Bilddateien (*.jpg, *.tif, *.dng, *.psd)|*.dng;*.jpg;*.tif;*.psd"
    72. fd.FilterIndex = 1
    73. fd.Multiselect = True
    74. fd.RestoreDirectory = True
    75. Dim picnr As Integer = 0
    76. If fd.ShowDialog() = DialogResult.OK Then
    77. ListView1.Items.Clear()
    78. ImageList1.Images.Clear()
    79. For Each arg As String In fd.FileNames
    80. pfad = arg
    81. Call Fill_ListView()
    82. Next
    83. strFileName = fd.FileName
    84. End If
    85. End Sub
    86. 'Radio Buttons for Rating
    87. Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
    88. rating = 0
    89. Call Rating_Update()
    90. End Sub
    91. Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
    92. rating = 1
    93. Call Rating_Update()
    94. End Sub
    95. Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged
    96. rating = 2
    97. Call Rating_Update()
    98. End Sub
    99. Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged
    100. rating = 3
    101. Call Rating_Update()
    102. End Sub
    103. Private Sub RadioButton5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton5.CheckedChanged
    104. rating = 4
    105. Call Rating_Update()
    106. End Sub
    107. Private Sub RadioButton6_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton6.CheckedChanged
    108. rating = 5
    109. Call Rating_Update()
    110. End Sub
    111. 'Rating Pictures with Stars
    112. Private Sub Rating_Update()
    113. Dim Pfade As String = ""
    114. Dim Pfad As String = ""
    115. 'Set Rating for Selected Items
    116. For a = 0 To ListView1.SelectedItems.Count - 1
    117. Pfad = ListView1.SelectedItems(a).Tag
    118. Pfade &= AZ + Pfad + AZ & " "
    119. Next
    120. ExifToolVB.StartInfo.Arguments = " -rating=" + rating + " -overwrite_original " + Pfade
    121. ExifToolVB.Start()
    122. ExifToolVB.WaitForExit()
    123. ExifToolVB.Close()
    124. 'Change ListView for Selected Items
    125. Pfad = ""
    126. Exiv2VB.StartInfo.RedirectStandardOutput = True
    127. Exiv2VB.StartInfo.UseShellExecute = False
    128. Exiv2VB.StartInfo.CreateNoWindow = True
    129. For a = 0 To ListView1.SelectedItems.Count - 1
    130. Pfad = ListView1.SelectedItems(a).Tag
    131. Dim ParseResultKey As String = Exiv2VB.StandardOutput.ReadToEnd
    132. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.xmp.Rating " + AZ + Pfad + AZ
    133. Exiv2VB.Start()
    134. Dim ParseResultStar As String = Exiv2VB.StandardOutput.ReadToEnd
    135. ListView1.SelectedItems(a).SubItems(2).Text = ParseResultStar
    136. Next
    137. Me.Refresh()
    138. End Sub
    139. 'Resize Preview
    140. Public Shared Function Image_Resize(ByVal img As Image) As Image
    141. Dim WhiteSpace As System.Drawing.Bitmap
    142. Dim myGraphics As Graphics
    143. Dim myDestination As Rectangle
    144. WhiteSpace = New System.Drawing.Bitmap(120, 120)
    145. myGraphics = Graphics.FromImage(WhiteSpace)
    146. Dim scale As Double
    147. If img.Width >= img.Height Then
    148. scale = img.Width / 120
    149. Else
    150. scale = img.Height / 120
    151. End If
    152. Dim New_Width As Integer = img.Width / scale
    153. Dim New_Height As Integer = img.Height / scale
    154. myDestination = New Rectangle(x:=0, y:=0, Width:=New_Width, Height:=New_Height)
    155. myGraphics.DrawImage(image:=img, rect:=myDestination)
    156. Image_Resize = WhiteSpace
    157. End Function
    158. 'Fill the List with Pictures and Infos
    159. Private Sub Fill_ListView()
    160. Dim lstv As New ListViewItem
    161. Dim Filename As String = System.IO.Path.GetFileName(pfad)
    162. Dim iSource As ImageSource = ThumbnailGenerator.GenerateThumbnail(pfad)
    163. Dim original As Image = ThumbnailGenerator.BitmapSourceToBitmap(iSource)
    164. Dim resized As Image = Image_Resize(original)
    165. ImageList1.Images.Add(picnr, resized)
    166. ListView1.LargeImageList = ImageList1
    167. Exiv2VB.StartInfo.FileName = "exiv2.exe"
    168. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.dc.subject -g Iptc.Application2.Keywords " + AZ + pfad + AZ
    169. Exiv2VB.StartInfo.RedirectStandardOutput = True
    170. Exiv2VB.StartInfo.UseShellExecute = False
    171. Exiv2VB.StartInfo.CreateNoWindow = True
    172. Exiv2VB.Start()
    173. Dim ParseResultKey As String = Exiv2VB.StandardOutput.ReadToEnd
    174. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.xmp.Rating " + AZ + pfad + AZ
    175. Exiv2VB.StartInfo.RedirectStandardOutput = True
    176. Exiv2VB.StartInfo.UseShellExecute = False
    177. Exiv2VB.StartInfo.CreateNoWindow = True
    178. Exiv2VB.Start()
    179. Dim ParseResultStar As String = Exiv2VB.StandardOutput.ReadToEnd
    180. Dim sPath As String = IO.Path.GetDirectoryName(pfad)
    181. Dim SPD As String
    182. If My.Computer.FileSystem.FileExists(sPath + "\SILKYPIX_DS\" + Filename + ".4.spd") Then
    183. SPD = "entwickelt"
    184. Else : SPD = "nicht entwickelt"
    185. End If
    186. Dim item As New ListViewItem
    187. item.Text = Filename
    188. item.Tag = pfad
    189. item.ImageKey = picnr
    190. With ListView1.Items.Add(item)
    191. .SubItems.Add(ParseResultKey)
    192. .SubItems.Add(ParseResultStar)
    193. .SubItems.Add(SPD)
    194. End With
    195. picnr = picnr + 1
    196. args &= arg & " "
    197. ExifToolVB.Close()
    198. End Sub
    199. 'Change ListView for Updated Keywords
    200. Private Sub Update_Keywords()
    201. pfad = ""
    202. Exiv2VB.StartInfo.RedirectStandardOutput = True
    203. Exiv2VB.StartInfo.UseShellExecute = False
    204. Exiv2VB.StartInfo.CreateNoWindow = True
    205. For a = 0 To ListView1.SelectedItems.Count - 1
    206. pfad = ListView1.SelectedItems(a).Tag
    207. Exiv2VB.StartInfo.Arguments = " -Pt -g Xmp.dc.subject -g Iptc.Application2.Keywords " + AZ + pfad + AZ
    208. Exiv2VB.Start()
    209. Dim ParseResultKey As String = Exiv2VB.StandardOutput.ReadToEnd
    210. ListView1.SelectedItems(a).SubItems(1).Text = ParseResultKey
    211. Next
    212. Me.Refresh()
    213. End Sub
    214. End Class



    Und es gibt m.W. wirklich keine Möglichkeit, auf DNG-Dateien mit Windowsmitteln zu zugreifen. Es sei denn, ich könnte auf die Routinen von FastPictureViewer Codec Pack zugreifen. Habe aber keinen blassen Schimmer, wie das gehen soll.
    Jedenfalls wäre ich für Optimierungshilfen dankbar. Im Moment lädt das Programm erstmal alle Bilder, bevor es sie anzeigt. Bei vielen Bildern dauert das eine Weile. Das zu beheben (ich denke, das meintest du mit "in einen Thread auslagern") wäre eine feine Sache.
    Was mit auch noch nicht schmeckt, ist, dass beim Refresh der Anzeige auch die Markierung der Bilder verloren geht, für weitere Aktionen die Bilder also neu ausgewählt werden müssen. Vielleicht gibt es da auch noch eine Lösung?
    Schönen Gruß,

    Lümmel