none
OutOfMemory při ukládání Bitmapy v cyklu

    Dotaz

  • Ahoj, mám problém s výjimkou OutOfMemory při práci s bitmapou. Vytvářím a ukládám obrázek 1280x1024. Pokud vytvořím jeden, nic se neděje, ale když jich v cyklu generuji třeba patnáct, tak to kolem desátého obrázku spadne na nedostatku paměti. Samozřejmě po každém uložení volám nad objektem bitmapy Dispose(). Je vůbec možné generovat takhle velké obrázky aniž bych na paměti vždy vyhořel?

     

    Tom

    středa 16. června 2010 12:55

Odpovědi

  • Ahoj, pokud už je to vyřešený, je to OK, zkoušel jsem popisovaný chování na kódu dole a pokud jsem nezapomněl na Dispose, vše se uvolňovalo správně. Není možné, že by během práce zůstal v paměti jiný objekt odkazující na Bitmapu ?

    int i = int.Parse(textBox1.Text);
    for (int a = 0; a < i; a++)
    {
     Bitmap b = new Bitmap(1280, 1024);
     Graphics g = Graphics.FromImage(b);
            
     g.DrawLine(Pens.Blue, 0, 0, g.ClipBounds.Width, g.ClipBounds.Height);
     g.Flush();
     //g.Dispose();
     //b.Dispose();
    }
    label1.Text = "Working set: " + Environment.WorkingSet;

    M
    čtvrtek 24. června 2010 6:01

Všechny reakce

  • Jak ten obrázek vytváříte? Malujete v něm něco pomocí GDI+? Zkuste sem nebo na můj e-mail poslat kód.

    Havetta

    pátek 18. června 2010 13:45
  • Generuji SHP vrstvy ze SharpMap(u) a do toho vykresluji legendu pomocí objektu ze System.Drawing.Graphic. Problém jsem již vyřešil použitím zvláštního vlákna které je spuštěno zvlášť jen pro samotné generování. Přesto děkuji za odpověď a snahu pomoci.
    středa 23. června 2010 11:29
  • Ahoj, pokud už je to vyřešený, je to OK, zkoušel jsem popisovaný chování na kódu dole a pokud jsem nezapomněl na Dispose, vše se uvolňovalo správně. Není možné, že by během práce zůstal v paměti jiný objekt odkazující na Bitmapu ?

    int i = int.Parse(textBox1.Text);
    for (int a = 0; a < i; a++)
    {
     Bitmap b = new Bitmap(1280, 1024);
     Graphics g = Graphics.FromImage(b);
            
     g.DrawLine(Pens.Blue, 0, 0, g.ClipBounds.Width, g.ClipBounds.Height);
     g.Flush();
     //g.Dispose();
     //b.Dispose();
    }
    label1.Text = "Working set: " + Environment.WorkingSet;

    M
    čtvrtek 24. června 2010 6:01
  • Je to možné i když jsem to několikrát procházel. Celá ta metoda generování (mých) obrázku je samozřejmě složitější, je tam více cyklů, podmínky, volá další metody atd. Je dost pravděpodoné, že jsem někde něco přehlédl. Děkuji za ochotu.

    T.

    čtvrtek 24. června 2010 8:00