Bilder verkleinern und mit Logo versehen - Endet in Fehler

  • VB.NET

    Bilder verkleinern und mit Logo versehen - Endet in Fehler

    Hallo liebes Forum,

    ich habe eine Problem... Und zwar habe ich ein Programm geschrieben, was Bilder verkleinert und mit Logo versieht. Ich weiß, das mag etwas durcheinander aussehen, aber ich bin ja auch noch am lernen.

    Und zwar habe ich ein Problem. Das Programm soll die Bilder in einem Ordner mit einem Logo versehen und verkleinern. Das macht es bei meinen Computern auch einwandfrei, aber nicht bei Computern bei Freunden.

    Da erhalte ich abwechselnd 2 Fehler und ich hoffe ihr könnt mir vielleicht helfen.

    Fehler 1: Wenn ich so ca. 120 Bilder verkleiner erhalte ich den Fehler, dass nicht genügend Arbeitsspeicher vorhanden ist. Dabei haben alle getesteten PCs mind. 4 GB RAM


    Fehler 2:

    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
    ************** Ausnahmetext **************
    System.Runtime.InteropServices.ExternalException: Allgemeiner Fehler in GDI+.
    bei Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
    bei Microsoft.VisualBasic.CompilerServices.NewLateBinding.CallMethod(Container BaseReference, String MethodName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, BindingFlags InvocationFlags, Boolean ReportErrors, ResolutionFailure& Failure)
    bei Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
    bei ILM_Uploadtool.Form1.MetroButton1_Click(Object sender, EventArgs e) in Pfad zu VB Datei auf meinem PC obwohl es auf einem anderen ausgeführt wird:Zeile 229.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    Das passiert nur beim Verkleinern der Bilder! Oder das Programm hängt sich bei der Arbeit einfach auf!

    Das mit den Bildern und Logos mache ich mit diesem Code:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim Folder As String = FolderBrowserDialog1.SelectedPath
    3. Button2.Enabled = False
    4. If Not IO.Directory.Exists(Folder & "/klein/") Then
    5. System.IO.Directory.CreateDirectory(Folder & "/klein/")
    6. End If
    7. For Each Files As String In Directory.GetFiles(Folder, "*.jpg")
    8. Dim FileName As String = IO.Path.GetFileName(Files)
    9. PictureBox1.Load(Folder & "\" & FileName)
    10. bildNachher = AutoSizeImage(PictureBox1.Image, 1024, 1536, False)
    11. bildNachher.Save(Folder & "/klein/" & FileName, Imaging.ImageFormat.Jpeg)
    12. Next
    13. For Each Files As String In Directory.GetFiles(Folder, "*.jpg")
    14. Dim FileName As String = IO.Path.GetFileName(Files)
    15. Dim Bild As Image = Image.FromStream(New MemoryStream(File.ReadAllBytes(FolderBrowserDialog1.SelectedPath & "/" & "klein" & "/" & FileName)))
    16. Dim Bild_wasserzeichen As Graphics = Graphics.FromImage(Bild)
    17. Dim wasserzeichen As Image = My.Resources.LemonbarWatermarkNEU
    18. Bild_wasserzeichen.DrawImage(wasserzeichen, New Rectangle(0, Bild.Height - (wasserzeichen.Height + 15), wasserzeichen.Width, wasserzeichen.Height), 0, 0, wasserzeichen.Width, wasserzeichen.Height, _
    19. GraphicsUnit.Pixel)
    20. Bild_wasserzeichen.CompositingQuality = CompositingQuality.HighQuality
    21. Bild.Save(FolderBrowserDialog1.SelectedPath & "/" & "klein" & "/" & FileName, Imaging.ImageFormat.Jpeg)
    22. Bild_wasserzeichen.Dispose()
    23. Next
    24. End Sub



    Und dazu gehört noch das:

    VB.NET-Quellcode

    1. Public Function AutoSizeImage(ByVal oBitmap As Image, _
    2. ByVal maxWidth As Integer, _
    3. ByVal maxHeight As Integer, _
    4. Optional ByVal bStretch As Boolean = False) As Image
    5. ' Größenverhältnis der max. Dimension
    6. Dim maxRatio As Single = maxWidth / maxHeight
    7. ' Bildgröße und aktuelles Größenverhältnis
    8. Dim imgWidth As Integer = oBitmap.Width
    9. Dim imgHeight As Integer = oBitmap.Height
    10. Dim imgRatio As Single = imgWidth / imgHeight
    11. ' Bild anpassen?
    12. If (imgWidth > maxWidth Or imgHeight > maxHeight) Or (bStretch) Then
    13. If imgRatio <= maxRatio Then
    14. ' Größenverhältnis des Bildes ist kleiner als die
    15. ' maximale Größe, in der das Bild angezeigt werden kann.
    16. ' In diesem Fall muss die Bildbreite angepasst werden.
    17. imgWidth = imgWidth / (imgHeight / maxHeight)
    18. imgHeight = maxHeight
    19. Else
    20. ' Größenverhältnis des Bildes ist größer als die
    21. ' maximale Größe, in der das Bild angezeigt werden kann.
    22. ' In diesem Fall muss die Bildhöhe angepasst werden.
    23. imgHeight = imgHeight / (imgWidth / maxWidth)
    24. imgWidth = maxWidth
    25. End If
    26. ' Bitmap-Objekt in der neuen Größe erstellen
    27. Dim oImage As New Bitmap(imgWidth, imgHeight)
    28. ' Bild interpolieren, damit die Qualität erhalten bleibt
    29. Using g As Graphics = Graphics.FromImage(oImage)
    30. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
    31. g.DrawImage(oBitmap, New Rectangle(0, 0, imgWidth, imgHeight))
    32. End Using
    33. ' neues Bitmap zurückgeben
    34. Return oImage
    35. Else
    36. ' unverändertes Originalbild zurückgeben
    37. Return oBitmap
    38. End If
    39. End Function


    Würde mich sehr über Hilfe freuen.

    PS: Der MetroButton oben in dem Fehlerfeld ist schon entfernt und durch einen normalen ersetzt!

    EDIT: Habe inzwischen herausgefunden, dass das verkleinern das Problem ist... Auf einzelne Buttons aufgeteilt geht das mit den Wasserzeichen innerhalb von ein paar Sekunden, aber beim verkleinern springt der Form Titel direkt auf (keine Rückmeldung), macht aber trotzdem langsam seine Arbeit!

    Die Arbeitsspeicherauslastung ist irre hoch!



    mfg friloo

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „friloo“ ()