.net asp.net 图片添加水印 文字水印 图片图透明水印 按百分比设置图片水印 生成透明图片

   本人新手,刚入职几个月很菜想结交些业内人进行交流学习,希望各位前辈们多多指点。前几天公司要我写个水印,要求比较活 文字水印要求:自己编辑文字,编辑字体大小,可以自己设置水印x、y坐标,颜色,透明百分比,文字显示方式(文字横排显示或竖排显示)。图片水印要求:图片水印x、y坐标,图片透明百分比等。

   我从网上找了很多都不全,然后自己去查文档终于写出来了,虽然并不是太好,但想分享下给大家。

文字水印

#region 添加文字水印
        /// <summary>
        /// 添加文字水印
        /// </summary>
        /// <param name="originalPath">图片原路径</param>
        /// <param name="targetPath">图片目标路径</param>
        /// <param name="text">图片文字</param>
        /// <param name="x">x坐标</param>
        /// <param name="y">y坐标</param>
        /// <param name="textSize">文字大小</param>
        /// <param name="Transparent">水印图片透明百分比</param>
        /// <param name="r">文字颜色r</param>
        /// <param name="g">文字颜色g</param>
        /// <param name="b">文字颜色b</param>
        /// <param name="isAnyway">文字是否横屏显示</param>
        public void WatermarkText(string originalPath, string targetPath, string text, int x, int y, int textSize, int Transparent, int r, int g, int b, bool isAnyway=false) 
        {
            try
            {
                System.Drawing.Image image = image = System.Drawing.Image.FromFile(originalPath);
                Graphics graphics = Graphics.FromImage(image);
                graphics.DrawImage(image, 0, 0, image.Width, image.Height);
                Font f = new Font("Verdana", textSize, FontStyle.Bold);//字体样式
                //计算文字高度和宽度
                //Size sz = TextRenderer.MeasureText(text, f);
                //int textHeight = sz.Height; ////int textWidth = sz.Width; ////int height = y + textHeight;
                //int width = x + textWidth;
                if (image.Height < y) throw new Exception("水印高度超出图片高度!");
                if (image.Width < x) throw new Exception("水印宽度超出图片宽度!");
                int tran = (int)(255 - (Transparent * 2.55));
                Brush brush = new SolidBrush(Color.FromArgb(tran, r, g, b));
                StringFormat drawFormat = new StringFormat { FormatFlags = StringFormatFlags.DirectionVertical };

                //drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;
                if (isAnyway)
                    graphics.DrawString(text, f, brush, x, y, drawFormat);
                else
                    graphics.DrawString(text, f, brush, x, y);
                f.Dispose();
                brush.Dispose();
                drawFormat.Dispose();
                graphics.Dispose();

                //保存加水印过后的图片,删除原始图片
                image.Save(targetPath);
                image.Dispose();
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

上面代码我添加了个计算文字高度和宽的方法,后来没用。文字颜色我是取的rgb值 三个值是分别传过来的 。前面设置没花多长时间,就是文字显示方式花了我很长时间,去网上找了很久都没找到 最后查文档 终于被我找到。

图片水印:

#region 添加图片水印透明度
        /// <summary>
        /// 添加图片水印
        /// </summary>
        /// <param name="originalPath">图片原图路径</param>
        /// <param name="watermarkPath">水印图片</param>
        /// <param name="targetPath">目标路径</param>
        /// <param name="transparentImage">生成透明水印图片保存路径</param>
        /// <param name="x">水印位置x坐标</param>
        /// <param name="y">水印位置y坐标</param>
        /// <param name="transparent">水印图片透明百分比</param>
        public void WatermarkImagesTransparent(string originalPath, string watermarkPath, string targetPath, string transparentImage, int x, int y, int transparent) 
        {
            try
            {
                System.Drawing.Image image = image = System.Drawing.Image.FromFile(originalPath);
                System.Drawing.Image copyImage = System.Drawing.Image.FromFile(watermarkPath);
                if (image.Height < y) throw new Exception("水印高度超出图片高度!");
                if (image.Width < x) throw new Exception("水印宽度超出图片宽度!");
                Graphics graphics = Graphics.FromImage(image);//画板
                
                copyImage = Transparent(copyImage, transparentImage, transparent);//生成透明图片并返回
                graphics.DrawImage(
                    copyImage, //水印图片
                    new Rectangle(x, y, copyImage.Width, copyImage.Height), //水印图片的坐标x,y和水印图片的宽高
                    0, 0, copyImage.Width,
                    copyImage.Height, GraphicsUnit.Pixel
                    );
                graphics.Dispose();
                //保存加水印过后的图片,删除原始图片
                image.Save(targetPath);
                image.Dispose();
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region 生成透明图片
        /// <summary>
        ///  生成透明图片
        /// </summary>
        /// <param name="image">水印图片</param>
        /// <param name="transparentImage">透明图片保存路径</param>
        /// <param name="transparent">透明百分比</param>
        /// <returns>返回透明图片</returns>
        public Image Transparent(Image image,string transparentImage, int transparent) 
        {
            float iiii = (float)(transparent / 100.0);
            float[][] nArray ={ 
            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,  iiii, 0.0f},
            new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}}; //颜色变换矩阵的一种简便方法iiii位置是设置透明度的范围0到1中的单精度类型
            ColorMatrix matrix = new ColorMatrix(nArray); //定义一个 5 x 5 矩阵
            ImageAttributes attributes = new ImageAttributes();
            attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            Bitmap resultImage = new Bitmap(image.Width, image.Height);//图片流
            Graphics g = Graphics.FromImage(resultImage);
            g.DrawImage(
                image,
                new Rectangle(0, 0, image.Width, image.Height),
                0, 0, image.Width, image.Height, 
                GraphicsUnit.Pixel, attributes
                );
            resultImage.Save(transparentImage);//保存图片
            System.Drawing.Image img = image = System.Drawing.Image.FromFile(transparentImage);
            return img;
        }
        #endregion

图片水印从网上找有很多,但全的还是不多,我写了个全点的透明度水印,透明图片也查了很多资料才弄出来,是用。net只带的5*5矩阵实现的,iiii部分是计算后透明百分比,(值范围0.0到1.0为单精度值)注意切记 如果你要直接写值的话后面加个f(例如0.1f),不加会报错,这个我也不知道为什么。

如果不需要图片透明只要把 

copyImage = Transparent(copyImage, transparentImage, transparent);//生成透明图片并返回

这段代码注释就ok了,下面的方法也可以单独使用。这里为了方便直接返回成image格式。

小弟初涉it行业很多都不怎么懂,写的不好请各位多加指点。

 

posted @ 2013-01-17 13:05  Programmer.Wei  阅读(666)  评论(0)    收藏  举报