水印类型枚举 
/// <summary> 
    /// 水印类型 
    /// </summary> 
    public enum WaterMarkTypeEnum 
    { 
        /// <summary> 
        /// 文字 
        /// </summary> 
        Text = 1, 
        /// <summary> 
        /// 图片 
        /// </summary> 
        Image = 2, 
        /// <summary> 
        /// 无水印 
        /// </summary> 
        NoneMark = 3 
    } 
水印帮助类(自己封装的,有bug可以像我反馈) 
/// <summary> 
/// 水印帮助类 
/// </summary> 
public class WaterMarkHelper 
{ 
    #region 设置水印 
    /// <summary> 
    /// 设置水印 
    /// </summary> 
    /// <param name="imgPath"></param> 
    /// <param name="model"></param> 
    /// <returns></returns> 
    public static Image SetWaterMark(string imgPath, WaterMark model) 
    { 
        //获取背景图 
        Image imgSource = Image.FromFile(imgPath); 
        //获取水印图片 
        Image markImg = null; 
  
        //水印检验(文字,图片[路径下是否存在图片]) 
        #region 水印校验+水印处理 
        if (model == null) 
        { 
            return null; 
        } 
        //看看原图是否存在 
        if (!System.IO.File.Exists(imgPath)) 
        { 
            return null; 
        } 
        //根据水印类型校验+水印处理 
        switch (model.WaterMarkType) 
        { 
            case WaterMarkAPP.Enums.WaterMarkTypeEnum.Text: 
                if (string.IsNullOrEmpty(model.Text)) 
                { 
                    return null; 
                } 
                else 
                { 
                    markImg = TextToImager(model);//水印处理-如果是文字就转换成图片 
                } 
                break; 
            case WaterMarkAPP.Enums.WaterMarkTypeEnum.Image: 
                if (!System.IO.File.Exists(model.ImgPath)) 
                { 
                    return null; 
                } 
                else 
                { 
                    //获得水印图像           
                    markImg = Image.FromFile(model.ImgPath); 
                } 
                break; 
            case WaterMarkAPP.Enums.WaterMarkTypeEnum.NoneMark: 
                return imgSource; 
        } 
        #endregion 
  
        #region 创建颜色矩阵 
        //创建颜色矩阵 
        float[][] ptsArray ={ 
                             new float[] {1, 0, 0, 0, 0}, 
                             new float[] {0, 1, 0, 0, 0}, 
                             new float[] {0, 0, 1, 0, 0}, 
                             new float[] {0, 0, 0, model.Transparency, 0}, //注意:0.0f为完全透明,1.0f为完全不透明 
                             new float[] {0, 0, 0, 0, 1}}; 
        ColorMatrix colorMatrix = new ColorMatrix(ptsArray); 
        //新建一个Image属性 
        ImageAttributes imageAttributes = new ImageAttributes(); 
        //将颜色矩阵添加到属性 
        imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default); 
        #endregion 
  
        //原图格式检验+水印 
        #region 原图格式检验+水印 
  
