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:
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:
Und dazu gehört noch das:
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
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
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- Dim Folder As String = FolderBrowserDialog1.SelectedPath
- Button2.Enabled = False
- If Not IO.Directory.Exists(Folder & "/klein/") Then
- System.IO.Directory.CreateDirectory(Folder & "/klein/")
- End If
- For Each Files As String In Directory.GetFiles(Folder, "*.jpg")
- Dim FileName As String = IO.Path.GetFileName(Files)
- PictureBox1.Load(Folder & "\" & FileName)
- bildNachher = AutoSizeImage(PictureBox1.Image, 1024, 1536, False)
- bildNachher.Save(Folder & "/klein/" & FileName, Imaging.ImageFormat.Jpeg)
- Next
- For Each Files As String In Directory.GetFiles(Folder, "*.jpg")
- Dim FileName As String = IO.Path.GetFileName(Files)
- Dim Bild As Image = Image.FromStream(New MemoryStream(File.ReadAllBytes(FolderBrowserDialog1.SelectedPath & "/" & "klein" & "/" & FileName)))
- Dim Bild_wasserzeichen As Graphics = Graphics.FromImage(Bild)
- Dim wasserzeichen As Image = My.Resources.LemonbarWatermarkNEU
- Bild_wasserzeichen.DrawImage(wasserzeichen, New Rectangle(0, Bild.Height - (wasserzeichen.Height + 15), wasserzeichen.Width, wasserzeichen.Height), 0, 0, wasserzeichen.Width, wasserzeichen.Height, _
- GraphicsUnit.Pixel)
- Bild_wasserzeichen.CompositingQuality = CompositingQuality.HighQuality
- Bild.Save(FolderBrowserDialog1.SelectedPath & "/" & "klein" & "/" & FileName, Imaging.ImageFormat.Jpeg)
- Bild_wasserzeichen.Dispose()
- Next
- End Sub
Und dazu gehört noch das:
VB.NET-Quellcode
- Public Function AutoSizeImage(ByVal oBitmap As Image, _
- ByVal maxWidth As Integer, _
- ByVal maxHeight As Integer, _
- Optional ByVal bStretch As Boolean = False) As Image
- ' Größenverhältnis der max. Dimension
- Dim maxRatio As Single = maxWidth / maxHeight
- ' Bildgröße und aktuelles Größenverhältnis
- Dim imgWidth As Integer = oBitmap.Width
- Dim imgHeight As Integer = oBitmap.Height
- Dim imgRatio As Single = imgWidth / imgHeight
- ' Bild anpassen?
- If (imgWidth > maxWidth Or imgHeight > maxHeight) Or (bStretch) Then
- If imgRatio <= maxRatio Then
- ' Größenverhältnis des Bildes ist kleiner als die
- ' maximale Größe, in der das Bild angezeigt werden kann.
- ' In diesem Fall muss die Bildbreite angepasst werden.
- imgWidth = imgWidth / (imgHeight / maxHeight)
- imgHeight = maxHeight
- Else
- ' Größenverhältnis des Bildes ist größer als die
- ' maximale Größe, in der das Bild angezeigt werden kann.
- ' In diesem Fall muss die Bildhöhe angepasst werden.
- imgHeight = imgHeight / (imgWidth / maxWidth)
- imgWidth = maxWidth
- End If
- ' Bitmap-Objekt in der neuen Größe erstellen
- Dim oImage As New Bitmap(imgWidth, imgHeight)
- ' Bild interpolieren, damit die Qualität erhalten bleibt
- Using g As Graphics = Graphics.FromImage(oImage)
- g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
- g.DrawImage(oBitmap, New Rectangle(0, 0, imgWidth, imgHeight))
- End Using
- ' neues Bitmap zurückgeben
- Return oImage
- Else
- ' unverändertes Originalbild zurückgeben
- Return oBitmap
- End If
- 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“ ()