es rechnet nicht alle bilder klein

  • VB.NET

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

    es rechnet nicht alle bilder klein

    Hallo und guten abend alle zusammen, ich möchte alle bilder in der listbox1 kleinrechnen, dazu lese exifdaten aus originalgroße orientierung usw..
    dann lasse ich es die Größe anpassen und speichere es ab.

    da tauchen dann gleich mehrere Probleme auf,
    1. er macht nur 10 bilder und sagt dann Reiter fertig es sind aber 100 bilder ( in listbox1 sind alle 100 angezeigt und listbox2 ebnso
    2. er macht mir beim berechnen das Poprgrammfenster weiss und zeigt nix an

    ich habe schon x versuche gemacht aber nix geht.. hier folgt der Quellcode

    VB.NET-Quellcode

    1. 'Bilddaten in listbox1 ablegen
    2. Dim dir As New DirectoryInfo(Label1.Text)
    3. Dim stb0 As String = "IMG_" & Label4.Text & ".JPG"
    4. Dim stb As String = Replace(stb0, " ", "")
    5. Dim enb0 As String = "IMG_" & Label5.Text & ".JPG"
    6. Dim enb As String = Replace(enb0, " ", "")
    7. Dim files = From file In dir.GetFiles() _
    8. Where file.Name.ToString >= stb And file.Name.ToString <= enb _
    9. Select file
    10. For Each entry In files
    11. Dim en0 As String = dir.ToString & "\" & entry.ToString
    12. ListBox1.Items.Add(en0)
    13. Next
    14. Dim Kamera As String = ""
    15. Dim ori As Long
    16. Dim ow As Long
    17. Dim oh As Long
    18. Dim azbi As Integer = ListBox1.Items.Count - 1
    19. Label16.Text = azbi
    20. For iz = 0 To azbi
    21. With ListBox1.Items
    22. 'originalgröße der bilder
    23. Label12.Text = ListBox1.Items(iz).ToString
    24. Dim Image As Image = Image.FromFile(Label12.Text)
    25. Dim enc As Encoding = Encoding.Default
    26. 'PictureBox1.Image = Image
    27. For Each Info As PropertyItem In Image.PropertyItems
    28. Select Case Info.Id ' Id ist dezimal
    29. Case 272 ' ID für Kameramodell / Info.Type 2
    30. Kamera = enc.GetString(Info.Value, 0, Info.Len - 1)
    31. Case 274 ' ID für Kameramodell / Info.Type 2
    32. ori = BitConverter.ToInt16(Info.Value, 0)
    33. Case 40962 ' (Hex A002) Bildbreite in Pixel / Info.Type 3 (LONG)
    34. ow = BitConverter.ToInt16(Info.Value, 0)
    35. 'Label10.Text = BitConverter.ToInt32(Info.Value, 0)
    36. Case 40963 ' (Hex A003) Bildhöhe in Pixel / Info.Type 3 (LONG)
    37. oh = BitConverter.ToInt16(Info.Value, 0)
    38. 'Label11.Text = BitConverter.ToInt32(Info.Value, 0)
    39. Case Else
    40. Debug.WriteLine(Info.Id.ToString & " (" & Info.Id.ToString("X") & ") " & Info.Type.ToString)
    41. End Select
    42. Next
    43. Dim imgRatio As Single = CSng(ow / oh)
    44. Dim odata As String = Kamera & " " & ow.ToString & " X " & oh.ToString & " ratio " & imgRatio.ToString & " ori " & ori.ToString
    45. ListBox2.Items.Add(odata)
    46. Dim imgWidth As Integer = ow
    47. Dim imgHeight As Integer = oh
    48. If ori = 8 Then
    49. Dim maxWidthh As Integer = 500 / imgRatio
    50. Dim maxHeighth As Integer = 500
    51. Dim oBitmap As Bitmap = Image.FromFile(Label12.Text)
    52. Dim oImage As New Bitmap(maxHeighth, maxWidthh)
    53. ' Bild interpolieren, damit die Qualität erhalten bleibt
    54. Using g As Graphics = Graphics.FromImage(oImage)
    55. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    56. g.DrawImage(oBitmap, New Rectangle(0, 0, maxHeighth, maxWidthh))
    57. End Using
    58. With PictureBox2
    59. ' PictureBox einrichten
    60. oImage.RotateFlip(RotateFlipType.Rotate90FlipY)
    61. PictureBox2.Image = oImage
    62. End With
    63. Else
    64. Dim maxWidthb As Integer = 500 * imgRatio
    65. Dim maxHeightb As Integer = 500
    66. Dim oBitmap As Bitmap = Image.FromFile(Label12.Text)
    67. Dim oImage As New Bitmap(maxWidthb, maxHeightb)
    68. PictureBox2.Image = oImage
    69. ' Bild interpolieren, damit die Qualität erhalten bleibt
    70. Using g As Graphics = Graphics.FromImage(oImage)
    71. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    72. g.DrawImage(oBitmap, New Rectangle(0, 0, maxWidthb, maxHeightb))
    73. End Using
    74. Dim l3 As Integer = Label12.Text.Length
    75. Dim l4 As Integer = l3 - 15
    76. Dim im As String = Label12.Text.Substring(l4, 15)
    77. Dim im1 As String = "\turniere\testturnier\2.0\thumbs" & im
    78. Dim thumb As String = Label2.Text '& "\" ' & im
    79. Label15.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    80. Dim img As Image = oImage
    81. img.Save(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), im), System.Drawing.Imaging.ImageFormat.Jpeg)
    82. ProgressBar1.Maximum = azbi + 1
    83. ProgressBar1.Value += 1
    84. Label11.Text = ProgressBar1.Value / ProgressBar1.Maximum * 100 & " %"
    85. Label13.Text = ProgressBar1.Value
    86. End If
    87. End With
    88. Next
    89. ProgressBar1.Value = 0
    90. Dim sourcePath As New DirectoryInfo(Label15.Text & "\")
    91. Dim DestinationPath As String = Label2.Text & "\"
    92. Dim thumbR As String = Label3.Text & "\" & rord & "\" '& im
    93. Dim myFiles() As FileInfo = sourcePath.GetFiles()
    94. For i As Integer = 0 To myFiles.Length - 1
    95. If Not My.Computer.FileSystem.FileExists(thumbR & myFiles(i).ToString) Then
    96. myFiles(i).CopyTo(thumbR & myFiles(i).ToString)
    97. End If
    98. If Not My.Computer.FileSystem.FileExists(DestinationPath & myFiles(i).ToString) Then
    99. myFiles(i).MoveTo(DestinationPath & myFiles(i).ToString)
    100. End If
    101. Label13.Text = ""
    102. ProgressBar1.Maximum = myFiles.Length - 1
    103. ProgressBar1.Value += 1
    104. Label11.Text = ProgressBar1.Value / ProgressBar1.Maximum * 100 & " %"
    105. Label13.Text = i.ToString
    106. Next
    107. Erase myFiles
    108. ProgressBar1.Value = 0
    109. Dim hab As String = "1"
    110. Dim sqldshb As String = "update startliste set berechnet = " & hab & " where tid = " & wertT & " and pruefnr = " & wertP & " and slid = " & Label10.Text & " "
    111. Dim con6 As New MySqlConnection
    112. Dim cmd6 As New MySqlCommand(sqldshb, con6)
    113. Dim myAdapter6 As New MySqlDataAdapter
    114. Dim anzahl As Integer
    115. con6.ConnectionString = "server=localhost;" _
    116. & "uid=root;" _
    117. & "pwd=slotmachine;" _
    118. & "database=lenz"
    119. con6.Open()
    120. Try
    121. anzahl = cmd6.ExecuteNonQuery()
    122. ProgressBar1.Value = 0
    123. MsgBox("Reiter fertig")
    124. con6.Close()
    125. Catch ex As Exception
    126. MsgBox(ex.Message)
    127. End Try
    128. Label4.Text = ""
    129. Label5.Text = ""
    130. Label6.Text = ""
    131. Label7.Text = ""
    132. Label8.Text = ""
    133. Label9.Text = ""
    134. Label10.Text = ""
    135. Label12.Text = ""
    136. Label14.Text = ""
    137. ListBox1.Items.Clear()
    138. ListBox2.Items.Clear()
    139. Button1.PerformClick()
    140. End Sub


    dank schon mal ... mit freundlichen Grüße Ronaldl

    ronaldl schrieb:

    er macht nur 10 bilder und sagt dann Reiter fertig es sind aber 100 bilder ( in listbox1 sind alle 100 angezeigt und listbox2 ebnso

    Was meinst Du damit, er "macht nur 10 Bilder" ? Wie äussert sich das ? So wie ich den (langen) Code lese berechnet er die neuen Bilder und bei Fertigstellung speichert er sie und trägt sie in die ListBox2 ein. Wenn also die Listbox2 100 Bilder enthält so hat er sie auch berechnet ...

    ronaldl schrieb:

    er macht mir beim berechnen das Poprgrammfenster weiss und zeigt nix an

    Das ist kein Wunder: ich gehe davon aus , dass die Berechnungen ziemlich lange dauern. Während dieser Zeit gibst Du Deiner Form keine Möglichkeit Events zu empfangen (Refresh, Ziehen, usw.) . Normalerweise lagert man solcher Art Berechnungen in einen Background-Worker aus, zur Fehlersuche reicht aber auch erstmal ein "Application.DoEvents" am Anfang der While-Schleife.

    Off-Topic: eine solche Menge an Code wird übersichtlicher , wenn man ihn durch Subs und Funktionen etwas strukturiert. Erleichtert auch die Fehlersuche.
    hallo Kangaroo,


    da mit doAplication klappt prima mit den listboxen, der Picturebox

    Erklärung:
    1) ich hole mir aus einer db die bildnummern und lege sie samt pfad in listbox1 ab.

    2) dann frage ich die exif daten ab und lege sie in listbox2 ab

    3) dann berechne ich die neue Bildgröße und lasse bild in picturebox2 anzeigen

    Bis hier klappt jetzt alles mit Application.DoEvents() , alle 100 bilder werden in den listboxen und picturebox2 angezeigt - danke dafür ..

    4) damit soll dann jedes bild gespeichert werden

    VB.NET-Quellcode

    1. Dim img As Image = oImage
    2. img.Save(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), im), System.Drawing.Imaging.ImageFormat.Jpeg)


    das klappt nur mit 10 Bildern , danach speichert es einfach nicht mehr...

    5) mit dem labeln und der Status anzeige hört er auch nach 10 Bildern auf

    VB.NET-Quellcode

    1. ProgressBar1.Focus()
    2. ProgressBar1.Maximum = azbi + 1
    3. Application.DoEvents()
    4. ProgressBar1.Value += 1
    5. ProgressBar1.Refresh()
    6. Label11.Focus()
    7. Label11.Text = ProgressBar1.Value / ProgressBar1.Maximum * 100 & " %"
    8. Label11.Refresh()
    9. Label13.Focus()
    10. Label13.Text = ProgressBar1.Value
    11. Label13.Refresh()

    und dann verläster nextschleife und kopiert die 10 Bilder korreckt...

    das ist mein Problem... ich hoffe es ist jetzt verständlicher geworden was ich damit machen möchte und wo mein Problem ist.
    alle namen immer groß jede cam speichet das Fotos IMG_dann 4 stellige zahl .JPG wenigstens die spiegelreflex IMG_ kann beliebig abweichen aber immer 4 Zeichen und wenn es buchstaben sind immer nur groß .

    Aber entscheiden ist doch die endung jpg ob große oder klein sollte doch hoffentlich keine rolle spielen oder ?? zumal er ja 10 bilder korreckt berechnet und verteilt dann sollte das doch auch mit 100 gehen...
    hallo der_Kurt

    ja die fängt ja in zeile 22 an

    VB.NET-Quellcode

    1. For iz = 0 To azbi
    2. With ListBox1.Items


    ich habe mehrere with in der gesamtschleife die sich auf unterschiedliche elemente beziehen...

    aber dennoch die werte welche sich in der gesamtschleife ergeben einen element zuordnen.

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

    Hat jetzt vermutlich nichts mit dem Problem zu tun.
    Ein With-End With-Konstrukt verwendet man normalerweise, damit man das Element, in dem Fall Listbox1.Items nicht andauernd benennen muss.
    zb. Anstatt Listbox1.items.add ("wasauchimmer") muss man nur mehr .add ("whatever") schreiben.

    Ich habe deshalb gefragt, weil ich diese charakteristische Anweisung beginnend mit einem Punkt nicht gefunden habe, und mir deshalb die Verwendung von With unnötig erscheint.
    Das Add-Beispiel war nur ein Anwendungs-Beispiel des With-Statements.

    Deine With-Anweisung macht gar nichts!
    Die Zeilen 23, 68 und das dazugehörige End-With kannst du rauslöschen, und es wird nichts am Programm ändern.

    MSDN schrieb:

    Ein With-Block ist keine iterative Konstruktion. Sofern der Block keine Schleife enthält, werden die Anweisungen nur einmal ausgeführt.


    Lies dir dasdurch, und dann sag mir, ob du nicht das meinst:

    VB.NET-Quellcode

    1. For Each Element in listbox1.items
    2. 'hier gehst du jedes Element der Liste durch
    3. next



    Debugger: Du kannst das Programm auch Zeilenweise durchgehen, oder dir mit der Taste F9 Haltepunkte setzen. Dort bleibt das Programm stehen, und du kannst in diesem Moment einzelne Werte kontrollieren.

    ronaldl schrieb:

    wie geht das ?

    Der Debugger ist neben Intellisense vermutlich der beste Grund Visual Studio zu benutzen, als grober Überblick zum debuggen:
    • Setze einen Haltepunkt an die Stelle im Programm an der Du das Programm anhalten möchtest. Das machst Du indem Du in den Bereich links neben die Codezeile klickst, alternativ kannst Du auch die Zeile wählen und F9 drücken.
    • dann startest Du dein Programm im Menu über Debuggen->Debugging Starten (oder drückst F5). Wenn das Programm den BreakPoint erreicht wird es halten.
    • Jetzt kannst Du entweder mit der Maus über eine Variable fahren und ihren Wert anschauen oder unten im Direktfenster mit ?Variable Eigenschaften ausdrucken. Man kann im Direktfenster sogar Variablen neu zuweisen oder Methoden ausführen.
    • wenn Du im Programm weitermachen willst gehst Du entweder mit F8 (oder Umschalt-F8) schrittweise weiter oder setzt einen neuen Haltepunkt

    Du wirst das immer wieder benutzten, weiteres steht hier