多次写文字到图片上的水印效果

1.方法   

    /// <summary>
    /// 在图片上添加水印文字
    /// </summary>
    /// <param name="sourcePicture">源图片文件</param>
    /// <param name="waterWords">需要添加到图片上的文字</param>
    /// <param name="fontSize">字体大小</param>
    /// <param name="paddingLeft">文字离左边的距离</param>
    /// <param name="paddingTop">文字离上边的距离</param>
    /// <param name="alpha">透明度</param>
    /// <param name="color">文字颜色</param>
    /// <param name="PicturePath">文件路径</param>
    /// <param name="bSave">是否保存</param>
    /// <param name="fileName">保存文件名称</param>
    /// <param name="img">图片文件对象</param>
    /// <returns>返回文件保存路径,如果不保存,则返回为string.Empty</returns>
    public string DrawWords(string sourcePicture, string waterWords, float fontSize, float paddingLeft, float paddingTop, float alpha,Color color, string PicturePath,bool bSave,string fileName, ref Image img)
    {       
        //创建一个图片对象用来装载要被添加水印的图片
        Image imgPhoto = null;
        string targetImage = string.Empty;      

        if (img != null)
        {
            imgPhoto = img;
        }
       
        if (img == null || bSave)
        {
            // 判断参数是否有效
            if (sourcePicture == string.Empty || waterWords == string.Empty || alpha == 0.0 ||
                (bSave && PicturePath == string.Empty))
            {
                return targetImage;
            }

            // 源图片全路径
            string sourcePictureName = PicturePath + sourcePicture;
            targetImage = sourcePictureName.Replace(System.IO.Path.GetExtension(sourcePictureName), "") + fileName;

            if (img == null)
            {
                imgPhoto = Image.FromFile(sourcePictureName);
            }
        }

        //获取图片的宽和高
        int phWidth = imgPhoto.Width;
        int phHeight = imgPhoto.Height;

        //建立一个bitmap,和我们需要加水印的图片一样大小
        Bitmap bmPhoto = new Bitmap(phWidth, phHeight, PixelFormat.Format24bppRgb);

        //SetResolution:设置此 Bitmap 的分辨率
        //这里直接将我们需要添加水印的图片的分辨率赋给了bitmap
        bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

        //Graphics:封装一个 GDI+ 绘图图面。
        Graphics grPhoto = Graphics.FromImage(bmPhoto);

        //设置图形的品质
        grPhoto.SmoothingMode = SmoothingMode.AntiAlias;

        //将我们要添加水印的图片按照原始大小描绘(复制)到图形中
        grPhoto.DrawImage(
         imgPhoto,                                           //   要添加水印的图片
         new Rectangle(0, 0, phWidth, phHeight), //  根据要添加的水印图片的宽和高
         0,                                                     //  X方向从0点开始描绘
         0,                                                     // Y方向
         phWidth,                                            //  X方向描绘长度
         phHeight,                                           //  Y方向描绘长度
         GraphicsUnit.Pixel);                              // 描绘的单位,这里用的是像素
       
        //字体
        Font crFont = null;
        //矩形的宽度和高度,SizeF有三个属性,分别为Height高,width宽,IsEmpty是否为空
        SizeF crSize = new SizeF();

        //直到它的长度比图片的宽度小
        crFont = new Font("arial", fontSize, FontStyle.Regular);
        //测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。
        crSize = grPhoto.MeasureString(waterWords, crFont);

        //截边5%的距离,定义文字显示(由于不同的图片显示的高和宽不同,所以按百分比截取)
        int yPixlesFromBottom = (int)(phHeight * .05);

        //定义在图片上文字的大小
        float wmHeight = crSize.Height;
        float wmWidth = crSize.Width;

        //定义在图片上文字的位置
        float xPosOfWm;
        float yPosOfWm;

        if (paddingLeft > 0)
        {
            xPosOfWm = paddingLeft;
        }
        else
        {
            xPosOfWm = phWidth / 2;
        }

        if (paddingTop > 0)
        {
            yPosOfWm = paddingTop;
        }
        else
        {
            yPosOfWm = phHeight / 2;
        }
       
        //封装文本布局信息(如对齐、文字方向和 Tab 停靠位),显示操作(如省略号插入和国家标准 (National) 数字替换)和 OpenType 功能。
        StringFormat StrFormat = new StringFormat();

        //定义需要印的文字居中对齐
        StrFormat.Alignment = StringAlignment.Center;

        //SolidBrush:定义单色画笔。画笔用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径。
        //这个画笔为描绘阴影的画笔,呈灰色
        int m_alpha = Convert.ToInt32(256 * alpha);

        //从四个 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构,这里设置透明度为153
        //这个画笔为描绘正式文字的笔刷,呈白色
        SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(m_alpha, color.R, color.G, color.B));

        //第二次绘制这个图形,建立在第一次描绘的基础上
        grPhoto.DrawString(waterWords,                 //string of text
                                   crFont,                                   //font
                                   semiTransBrush,                           //Brush
                                   new PointF(xPosOfWm, yPosOfWm),  //Position
                                   StrFormat);

        //imgPhoto是我们建立的用来装载最终图形的Image对象
        //bmPhoto是我们用来制作图形的容器,为Bitmap对象
        imgPhoto = bmPhoto;
        //释放资源,将定义的Graphics实例grPhoto释放,grPhoto功德圆满
        grPhoto.Dispose();

        if (bSave)
        {
            //将grPhoto保存
            imgPhoto.Save(targetImage, ImageFormat.Jpeg);
        }
        img = imgPhoto;

        return bSave ? targetImage.Replace(PicturePath, "") : string.Empty;
    }

 

2.调用:

           WaterImageManage water = new WaterImageManage();
            Image img = null;
            water.DrawWords("123.jpg", "姓名:张三", 26, 0, 200, 0.8f, Color.Red, MapPath("/Images/"), false, string.Empty, ref img);
            water.DrawWords("", "手机:18607552350", 26, 0, 200, 0.8f, Color.Red, MapPath("/Images/"), false, string.Empty, ref img);
            water.DrawWords("", "QQ:8474939612", 20, 0, 240, 0.8f, Color.Black, MapPath("/Images/"), true, "123456.jpg", ref img);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值