Watermarky v ASP.NET
- Vložil Trupík 4/13/2006 10:53:28 AM
-
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