using System;
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 p_w_picpathAttributes 
= new ImageAttributes();
            ColorMap colorMap 
= new ColorMap();
            colorMap.OldColor 
= Color.FromArgb(25502550);
            colorMap.NewColor 
= Color.FromArgb(0000);
            ColorMap[] remapTable 
= { colorMap };
            p_w_picpathAttributes.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.0f0.0f},
                                                
new float[] {0.0f,  1.0f,  0.0f,  0.0f0.0f},
                                                
new float[] {0.0f,  0.0f,  1.0f,  0.0f0.0f},
                                                
new float[] {0.0f,  0.0f,  0.0f,  transparency, 0.0f},
                                                
new float[] {0.0f,  0.0f,  0.0f,  0.0f1.0f}
                                            };
            ColorMatrix colorMatrix 
= new ColorMatrix(colorMatrixElements);
            p_w_picpathAttributes.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), 00, watermark.Width, watermark.Height, GraphicsUnit.Pixel, p_w_picpathAttributes);
            
//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();
            p_w_picpathAttributes.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();
        }
    }

调用:
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, 3806);
            
//文字水印
            
//ImageWaterMark.AddImageSignText(img, fileName, "水印测试", 3, 100, "宋体", 12);