HepBeg Club - Hlavní stránka   www.hepbeg.net Oficiální stránky HepbegClubu®  
  Hlavní menu
  • Hlavní stránka
  • Seznam rubrik
  • Download
  • Weblinks
  • Ankety
  • TOP 15
  • Personalizace
  • Forum

  •   Hledání
    Rozšířené vyhledávání

      Články dle data
    <<  Červenec  >>
    PoÚtStČtSoNe
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 

      Pluginy
    Testování

      Spřízněné weby
    Zde jsou zdroje informací o phpRS, případně www stránky spoluautorů tohoto webu
    www.phprs.cz/magazin
    www.stavela.cz
    HPS v IT - Informace a zábava pro IT človíčky
    PCNews.cz
    pabi3.com - Stránka o phpRS, originální články zejména o layoutech, které tam jsou i k stažení.
    BGV
    phpRS modifikace
    SuperSvět

    Jinonický zpravodaj
    needrland.cz
    mrtriska.com
    quattro.haje.cz
    lipnik.info
    webinfo.sk-MSteve
    Mart
    Pykaso.NET

    huspeka.net

      Vtip pro Vás ...
    Náhled ... 
(kliknutím zobraz!)

    Stránkování obrázku v ASP.NET
    Vydáno dne 05. 08. 2004 (3079 přečtení) | Rubrika: M$.NET

    Stránkování obrázku v ASP.NET

    Tak přátelé jsem opět zde :-), dneska si uděláme malou blbůstku. Vytvoříme webovou stránku, ktera bude stránkovat obrázek. Stránkování znamená, že máme větší množství dat (třebas články, všemožné seznamy atp. ale i obrázek) a tyto nemůžeme poslat celé do stránky, protože by to prohlížeč nebo počítač nezvládl přechroustat. Budeme mít tedy větší obrázek řekněme 1600x1200 pixelů, ale může být třebas i mnohem větší např 20000x20000 bodů. Do stránky ale dorazí obrázek mnohem menších rozměrů např 300x300px. Jak na to?

    Ukažme si výsledek

    Nejprve vyjděme z nějakého datového zdroje. Zde vyjdu z 24bitového obrázku rozměrů 1600x1200, který převedu do nepakované formy tak, že každý pixel je reprezentován třemi byty. Dostanu tak soubor velikosti 1600x1200x3 (složky{byty} red/green/blue) = dostávám soubor velikosti 5760000 B, kde celý obrázek je zaznamenán řádek po řádku. Tuto operaci mi umožní jakýkoliv kvalitní bitmapový program, nazvěme takto připravený soubor např. praha.rgb.

    Nenechejme se zmást extrémní velikostí souboru, ta nám v ničem nevadí (pouze soubor zabírá velké místo na disku :-), protože přístup ke skutečnému aktuálnímu výřezu provedeme skokem v souboru na přesné místo začátku řádků. Skoky v souborech jsou od pradávna běžně používané a proto velmi rychlé. Celý program je pak sledem pár příkazů:

    private void Page_Load(object sender, System.EventArgs e)

    {

     

       // odchytime vstupni souradnice

       int X = Int32.Parse(Request.QueryString.Get("x"));

       int Y = Int32.Parse(Request.QueryString.Get("y"));

     

       // do hlavicky odpovedi dosadime, ze se jedna o obrazek

       Response.ContentType = "image/jpeg";

     

       String strBitmapFile = @"D:\Cesta\k\souboru\data\praha.rgb";

     

       // originalni velikosti obrazku

       int OriginalWidth = 1600;

       int OriginalHeight = 1200;

     

       int Width = 300;

       int Height = 300;

     

       // aktualni levy horni roh vyrezu

       int SeekX = X;

       int SeekY = Y;

     

       // dochytani souradnic mimo obrazek <0

       if (SeekX < 0) SeekX = 0;

       if (SeekY < 0) SeekY = 0;

     

       // totez, ale > jak rozmery obrazku

       if (SeekX > OriginalWidth - Width) SeekX = OriginalWidth - Width;

       if (SeekY > OriginalHeight - Height) SeekY = OriginalHeight - Height;

     

       FileStream fs =

            new FileStream(strBitmapFile, FileMode.Open, FileAccess.Read);

       byte[] bin = new byte[Width*Height*3];

       // cyklujem celou vyskou obrazku

       for (int i=0; i<Height; i++)

       {

               // skocime na pozici, kde skutecne zacina radek

               fs.Seek((OriginalWidth*3)*(SeekY+i)+SeekX*3, SeekOrigin.Begin);

               fs.Read(bin, i*Width*3, Width*3);

       }

     

       fs.Close();

     

       // Vytvor bitmapu

       System.Drawing.Bitmap Obr =

           new Bitmap(Width, Height, PixelFormat.Format24bppRgb);

     

       // vytvor bitmapu z dat (cyklujem celou mrizkou bodu)

       for(int i=0; i<Height; i++)

               for(int j=0; j<Width; j++)

               {

                       Obr.SetPixel(j, i, Color.FromArgb(bin[(i*Height+j)*3+0], bin[(i*Height+j)*3+1], bin[(i*Height+j)*3+2]));

               }

     

       // pridame blbinku / informacni textik

       Graphics objGrafika = Graphics.FromImage(Obr);

       objGrafika.DrawString("by Michael – Hepbeg Club 2004", new Font("Arial", 8), Brushes.Black, 5.0f, 5.0f, StringFormat.GenericDefault);

       Obr.Save(Response.OutputStream, ImageFormat.Jpeg);

     

    }

     

    Nejprve vezmeme jako vstup do stránky (z querystringu) souřadnice levého horního rohu. Do hlavičky HTTP odpovědi dáme, že výstupní stream je obrázek (Response.ContentType), dále deklarujem stringovou proměnnou určující umístění hlavního souboru. Deklarujeme také promenné určující velikosti zdroj. a cíl. obrázku. Následuje kontrola levého horního rohu (souřadnice, zda není mimo rozsah), zamezíme tím runtime chybu chybného skoku v souboru. Dále otevřeme soubor a deklarujeme pole bytů ve velikosti výsledného obrázku * 3 složky (red/green/blue).  No a načítáme data do pole, přičemž si skáčeme vždy na pozici, kde je začátek řádku výsledného obrázku. Po načtení dat, zavřeme soubor, vytvoříme bitmapu (System.Drawing.Bitmap), a nakopírujeme data – pixel po pixelu do bitmapy. Přidáme informační text a výsledek naší práce uložíme, v našem případě do výstupního streamu ASPx stránky, ale můžeme i do souboru... Hlavní ovládací stránka ale bude obyčejná HTML stránka s IFRAME, kde budeme načítat obrázek. Na stránku dáme ještě 4 obrázky, pro směr posunu a jednoduchý klientský script, který bude občerstvovat IFRAME. Takto může vypadat JS:

    <SCRIPT LANGUAGE="JavaScript">

     

            // 2004 by Michael

     

            var intAktX = 870;

            var intAktY = 580;

            var cstPlus = 290;              // pripocitaci / odecitaci promenna

     

            function fncNahoru()  { intAktY -= cstPlus; fncOdesli(); }

            function fncDolu()    { intAktY += cstPlus; fncOdesli(); }

            function fncDoleva()  { intAktX -= cstPlus; fncOdesli(); }

            function fncDoprava() { intAktX += cstPlus; fncOdesli(); }

     

            function fncOdesli()

            {

                    var elmCurr = document.getElementById('MyIFrame');

                    elmCurr.src = 'str_obr.aspx?x='+ intAktX + '&y=' + intAktY;

            }

     

    </SCRIPT>

     

    Tady je ukázka a tady pak zdrojové soubory.

    Nepředpokládám valné použití stránkování obrázku (hlavně kvůli velikosti zdrojového souboru :-), spíše popsaný postup lze bezproblému modifikovat a použít např. pro hromadné rozesílání novoročních pozdravů speciálně modifikované pro každého zákazníka (budou např. v databázi), může se takto vytvářet on-line výstupní grafy (tuším že některé zde použité objekty mají jíž nějaké metody na grafy např. koláčový zabudované), různé statistiky apod. ve fantazii se meze nekladou, tak vše, příště konečně začněme rozebírat 8 dam.

    Zdraví Michael



    Související články:
    Silent Night v .NET (19.12.2004)
    8 dam WEB.NET aplikace (asp.net) + conzolova aplikace .NET (09.12.2004)
    8 dam WINdows .NET aplikace (05.12.2004)
    8 dam (konzolová aplikace) v .NET (11.11.2004)
    ADO.NET a kontroly v ASP.NET (10.06.2004)
    Úvod do ASP.NET (08.05.2004)
    Platforma MS.NET (27.01.2004)

    Autor:Michael Stavěla|Komentářů: 2|Přidej!|Informační e-mailVytisknout článek

      Novinky

    20.02.2007: BETA verze int fora pro phpRS 28x
    BETA verze Int fora pro phpRS 280/281 je zde. Je to jenom prosté přepsání do nové verze bez plánovaných změn funkčnosti. Zejména prozatím nepodporuje systém levelů.

    17.09.2006: Spamy ve fóru
    měli jsme trochu problémy se spamem ve foru, které je trochu starší provenience (v současné době se s velkými přestávkami - máme málo času - snažíme vytvořit verzi pro 280. Tremín nedokážeme odhadnout, je tam jeden poměrně obtížný logický problém) Takže jsme tam aplikovali jednu poměrně primitivní ochranu, kterou nyní musíme vložit do nové verze. Snad to na chvíli vydrží.

    13.03.2006: Nový článek
    po hodně dlouhé době. Doufáme, že přibudou další. Náměty by byly, ale čas není.

    20.02.2006: Oprava chyby
    V intforu alfa_5, která znemožňovala přihlášení do "privátních" témat. Opravený balíček s aktualizovanou verzí slovenského slovníku najdete v downloadu. Postačí aktualizovat soubory kifosmer.php a kifosmer2.php + slovníkový soubor (adresář kifo/slovnik/kifosl.sk.php)


      Fórum
    přidáno: včera
    Re:slots for...
    "<a href=" http://www.f . . . "
    (diskuze: O tomto fóru)
    přidáno: včera
    Re:slots for...
    "this post is fantastic <a h . . . "
    (diskuze: O tomto fóru)
    přidáno: včera
    Re:slots for...
    "Hello good day <a href=&quo . . . "
    (diskuze: O tomto fóru)

      Plánované akce

  • Kalendář akcí

  •   testovací blok
     Cyklo
     Informace
     M$.NET
     Microsoft
     MySQL
     Office
     PHP
     phpRS
     Příroda
     Testovací

    30.07.2010 : Bořivoj | Hlavní stránka | Seznam rubrik | Download | Weblinks | Návštěvní kniha | Web site powered by phpRS

    © 2002,2003 - Kryšpín & Špíček. Postaveno na redakčním systému phpRS .
    Tyto stránky podporuje firma IDT | Odkazy: ČáslavskoMCCe-firmaV.N.