using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
public class ImageWaterMark
{
/// <summary>
/// 图片水印
/// </summary>
/// <param name="img"> 图片 </param>
/// <param name="filename"> 保存文件名 </param>
/// <param name="watermarkFilename"> 水印文件名 </param>
/// <param name="watermarkStatus"> 图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下 </param>
/// <param name="quality"> 附加水印图片质量,0-100 </param>
/// <param name="watermarkTransparency"> 水印的透明度 1--10 10为不透明 </param>
public static void AddImageSignPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
{
Graphics g = Graphics.FromImage(img);
// 设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
// 设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
Image watermark = new Bitmap(watermarkFilename);
if (watermark.Height >= img.Height || watermark.Width >= img.Width)
{
return ;
}
ImageAttributes imageAttributes = new ImageAttributes();
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb( 255 , 0 , 255 , 0 );
colorMap.NewColor = Color.FromArgb( 0 , 0 , 0 , 0 );
ColorMap[] remapTable = { colorMap };
imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
float transparency = 0.5F ;
if (watermarkTransparency >= 1 && watermarkTransparency <= 10 )
{
transparency = (watermarkTransparency / 10.0F );
}
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 colorMatrix = new ColorMatrix(colorMatrixElements);
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
int xpos = 0 ;
int ypos = 0 ;
switch (watermarkStatus)
{
case 1 :
xpos = ( int )(img.Width * ( float ). 01 );
ypos = ( int )(img.Height * ( float ). 01 );
break ;
case 2 :
xpos = ( int )((img.Width * ( float ). 50 ) - (watermark.Width / 2 ));
ypos = ( int )(img.Height * ( float ). 01 );
break ;
case 3 :
xpos = ( int )((img.Width * ( float ). 99 ) - (watermark.Width));
ypos = ( int )(img.Height * ( float ). 01 );
break ;
case 4 :
xpos = ( int )(img.Width * ( float ). 01 );
ypos = ( int )((img.Height * ( float ). 50 ) - (watermark.Height / 2 ));
break ;
case 5 :
xpos = ( int )((img.Width * ( float ). 50 ) - (watermark.Width / 2 ));
ypos = ( int )((img.Height * ( float ). 50 ) - (watermark.Height / 2 ));
break ;
case 6 :
xpos = ( int )((img.Width * ( float ). 99 ) - (watermark.Width));
ypos = ( int )((img.Height * ( float ). 50 ) - (watermark.Height / 2 ));
break ;
case 7 :
xpos = ( int )(img.Width * ( float ). 01 );
ypos = ( int )((img.Height * ( float ). 99 ) - watermark.Height);
break ;
case 8 :
xpos = ( int )((img.Width * ( float ). 50 ) - (watermark.Width / 2 ));
ypos = ( int )((img.Height * ( float ). 99 ) - watermark.Height);
break ;
case 9 :
xpos = ( int )((img.Width * ( float ). 99 ) - (watermark.Width));
ypos = ( int )((img.Height * ( float ). 99 ) - watermark.Height);
break ;
}
g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0 , 0 , watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
// g.DrawImage(watermark, new System.Drawing.Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, System.Drawing.GraphicsUnit.Pixel);
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null ;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType.IndexOf( " jpeg " ) > - 1 )
{
ici = codec;
}
}
EncoderParameters encoderParams = new EncoderParameters();
long [] qualityParam = new long [ 1 ];
if (quality < 0 || quality > 100 )
{
quality = 80 ;
}
qualityParam[ 0 ] = quality;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
encoderParams.Param[ 0 ] = encoderParam;
if (ici != null )
{
img.Save(filename, ici, encoderParams);
}
else
{
img.Save(filename);
}
g.Dispose();
img.Dispose();
watermark.Dispose();
imageAttributes.Dispose();
}
/// <summary>
/// 文字水印
/// </summary>
/// <param name="img"> 图片 </param>
/// <param name="filename"> 保存文件名 </param>
/// <param name="watermarkText"> 水印文字 </param>
/// <param name="watermarkStatus"> 图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下 </param>
/// <param name="quality"> 附加水印图片质量,0-100 </param>
/// <param name="fontname"> 字体 </param>
/// <param name="fontsize"> 字体大小 </param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
{
Graphics g = Graphics.FromImage(img);
Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
SizeF crSize;
crSize = g.MeasureString(watermarkText, drawFont);
float xpos = 0 ;
float ypos = 0 ;
switch (watermarkStatus)
{
case 1 :
xpos = ( float )img.Width * ( float ). 01 ;
ypos = ( float )img.Height * ( float ). 01 ;
break ;
case 2 :
xpos = (( float )img.Width * ( float ). 50 ) - (crSize.Width / 2 );
ypos = ( float )img.Height * ( float ). 01 ;
break ;
case 3 :
xpos = (( float )img.Width * ( float ). 99 ) - crSize.Width;
ypos = ( float )img.Height * ( float ). 01 ;
break ;
case 4 :
xpos = ( float )img.Width * ( float ). 01 ;
ypos = (( float )img.Height * ( float ). 50 ) - (crSize.Height / 2 );
break ;
case 5 :
xpos = (( float )img.Width * ( float ). 50 ) - (crSize.Width / 2 );
ypos = (( float )img.Height * ( float ). 50 ) - (crSize.Height / 2 );
break ;
case 6 :
xpos = (( float )img.Width * ( float ). 99 ) - crSize.Width;
ypos = (( float )img.Height * ( float ). 50 ) - (crSize.Height / 2 );
break ;
case 7 :
xpos = ( float )img.Width * ( float ). 01 ;
ypos = (( float )img.Height * ( float ). 99 ) - crSize.Height;
break ;
case 8 :
xpos = (( float )img.Width * ( float ). 50 ) - (crSize.Width / 2 );
ypos = (( float )img.Height * ( float ). 99 ) - crSize.Height;
break ;
case 9 :
xpos = (( float )img.Width * ( float ). 99 ) - crSize.Width;
ypos = (( float )img.Height * ( float ). 99 ) - crSize.Height;
break ;
}
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1 , ypos + 1 );
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null ;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType.IndexOf( " jpeg " ) > - 1 )
{
ici = codec;
}
}
EncoderParameters encoderParams = new EncoderParameters();
long [] qualityParam = new long [ 1 ];
if (quality < 0 || quality > 100 )
{
quality = 80 ;
}
qualityParam[ 0 ] = quality;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
encoderParams.Param[ 0 ] = encoderParam;
if (ici != null )
{
img.Save(filename, ici, encoderParams);
}
else
{
img.Save(filename);
}
g.Dispose();
// bmp.Dispose();
img.Dispose();
}
}
调用:
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
System.Drawing.Image img = System.Drawing.Image.FromStream(InputFile1.PostedFile.InputStream);//用上传控件加载图片
//System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath("~/bb.jpg"));//用加字件加载图片
string fileName = Server.MapPath("~/aa.jpg");
string waterName = Server.MapPath("~/water.jpg");
//图片水印
ImageWaterMark.AddImageSignPic(img, fileName, waterName, 3, 80, 6);
//文字水印
//ImageWaterMark.AddImageSignText(img, fileName, "水印测试", 3, 100, "宋体", 12);