tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
833
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von JJB
    JJB JJB ist offline Cogito ergo brumm
    Registriert seit
    Jan 2004
    Ort
    Stuttgart
    Beiträge
    261
    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

  2. #2
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    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

  3. #3
    Avatar von JJB
    JJB JJB ist offline Cogito ergo brumm
    Registriert seit
    Jan 2004
    Ort
    Stuttgart
    Beiträge
    261
    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

  4. #4
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  5. #5
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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)
     

  6. #6
    Avatar von JJB
    JJB JJB ist offline Cogito ergo brumm
    Registriert seit
    Jan 2004
    Ort
    Stuttgart
    Beiträge
    261
    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

  7. #7
    Avatar von JJB
    JJB JJB ist offline Cogito ergo brumm
    Registriert seit
    Jan 2004
    Ort
    Stuttgart
    Beiträge
    261
    Zitat Zitat von CPoly Beitrag anzeigen
    Eigentlich sollte dein Speicherproblem schon gelöst sein, wenn du [..] und noch das alte Bild aus der PictureBox frei gibst:
    Danke werd ich mal testen.

    Zoom klingt gut. Vergaß zu erwähnen -> .Net 1.1 ich glaub da gibt es das nur ohne Seitenverhältnisse.

    Danke ******
     
    PS: Ja, ich habe gegoogelt und nein, ich will kein Viagra kaufen
    PPS: Tod allen verketteten Suchmaschinen

  8. #8
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    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

  9. #9
    Avatar von JJB
    JJB JJB ist offline Cogito ergo brumm
    Registriert seit
    Jan 2004
    Ort
    Stuttgart
    Beiträge
    261
    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

  1. Eine Kugel Explodiert
    Von yakumo im Forum 3D-Stills
    Antworten: 4
    Letzter Beitrag: 09.06.08, 17:04
  2. Schrift explodiert
    Von fruchtzwerg19891 im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 4
    Letzter Beitrag: 02.07.05, 11:27
  3. [MX] Skriptfehler im Preloader - IE explodiert.
    Von christiankreissl im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 06.10.04, 12:02
  4. Antworten: 2
    Letzter Beitrag: 19.04.02, 17:39
  5. Antworten: 3
    Letzter Beitrag: 01.04.02, 16:28

Stichworte