Mein Programm im Speicher mehr als 1,3GB

Wessy

Erfahrenes Mitglied
Hallo alle beisammen,

ich habe heute endlich mein neues Programm fertig gestellt und auch gleich getestet. Als ich im letzten Urlaub meine neue Digicam ausprobiert habe, sind dabei mehr als 1300 Bildchen entstanden. Da ich aber zu faul bin die alle per Hand auf "Web-Größe" zu schrauben und eine passende Qualität einzustellen hab ich mir da halt was für gebastelt. Nur wenn ich das Ding nun auf die Fotos loslasse, dann macht mein Programm so ab 500 Fotos die Beine breit und nimmt dann schon mehr als 1300MB meines Speichers in Anspruch :suspekt: !

Jetzt meine Frage: Wie kann ich denn das geladene Bild aus dem Image-Control löschen?

Weil ich das entsprechende Bild nur einmal ins Image-Control lade und von dort aus auf die einzelnen Picture-Controls male (spart so einiges an Ladezeit für die Bildvorschau)! Danke schon mal für eine Lösung!
 
Hallo und guten morgen Wincnc,

danke erst mal für deine Antwort. Hab mich natürlich gleich drangesetzt! Nur leider futtert sich mein Programm trotzdem wieder auf über 1GB (habs jetz nicht so lange laufen lassen)!

Hier der Screenshot:
26646attachment.jpg

Also der Screenshot zeigt das System während das Programm gerade die einzelnen Bilder durchläuft! Und da die einzelnen Bilder Stück für Stück geladen werden, wird mein Programm von Sekunde zu Sekunde fetter!

Kann man denn noch irgendwie den Speicher leeren? Oder 'ihm' sagen das er den Speicher immer wieder überschreiben soll :confused:
 
Zuletzt bearbeitet:
Hallo, das liegt dann nicht alleine am Image Control.
Da müsstest Du mal veraten was das Programm genau macht und den entsprechenden Code einstellen.
 
Hallo Wincnc,

also der komplette Code langweilt hier wohl eh nur, deshalb mal die (warscheinlich) wichtige Funktion:

