Poznámka: články jsou již mnoho let staré, doba se posunula, mnoho věcí v nich doporučovaných je již dnes překonané - berte s rezervou!


Watermarky v ASP.NET

Jak se mi zdá, tak mi nezbude, než dosmrti všechno programovat v ASP.NET paralelně s PHP. No, ale zatím to mě to ještě nezabilo. Takže o tom, co jsou watermarky, k čemu se hodí a jak je přidávat k fotkám automaticky pomocí PHP si můžete přečíst v předešlém článku Watermarky v PHP .

Pokud byste chtěli mimo vložení watermarku u obrázku také upravit velikost, zde je návod, jak obrázky zmenšovat pomocí ASP.NET . Bez jakéhokoliv zdržování se vrhnu rovnou ke kódu, protože ten je o poznání komplikovanější, než ten pro PHP. Jak se zdá, v zájmu co největší jednoduchosti Microsoft v GDI+ nastavil své defaultní hodnoty nějak a člověk, který si chce jen trochu něco poupravit, musí se zavrtat celkem hluboko.

K nastavení úrovně komprese stačilo v PHP specifikovat jeden nepovinnný parametr funkce, v ASP.NET to pojali trošku zeširoka... o tom vypráví poslední část kódu funkce.

Další libůstkou je průhlednost. Donutit watermark k tomu, aby se vykreslil průhledně, se mi nepodařilo jinak, než pomocí matice barev ... Nevím, proč takovéhle funkce, které se podle mne využívají poměrně často (především kvalita komprese jpegu) nelze používat nějak intuitivněji. Ale co už. Funguje to.

protected void watermarkbyimage( string imagepath, //soubor k upraveni string watermarkpath, //soubor s watermarkem (gif) string outputpath, //cesta kam ulozit vysledek float transparency, //pruhlednost watermarku (float 0.0-1.0) int Xoffset, //posunuti watermarku v X souradnici int Yoffset, //posunuti watermarku v Y souradnici ContentAlignment Position ) { Bitmap bmp = new Bitmap(imagepath); Bitmap imagew = new Bitmap(watermarkpath); int xpos = 0; int ypos = 0; //výpočet umístění, nic zajímavého switch (Position) { case ContentAlignment.BottomCenter: { xpos = bmp.Width / 2 - imagew.Width / 2 + Xoffset; ypos = bmp.Height - imagew.Height - Yoffset; break; } case ContentAlignment.BottomLeft: { xpos = 0 + Xoffset; ypos = bmp.Height - imagew.Height - Yoffset; break; } case ContentAlignment.BottomRight: { xpos = bmp.Width - imagew.Width - Xoffset; ypos = bmp.Height - imagew.Height - Yoffset; break; } case ContentAlignment.MiddleCenter: { xpos = bmp.Width / 2 - imagew.Width / 2 + Xoffset; ypos = bmp.Height / 2 - imagew.Height / 2 + Yoffset; break; } case ContentAlignment.MiddleLeft: { xpos = 0 + Xoffset; ypos = bmp.Height / 2 - imagew.Height / 2 + Yoffset; break; } case ContentAlignment.MiddleRight: { xpos = bmp.Width - imagew.Width - Xoffset; ypos = bmp.Height / 2 - imagew.Height / 2 + Yoffset; break; } case ContentAlignment.TopCenter: { xpos = bmp.Width / 2 - imagew.Width / 2 + Xoffset; ypos = 0 + Yoffset; break; } case ContentAlignment.TopLeft: { xpos = 0 + Xoffset; ypos = 0 + Yoffset; break; } case ContentAlignment.TopRight: { xpos = bmp.Width - imagew.Width - Xoffset; ypos = 0 + Yoffset; break; } } ImageAttributes ia = new ImageAttributes(); System.Drawing.Graphics graphics = Graphics.FromImage(bmp); //vzrůšo číslo jedna - potřebujeme průhlednost //kód není můj, ale funguje ImageAttributes imageAttributes = new ImageAttributes(); ColorMap colorMap = new ColorMap(); ColorMap[] remapTable = { colorMap }; imageAttributes.SetRemapTable( remapTable, ColorAdjustType.Bitmap); //tahle matice je to, kvůli čemu tohle všechno //provádíme. Prvek [3,3] určuje míru průhlednosti float[][] colorMatrixElements = { new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, transparency, 0.0f}, new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements); imageAttributes.SetColorMatrix( wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); //teď můžeme vložit watermark s kýženou průhledností //do původního obrázku graphics.DrawImage( imagew, new Rectangle(xpos,ypos, imagew.Width, imagew.Height), 0, 0, imagew.Width, imagew.Height, GraphicsUnit.Pixel, imageAttributes); //vzrůšo číslo dva - snaha snížit //výslednou kompresi obrázku //tento kód jsem našel na netu, //kvalita obrázku je lepší, než pri použití //defaultního bmp.Save, ale možná, //že jsou i lepší nastavení, jak ji ještě zvětšit graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders(); EncoderParameters Params = new EncoderParameters(1); Params.Param[0] = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, 100L); //nyní uložíme obrázek do výstupního souboru bmp.Save(outputpath, Info[1], Params); }

příklad volání:

watermarkbyimage( Server.MapPath("source.jpg"), Server.MapPath("watermark.gif"), Server.MapPath("output.jpg"), 0.4f, //průhlednost 30, //x posunutí 30, //y posunutí ContentAlignment.TopLeft //zarovnání );

Ohodnoťte prosím užitečnost článku




7
 
17
 
9
 
4
 
3
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo: