Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

.NET i jiné ...

... ale u mne to funguje !

Generování PNG obrázku v ASP.NET 2.0

Po skoro 2 hodinách jsem zvítězil nad strojem. Protože to nebylo jednoduché a třeba se to bude hodit, tak se pochlubím:

1. Chci vygenerovat obrázek v ASP.NET (FW 2.0). Tak jsem vzal jeden ze svých příkladů na Handlery:

using (Bitmap bmp = new Bitmap(bmpWidth, bmpHeight))
{
  using (Graphics gr = Graphics.FromImage(bmp))

  {
    gr.FillRectangle(new SolidBrush(bar), 0, 0, bmp.Width, bmp.Height);

    context.Response.ContentType = "image/gif";

    bmp.Save(context.Response.OutputStream, ImageFormat.Gif);

  }

}

2. Když jsem ale zalaboroval s barvičkami, tak se v tom výsledném GIFu vykreslovaly jen pomocí základní 16-barevné palety, čili "ošklivý" dithering. A začalo zkoušení a zjišťování, co s tím:

2a. Vytvoření bitmapy s PixelFormat.Format8bppIndexed nelze - nejde vytvořit příslušní Graphics objekt

2b. Fígle s paletou - nepřišel jsem na to, jak přidat barvy, bmp.Palette.Entries je pouze Get

2c. Našel jsem příslušný renderer pomocí ImageCodecInfo.GetImageEncoders() (a vybrat ten s MimeType == "image/gif"), zkusit nastavit (přidat) v EncoderParameters další, konkrétně Encoder.ColorDepth - bez efektu

2d. Pro parametry enkoderu nastavit Encoder.RenderMethod, (long)EncoderValue.VersionGif89 - nic ...

2e. Vzpoměl jsem si že existuje PNG a ten s barvičkama zachází lépe, ale triviální záměna GIF -> PNG selhala s GDI+ chybou - dost nesmyslnou

3. Našel a ověřil jsem řešení, PNG totiž vyžaduje seekovatelný stream a tak je tam berlička:

context.Response.ContentType = "image/png";

using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
  bmp.Save(ms, ImageFormat.Png);

  ms.WriteTo(context.Response.OutputStream);
}

... možná existuje elegantnější řešení, ale toto konečně chodí ...

Zveřejněno 7. ledna 2008 23:39 by atasoft

Komentář

 

hojdysoft napsal:

Bezva, řešil jsem toto zrovna před dvěma dny a používám to samé řešení.

(A pan Google říkal že většina (neli všichni) také.

David.

ledna 8, 2008 11:18
Neregistrovaní uživatele nemužou přidávat komentáře.

Syndication

Archives

Powered by Community Server (Personal Edition), by Telligent Systems
Vyvojar.cz na prodej!