Velikost obrázku před načtením   zodpovězená otázka

ASP.NET WebForms

Zdravím, na své stránce mám obrázek, který se načíta z databáze a já bych chtěl zjistit jeho velikost ještě před načtením samotné stránky. Velikostí myslím rozměr tedy width x height. Díky za každou radu.

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

No, ideální je při vkládání obrázku do databáze či jeho úpravě si kromě samotných dat obrázku uložit též šířku a výšku.

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

A když tomu tak neni? Lze to nějak ještě dopátrat?

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

Přidal jsem si do db tedy další sloupce pro velikost obrázku.

Ale, chtěl bych dodatečně vytáhnout všechny obrázky z DB a velikost k nim přiřadit. Jak to ale udělat.

Mám tento kód:

Dim ImageOrig As System.Drawing.Image

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handlers Button1.Click

ImageOrig = System.Drawing.Image.FromFile(Server.MapPath("file.aspx?id=1"))
Response.Write(ImageOrig.Width)

End Sub

VS mi ale vrátí chybu, že není platná virtuální cesta. Lze to nějak pořešit, aby si z této adresy vzal obrázek?

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

Problém je v tom, že funkce Image.FromFile očekává cestu k souboru na disku. Musíte tedy nejdřív třeba funkcí My.Computer.Network.DownloadFile soubor stáhnout (za předpokladu, že file.aspx?id=1 vrací samotný obrázek a ne nějakou stránku, která jej obsahuje) a pak teprve ho přes Image.FromFile otevřít a zjistit rozměry.

Anebo je možná lepší napsat si kód, který projde všechny řádky z databáze, uloží je třeba do MemoryStreamu a vytvoří instanci třídy Image z toho streamu. Pro každý řádek zjistí rozměry a uloží je do DB.

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

Díky moc za rady. Soubor file.aspx mi vrací pouze obrázek. Moc jsem ale nepochopil tu MemoryStream, mohl byste mi to trochu blíže přiblížit, popř. někam odkázat.

Jde mi teď pouze o to, abych u obrázků, které mám teď v DB zjistil jejich velikost a zapsal ji do db. U nově přidávaných to mám již ošetřené a vkládá se to tam samo, při vložení obrázku do DB. Takže vlastně potřebuji kód na jedno použití.

Zkusím si teď pohrát s tím My.Computer.Network.DownloadFile

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

MemoryStream je obyčejný stream (proud dat), který se ukládá v paměti (ne na disk). Abyste z databáze nemusel obrázek ukládat na disk a pak ho z toho disku zase načítat (což je pomalé), můžete jej uložit z databáze do MemoryStreamu (tedy do operační paměti) a z MemoryStreamu jej načíst.

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

Tady je problém v tom, že rozměry obrázku potřebujete ve stránce, kde na obrázek odkazujete, přičemž obrázek z databáze vytáhne a posílá uživateli stránka jiná. Proto je lepší mít to uložení v databázi. Samozřejmě můžete při generování stránky obrázek z databáze načíst a rozměry si zjistit, ale to je pomalé a paměťově náročné.

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

Už jsem to pořešil. Použil jsem na to třídu WebClient a stáhl si vždy data pomocí DownloadData a následně ze streamu vyčetl to, co jsem potřeboval.

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