PHP:
Public Function BildLaden(Bildpfad As String, Bildname As String)
If Not DebugModus Then On Error Resume Next
Bildadresse = Replace(Bildpfad & "\" & Bildname, "\\", "\")

If FSO.FileExists(Bildadresse) Then
   'reset
   BildVorschau.Cls
   BildBearbeitet.Cls
   BildBearbeitet.Height = 1
   BildBearbeitet.Width = 1
   
   BildOriginal.Picture = Nothing
   BildBearbeitet.Picture = Nothing
   BildVorschau.Picture = Nothing
   
   
   BildOriginal.Picture = LoadPicture(Bildadresse)
   BildOriginalXTwip = BildVorschau.ScaleX(BildOriginal.Picture.Width, vbHimetric, vbTwips)
   BildOriginalYTwip = BildVorschau.ScaleX(BildOriginal.Picture.Height, vbHimetric, vbTwips)
   BildOriginalXPix = BildVorschau.ScaleX(BildOriginalXTwip, vbTwips, vbPixels)
   BildOriginalYPix = BildVorschau.ScaleX(BildOriginalYTwip, vbTwips, vbPixels)
   
   'Scalierung berechnen
   BildMaxScaleX = BildVorschau.Width / BildOriginalXTwip
   BildMaxScaleY = BildVorschau.Height / BildOriginalYTwip
   If BildMaxScaleX > 1 Then BildMaxScaleX = 1
   If BildMaxScaleY > 1 Then BildMaxScaleY = 1
   If BildMaxScaleX < BildMaxScaleY Then BildMaxScale = BildMaxScaleX Else BildMaxScale = BildMaxScaleY
   'Bild wird scaliert
   BildMaxXTwip = BildMaxScale * BildOriginalXTwip
   BildMaxYTwip = BildMaxScale * BildOriginalYTwip
   
   'Bild wird zentriert (nur die Variablen werden definiert)
   BildStartXTwip = 0
   BildStartYTwip = 0
   If BildMaxXTwip < BildVorschau.Width Then BildStartXTwip = Int((BildVorschau.Width - BildMaxXTwip) / 2)
   If BildMaxYTwip < BildVorschau.Width Then BildStartYTwip = Int((BildVorschau.Height - BildMaxYTwip) / 2)
   
   'Bild malen (mit Variablen aus vorherigem Abschnitt)
   BildVorschau.PaintPicture BildOriginal.Picture, BildStartXTwip, BildStartYTwip, BildMaxXTwip, BildMaxYTwip
   DoEvents
   
   'Skalierung berechnen
   BildBearbeitetMaxScaleX = BildOriginalXPix / (OptionenMaxX.Text + 2)
   BildBearbeitetMaxScaleY = BildOriginalYPix / (OptionenMaxY.Text + 2)
   If BildBearbeitetMaxScaleX > BildBearbeitetMaxScaleY Then BildBearbeitetMaxScale = BildBearbeitetMaxScaleX Else BildBearbeitetMaxScale = BildBearbeitetMaxScaleY
   
   'Skalierung für BildBearbbeitet vorbereiten
   If Optionen_Stretch.Value = 0 Then 'stretch oder nicht stretch
   BildBearbeitetMaxXTwip = BildOriginalXTwip / BildBearbeitetMaxScale
   BildBearbeitetMaxYTwip = BildOriginalYTwip / BildBearbeitetMaxScale
   Else
   BildBearbeitetMaxXTwip = BildOriginalXTwip / BildBearbeitetMaxScaleX
   BildBearbeitetMaxYTwip = BildOriginalYTwip / BildBearbeitetMaxScaleY
   End If
   
   Debug.Print "BildBearbeitetMaxXTwip: " & BildBearbeitetMaxXTwip
   Debug.Print "BildBearbeitetMaxYTwip: " & BildBearbeitetMaxYTwip
   Debug.Print "BildBearbeitet.w: " & BildBearbeitet.Width
   Debug.Print "BildBearbeitet.h: " & BildBearbeitet.Height
   
   BildBearbeitet.Width = BildBearbeitetMaxXTwip
   BildBearbeitet.Height = BildBearbeitetMaxYTwip
   'Bild malen
   
   BildBearbeitet.PaintPicture BildOriginal.Picture, 0, 0, BildBearbeitet.Width, BildBearbeitet.Height
   
   'Bildinformationen schreiben
   Text_Bildinformationen.Text = "Name: " & Bildname
   Text_Bildinformationen.Text = Text_Bildinformationen.Text & vbNewLine & "Größe: " & Int(FSO.GetFile(Bildadresse).Size / 1024) & "kb"
   Text_Bildinformationen.Text = Text_Bildinformationen.Text & vbNewLine & "Maße : " & Int(BildOriginalXPix) & " x " & Int(BildOriginalYPix)
   Text_Bildinformationen.Text = Text_Bildinformationen.Text & vbNewLine & "Typ  : " & FSO.GetFile(Bildadresse).Type
   
End If
End Function
PS.: Die Zeile 3 sollte Bildadresse = Replace(Bildpfad & "\" & Bildname, "\\", "\") sein! Setzt quasi nur die Adresse des Bildes zusammen da z.B. der Pfad c:\ oder c:\windows sein kann!
Mein Programm funktioniert folgendermaßen:

Wie schon gesagt, 'es' soll Bilder nach vorher definierten Einstellungen automatisch bearbeiten und als JPG speichern! Das bedeutet:

- Bild wird in ein verstecktes Image-Control (BildOriginal) mittels LoadPicture geladen
- Bild aus dem Image-Control wird in eine PictureBox (BildVorschau) gemalt (PaintPicture)
- Bild aus dem Image-Control wird in eine versteckte PictureBox (BildBearbeitet) gemalt (PaintPicture) und von der Größe her angepasst

Das sind eigentlich die Aufgaben welche die Funktion BildLaden übernimmt. Quasi nur ein angegebenes Bild laden, daraus eine kleine Vorschau anzeigen und das endgültige Bild malen und vergrößern/verkleinern!

Den Aufruf der Funktion BildLaden und das anschließende Speichern des Bildes aus der PictureBox BildBearbeitet übernimmt dann eine andere Funktion.

PS: Ich denke ich kenne mich noch nicht wirklich gut mit Visual Basic aus und lerne mir die Sachen quasi selbst. Manche Dinge sind nicht immer gleich nachvollziebar, funktionieren aber! :D
 
Zuletzt bearbeitet:
Hallo, versuch mal folgendes:
Code:
   BildOriginal.Picture = LoadPicture
   BildBearbeitet.Picture = LoadPicture
   BildVorschau.Picture = LoadPicture

   BildOriginal.Picture = Nothing
   BildBearbeitet.Picture = Nothing
   BildVorschau.Picture = Nothing

   BildBearbeitet.Height = 1
   BildBearbeitet.Width = 1
Ich glaube, dass der hohe Speicherbedarf vom PaintPicture kommt.
Alternativ zu PaintPicture gibt es API Funktionen (StretchBlt, BitBlt, SetStretchBltMode).
Musst Du mal danach googeln.
Statt der PictureBoxen kannst Du auch das StdPicture - Objekt verwenden.

Beispiel:
Code:
Dim BildOriginal As New StdPicture

Set BildOriginal = LoadPicture(Bildadresse)
 
Ok, ich google nach der Arbeit nach dem Aufruf und teste's dann heute Abend! Melde mich später noch mal! Danke für die rasche Antwort....
 
Hmm, ich bin leider zu keiner Lösung gekommen. Da ich aber eh kaum mehr als 500 Bilder am Stück mit dem Programm bearbeite, lasse ich es nun so. Der Zweck wird erfüllt auch wenn dann ein paar hundert MB Speicher belegt werden.

Vielleicht würde die Verwendung einer API das Problem lösen, doch habe ich momentan keine Zeit mich da reinzuarbeiten.

Sollte jemand anderes noch eine Lösung für das Problem finden, bitte melden.

PS.: Z.B. Soetwas wie z.B. ein Control auf ein verstecktes Form zu platzieren und dieses Form regelmässig zu 'entladen' (unload Form)!

Wenn ich ein bischen Zeit habe teste ich das vielleicht noch mal!
 
Zurück