        //判断是否是索引图像格式 
        if (imgSource.PixelFormat == PixelFormat.Format1bppIndexed || imgSource.PixelFormat == PixelFormat.Format4bppIndexed || imgSource.PixelFormat == PixelFormat.Format8bppIndexed) 
        { 
            #region 索引图片,转成位图再加图片 
            //转成位图,这步很重要 
            Bitmap bitmap = new Bitmap(imgSource.Width, imgSource.Height); 
            Graphics graphic = Graphics.FromImage(bitmap); 
  
            #region 缩放处理 
            //如果原图小于水印图片 等比缩放水印图 
            if (markImg.Width >= imgSource.Width || markImg.Height >= imgSource.Height) 
            { 
                markImg = ImageShrink(imgSource, markImg); 
            } 
            #endregion 
  
            #region 水印位置 
            //水印位置 
            int x; 
            int y; 
            WaterMarkLocations(model, imgSource, markImg, out x, out y); 
            #endregion 
  
            //将原图画在位图上 
            graphic.DrawImage(imgSource, new Point(0, 0)); 
  
            //将水印加在位图上 
            graphic.DrawImage(markImg, new Rectangle(x, y, markImg.Width, markImg.Height), 0, 0, markImg.Width, markImg.Height, GraphicsUnit.Pixel, imageAttributes); 
  
            graphic.Dispose(); 
            return bitmap; 
            #endregion 
        } 
        else 
        { 
            #region 非索引图片,直接在上面加上水印 
            Graphics graphic = Graphics.FromImage(imgSource); 
  
            #region 缩放处理 
            //如果原图小于水印图片 等比缩放水印图 
            if (markImg.Width >= imgSource.Width || markImg.Height >= imgSource.Height) 
            { 
                markImg = ImageShrink(imgSource, markImg); 
            } 
            #endregion 
  
            #region 水印位置 
            //水印位置 
            int x; 
            int y; 
            WaterMarkLocations(model, imgSource, markImg, out x, out y); 
            #endregion 
  
            //将水印加在原图上 
            graphic.DrawImage(markImg, new Rectangle(x, y, markImg.Width, markImg.Height), 0, 0, markImg.Width, markImg.Height, GraphicsUnit.Pixel, imageAttributes); 
  
            graphic.Dispose(); 
            return imgSource; 
            #endregion 
        } 
        #endregion 
    } 
    #endregion 
  
    #region 水印处理-文字转图片 
    /// <summary> 
    /// 水印处理-文字转图片 
    /// </summary> 
    /// <param name="model"></param> 
    /// <returns></returns> 
    private static Image TextToImager(WaterMark model) 
    { 
        Font f = new Font(model.FontFamily, model.FontSize, model.FontStyle); 
        Bitmap fbitmap = new Bitmap(Encoding.GetEncoding("GBK").GetByteCount(model.Text) / 2 * f.Height, f.Height); 
        Graphics gh = Graphics.FromImage(fbitmap);//创建一个画板; 
        gh.SmoothingMode = SmoothingMode.AntiAlias; 
        gh.DrawString(model.Text, f, model.BrushesColor, 0, 0);//画字符串 
        return fbitmap as Image; 
    } 
    #endregion 
  
    #region 水印位置 
    /// <summary> 
    /// 水印位置 
    /// </summary> 
    /// <param name="model"></param> 
    /// <param name="imgSource"></param> 
    /// <param name="markImg"></param> 
    /// <param name="x"></param> 
    /// <param name="y"></param> 
    private static void WaterMarkLocations(WaterMark model, Image imgSource, Image markImg, out int x, out int y) 
    { 
        x = 0; 
        y = 0; 
        switch (model.WaterMarkLocation) 
        { 
            case WaterMarkLocationEnum.TopLeft: 
                x = 0; 
                y = 0; 
                break; 
            case WaterMarkLocationEnum.TopCenter: 
                x = imgSource.Width / 2 - markImg.Width / 2; 
                y = 0; 
                break; 
            case WaterMarkLocationEnum.TopRight: 
                x = imgSource.Width - markImg.Width; 
                y = 0; 
                break; 
            case WaterMarkLocationEnum.CenterLeft: 
                x = 0; 
                y = imgSource.Height / 2 - markImg.Height / 2; 
                break; 
            case WaterMarkLocationEnum.CenterCenter: 
                x = imgSource.Width / 2 - markImg.Width / 2; 
                y = imgSource.Height / 2 - markImg.Height / 2; 
                break; 
            case WaterMarkLocationEnum.CenterRight: 
                x = imgSource.Width - markImg.Width; 
                y = imgSource.Height / 2 - markImg.Height / 2; 
                break; 
            case WaterMarkLocationEnum.BottomLeft: 
                x = 0; 
                y = imgSource.Height - markImg.Height; 
                break; 
            case WaterMarkLocationEnum.BottomCenter: 
                x = imgSource.Width / 2 - markImg.Width / 2; 
                y = imgSource.Height - markImg.Height; 
                break; 
            case WaterMarkLocationEnum.BottomRight: 
                x = imgSource.Width - markImg.Width; 
                y = imgSource.Height - markImg.Height; 
                break; 
        } 
    } 
    #endregion 
  
    #region 缩放水印 
    /// <summary> 
    /// 等比缩放水印图(缩小到原图的1/3) 
    /// </summary> 
    /// <param name="imgSource"></param> 
    /// <param name="successImage"></param> 
    /// <returns></returns> 
    private static Image ImageShrink(Image imgSource, Image markImg) 
    { 
        int w = 0; 
        int h = 0; 
  
        Image.GetThumbnailImageAbort callb = null; 
  
        //对水印图片生成缩略图,缩小到原图的1/3(以短的一边为准)                     
        if (imgSource.Width < imgSource.Height) 
        { 
            w = imgSource.Width / 3; 
            h = markImg.Height * w / markImg.Width; 
        } 
        else 
        { 
            h = imgSource.Height / 3; 
            w = markImg.Width * h / markImg.Height; 
        } 
        markImg = markImg.GetThumbnailImage(w, h, callb, new System.IntPtr()); 
        return markImg; 
    } 
    #endregion 
} |