ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
833
833
EMPFEHLEN
-
Hallo zusammen,
ich hab da mal ne blöde Frage.
Und zwar möchte ich mit einer Picturebox durch eine Reihe von Photos "zappen".
Dazu lade ich ein Image bzw. Bitmap mit einem File und werfe es in die PictureBox. Nach drücken einer Taste, z.B. Pfeil-Rechts, hole ich das nächste Bild. Warum erreiche ich schon nach wenigen Bildern 1,6 GB Arbeitsspeicher, was unweigerlich zum Absturz führt ?
Ist es so komplex Bilder in eine PictureBox zu laden ?
Wie muss ich mit den Bildern, bzw. dem Speicher umgehen um hier nicht zum Speicherfresser zu werden ?
Danke !PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
PPS: Tod allen verketteten Suchmaschinen
-
Hey,
hast du Code? Das Laden der Bilder ist normalerweise nicht aufwendig, naja, kommt drauf an wie groß die sind
LG„Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
Georg Christoph Lichtenberg
Netiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
Tach,
ich hab den Code nicht zur Hand. Ist an sich nicht viel, ich mach das mal jetzt so aus dem Kopf. Hoffe es passt einigermaßen:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
if (e.KeyCode == "Keys.Right") { Bitmap myBitmap = new Bitmap(myFileName); int myBmpWidth = myBitmap.Width; int myBmpHeight = myBitmap.Height; while ((myBmpWidth > myPictureBox.Width) || (myBmpHeight > myPictureBox.Height)) { myBmpWidth *= 0.9; myBmpHeight *= 0.9; myBitmap = new Bitmap(myBitmap, new Size(myBmpWidth, myBmpHeight)); } myPictureBox.Image = myBitmap; }
Ich hab so den Verdacht, es könnte an der Skalierung liegen.
Die Bilder sind jpg bei 4000x2500 oder so ähnlich.
Ungeachtet des Code Schnipsels; wie ginge das denn, wenn man es richtig macht ?PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
PPS: Tod allen verketteten Suchmaschinen
-
01.03.11 11:54 #4
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
Wenn die Bilder skaliert werden müssen, erstellst du in der While Schleife ja unzählige neue Bildobjekte.
Das wird der Grund sein warum der Speicher überläuft.
Vielleicht hilft dir das hier ja weiter.Geändert von tombe (01.03.11 um 11:59 Uhr)
Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
Eigentlich sollte dein Speicherproblem schon gelöst sein, wenn du die eine Zeile aus der Schleife raus nimmst und noch das alte Bild aus der PictureBox frei gibst:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
if (e.KeyCode == "Keys.Right") { Bitmap myBitmap = new Bitmap(myFileName); int myBmpWidth = myBitmap.Width; int myBmpHeight = myBitmap.Height; while ((myBmpWidth > myPictureBox.Width) || (myBmpHeight > myPictureBox.Height)) { myBmpWidth *= 0.9; myBmpHeight *= 0.9; } myBitmap = new Bitmap(myBitmap, new Size(myBmpWidth, myBmpHeight)); Image img = myPictureBox.Image; myPictureBox.Image = myBitmap; if(img != null) img.Dispose(); }
Aber: teste mal http://msdn.microsoft.com/en-us/libr....sizemode.aspx
Edit: Abgesehen davon, brauchst du die Schleife gar nicht, weil du mit einfachem Dreisatz auf die exakte Lösung kommst. Denn deine Schleife ist ja auch nur eine schlechte Näherung (immer wieder 90% ?). Genau das wird in tombe's Link gemacht.Geändert von CPoly (01.03.11 um 12:20 Uhr)
-
Hi
naja, der Code war nur mal so ad hoc aus dem Kopf.
Ich glaube der Skalierungsfaktor war wesentlich kleiner. Ich lag im Bereich von maximal 3-4 Iterationen. Müsste also etwas zwischen 0.5 und 0.75 gewesen sein. Das Bitmap sollte nach der Schleife erstellt werden.
Der Punkt ist, ich habe nach mehreren Bilder keinen Speicher mehr. Er wird einfach nicht mehr freigegeben.
Muss ich irgendetwas berücksichtigen, um sicher zu gehen, dass alte Bilder nicht im Speicher verbleiben ? Oder ist der Einsatz von Bitmap generell von Nachteil ?
Vielleicht liegt es auch am Füttern der PictureBox ?Geändert von JJB (01.03.11 um 12:27 Uhr)
PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
PPS: Tod allen verketteten Suchmaschinen
-
PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
PPS: Tod allen verketteten Suchmaschinen
-
Hey,
vielleicht bringts ja was, wenn du den Speicher mit 'ner "using"-Direktive oder so wieder frei gibst, nachdem du das Bild bearbeitest hast, möchte wetten die Bitmap-Class implementiert IDisposable.
Code :1 2 3 4 5
using (Bitmap myBitmap = new Bitmap("myFileName")) { ... }
MfG„Jeder Fehler erscheint unglaublich dumm, wenn Andere ihn begehen.“
Georg Christoph Lichtenberg
Netiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
Siehe da, es ward Licht !
Ich habe das Image der PictureBox immer auf null gesetzt, bevor ich das neue Bild geladen habe.
Wenn ich statt dessen das alte Bild in ein Image kopiere und dieses per Dispose leere wird unmittelbar darauf, der belegte Arbeitsspeicher freigegeben. Das mache einen immensen Unterschied.
Im Nachhinein gesehen liegt das doch recht nahe. Hätte ich gleich drauf kommen sollen.
Danke nochmals !PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
PPS: Tod allen verketteten Suchmaschinen
Ähnliche Themen
-
Eine Kugel Explodiert
Von yakumo im Forum 3D-StillsAntworten: 4Letzter Beitrag: 09.06.08, 17:04 -
Schrift explodiert
Von fruchtzwerg19891 im Forum Videoschnitt, Videotechnik & -produktionAntworten: 4Letzter Beitrag: 02.07.05, 11:27 -
[MX] Skriptfehler im Preloader - IE explodiert.
Von christiankreissl im Forum Flash PlattformAntworten: 2Letzter Beitrag: 06.10.04, 12:02 -
Will,dasmein ganzesObjekt explodiert,undnicht nur die seiten!
Von zg peripherals im Forum Cinema 4DAntworten: 2Letzter Beitrag: 19.04.02, 17:39 -
Nub-Frage: Wie kann ich ein Video machen, wo ein Würfel EXPLODIERT?
Von zg peripherals im Forum Cinema 4DAntworten: 3Letzter Beitrag: 01.04.02, 16:28





Zitieren


Login





