System.OutOfMemoryException: Out of memory.   otázka

ASP.NET WebForms

Zmenšuji JPG fotky(cca 200kB jedna) ve webové složce:

Dim img As Bitmap
Dim koef As Integer

For Each file In Dir.GetFiles("*.jpg")
img = Bitmap.FromFile(Server.MapPath("" + file.ToString))
If img.Width > 600 Then
koef = img.Width / 600

img = New Bitmap(img, New Size(img.Size.Width / koef, img.Size.Height / koef))

img.Save(Server.MapPath("x" + file.ToString), Imaging.ImageFormat.Jpeg)
img.Dispose()
End If
Next

Můj počítač to zvládá, internetový server zahlásí "Out of memory" a označí řádek

img = New Bitmap(img, New Size(img.Size.Width / koef, img.Size.Height / koef))

Chci toho po něm tolik? Děkuji za radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevoláte Dispose na původní obrázek, jen na ten nový, tím pádem za chvíli dojde paměť.

Novou bitmapu vytvářejte do proměnné img2 a na konci zavolejte Dispose na img i na img2. Vy si nyní do img totiž načtete původní bitmapu, ale hned vzápětí do img hodíte referenci na novou bitmapu, ale tím pádem ztratíte referenci na původní obrázek a nevoláte na něm Dispose, tím pádem zůstane v paměti viset, dokud nepřijde Garbage Collector, ale na ten není spolehnutí, protože je líný skoro jako liška a chodí všude pozdě.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Bezvadné, pane Hercegu ;-)

Pokud mohu ještě poprosit, tak bych rád polepšil své načítání adresáře obrázků a jejich zobrazení v DataListu. Využívám jednoduchou věc:

DL1.DataSource = New System.IO.DirectoryInfo(Server.MapPath("").GetFiles("*.jpg")
DL1.DataBind()

Problém je, že program.aspx musí ležet ve složce spolu s obrázky, protože navazuji ImageButton v Datalistu (resp. jeho údaj ImageURL) způsobem Bind('Name'). Name, tj. holé jméno souboru, vyhoví podmínce pro platné URL. Jak ale postupovat, pokud se program nachází v jiné složce než obrázky? Relativní cestu, (která by vyhověla požadavku ImageURL) z třídy DirectoryInfo nějak bezpracně nezískám, že?

Stačí stručně, Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proc pouzivate Server.MapPath("") ??. Tak si tam dejte cestu k fotkam a to jak relativni nebo absolutni.


' "~" = root webu
Server.MapPath("~/adresar1/pod_adresar/")

'funkce ktera zjisti relativni cestu z absolutni
'p.s. zbytecnost

Public Function ResolvePath(ByVal AbsolutePath As String) As String
        Dim FullPath As String = AbsolutePath.ToLower
        Dim SitePath As String = MapPath("~").ToLower
        Return FullPath.Replace(SitePath, "~").Replace("\", "/")
End Function

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Cestu zvládám. Co nezvládám je spojit cestu+ bind('Name'), aby se Datalist napojil na obrázky. Dá se to nějak zapsat?

př:

<asp:TextBox ID="Title" runat="server" Text= "cesta"+'<%# Bind("Name") %>' />

Díky Ondřeji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle prostě a jednoduše nemůžete. Pokud používáte Binding Expression, tak ten nemůže být uvnitř obsahu vlastnosti, vlastnost má buď hodnotu udanou textem, nebo celou její hodnotu určuje Binding Expression a místo uvozovek se používají apostrofy. Vypadat to tedy může jedině takto:

<asp:TextBox ... Text="cesta" /> nebo
<asp:TextBox ... Text='<%#Eval("cesta")%>' />

Pokud chcete zkombinovat něco z Evalu a nějakou vlastní hodnotu, tak to jde, Eval má volitelný druhý parametr, kde zadáte formátovací řetězec (takový ten string s placeholderem {0}, do kterého se hodnota Evalu dosadí a případně zformátuje).

<asp:TextBox ... Text='<%#Eval("cesta", Path.Combine(Server.MapPath("..."), "/{0}"))%>' />

Je také potřeba rozlišovat mezi Eval a Bind, Eval je jednosměrná datová vazba (z databáze do komponenty) a tam formátovací řetězec určit jde, zatímco Bind je obousměrná vazba (umí to i z komponenty zpátky do databáze). Rozhodně není možné Bindnout do databáze jen část hodnoty v textovém poli, to už budete muset udělat kódem.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pro využití Name z třídy DirectoryInfo jsem tedy použil Eval a jeho hodnotu jsem rozšířil o path ve tvaru:

ImageUrl='<%# Eval("Name",  "~/foto/nahled/{0}") %>'

V Datalistu se tím předá žádaný formát pro ImageURL a ...

A JE TO!

Díky

Váš Pat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback