using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
/// <summary>
///ImgWater 的摘要说明
/// </summary>
public class ImgWater
{
    public ImgWater()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    /// <summary>
    /// 图片水印
    /// </summary>
    /// <param name="ImgFile">原图文件地址</param>
    /// <param name="WaterImg">水印图片地址</param>
    /// <param name="sImgPath">水印图片保存地址</param>
    /// <param name="Alpha">水印透明度设置</param>
    /// <param name="iScale">水印图片在原图上的显示比例</param>
    /// <param name="intDistance">水印图片在原图上的边距确定,以图片的右边和下边为准,当设定的边距超过一定大小后参数会自动失效</param>
    public bool zzsImgWater(string ImgFile,string WaterImg,string sImgPath,
        float Alpha, float iScale,int intDistance)
    {
        try
        {
            //装载图片
            FileStream fs = new FileStream(ImgFile, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            byte[] bytes = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);
            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);
            int imgPhotoWidth = imgPhoto.Width;
            int imgPhotoHeight = imgPhoto.Height;
            System.Drawing.Image imgWatermark = new Bitmap(WaterImg);
            int imgWatermarkWidth = imgWatermark.Width;
            int imgWatermarkHeight = imgWatermark.Height;
            //计算水印图片尺寸
            decimal aScale = Convert.ToDecimal(iScale);
            decimal pScale = 0.05M;
            decimal MinScale = aScale - pScale;
            decimal MaxScale = aScale + pScale;
            int imgWatermarkWidthNew = imgWatermarkWidth;
            int imgWatermarkHeightNew = imgWatermarkHeight;
            if (imgPhotoWidth >= imgWatermarkWidth && imgPhotoHeight >= imgWatermarkHeight && imgPhotoWidth >= imgPhotoHeight)
                if (imgWatermarkWidth > imgWatermarkHeight)
                    )) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), ) <= MaxScale))
                    {
                    }
                    else
                    {
                        imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                        imgWatermarkHeightNew = Convert.ToInt32((imgPhotoWidth * aScale / imgWatermarkWidth) * imgWatermarkHeight);
                    }
                else
                 )) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), ) <= MaxScale))
                {
                }
                else
                {
                    imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                    imgWatermarkWidthNew = Convert.ToInt32((imgPhotoHeight * aScale / imgWatermarkHeight) * imgWatermarkWidth);
                }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgWatermarkWidth >= imgWatermarkHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight <= imgPhotoHeight && imgPhotoWidth >= imgPhotoHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth <= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgPhotoWidth >= imgPhotoHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            if (imgPhotoWidth >= imgWatermarkWidth && imgPhotoHeight >= imgWatermarkHeight && imgPhotoWidth <= imgPhotoHeight)
                if (imgWatermarkWidth > imgWatermarkHeight)
                    )) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), ) <= MaxScale))
                    {
                    }
                    else
                    {
                        imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                        imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
                    }
                else
                 )) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), ) <= MaxScale))
                {
                }
                else
                {
                    imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                    imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
                }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgWatermarkWidth <= imgWatermarkHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight <= imgPhotoHeight && imgPhotoWidth <= imgPhotoHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth <= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgPhotoWidth <= imgPhotoHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            //将原图画出来
            Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(, );
            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gbmPhoto.Clear(Color.White);
            gbmPhoto.DrawImage(
              imgPhoto
             , , , imgPhotoWidth, imgPhotoHeight)
             ,
             ,
             , imgPhotoWidth
             , imgPhotoHeight
             , GraphicsUnit.Pixel
             );
            Bitmap bmWatermark = new Bitmap(bmPhoto);
            bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
            Graphics gWatermark = Graphics.FromImage(bmWatermark);
            //指定高质量显示水印图片质量
            gWatermark.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gWatermark.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            ImageAttributes imageAttributes = new ImageAttributes();
            //设置两种颜色,达到合成效果
            ColorMap colorMap = new ColorMap();
            colorMap.OldColor = Color.FromArgb(, , , );
            colorMap.NewColor = Color.FromArgb(, , , );
            ColorMap[] remapTable = { colorMap };
            imageAttributes.SetRemapTable(remapTable, System.Drawing.Imaging.ColorAdjustType.Bitmap);
            //用矩阵设置水印图片透明度
            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, Alpha, 0.0f},
    new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
   };
            System.Drawing.Imaging.ColorMatrix wmColorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
            imageAttributes.SetColorMatrix(wmColorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);
            //确定水印边距
            int xPos = imgPhotoWidth - imgWatermarkWidthNew;
            int yPos = imgPhotoHeight - imgWatermarkHeightNew;
            ;
            ;
            if (xPos > intDistance)
                xPosOfWm = xPos - intDistance;
            else
                xPosOfWm = xPos;
            if (yPos > intDistance)
                yPosOfWm = yPos - intDistance;
            else
                yPosOfWm = yPos;
            gWatermark.DrawImage(
              imgWatermark
             , new Rectangle(xPosOfWm, yPosOfWm, imgWatermarkWidthNew, imgWatermarkHeightNew)
             ,
             ,
             , imgWatermarkWidth
             , imgWatermarkHeight
             , GraphicsUnit.Pixel
             , imageAttributes
             );
            imgPhoto = bmWatermark;
            //以jpg格式保存图片
            imgPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            //销毁对象
            gbmPhoto.Dispose();
            gWatermark.Dispose();
            imgPhoto.Dispose();
            imgWatermark.Dispose();
            return true;
        }
        catch
        {
            return false;
        }
    }
    /**//// <summary>
        /// 文字水印
        /// </summary>
        /// <param name="ImgFile">原图文件地址</param>
        /// <param name="TextFont">水印文字</param>
        /// <param name="sImgPath">文字水印图片保存地址</param>
        /// <param name="hScale">高度位置</param>
        /// <param name="widthFont">文字块在图片中所占宽度比例</param>
        /// <param name="Alpha">文字透明度 其数值的范围在0到255</param>
    public bool zzsTextWater(
      string ImgFile
     , string TextFont
     , string sImgPath
     , float hScale
     , float widthFont
     , int Alpha
     )
    {
        try
        {
            FileStream fs = new FileStream(ImgFile, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            byte[] bytes = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);
            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);
            int imgPhotoWidth = imgPhoto.Width;
            int imgPhotoHeight = imgPhoto.Height;
            Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(, );
            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gbmPhoto.DrawImage(
              imgPhoto
             , , , imgPhotoWidth, imgPhotoHeight)
             ,
             ,
             , imgPhotoWidth
             , imgPhotoHeight
             , GraphicsUnit.Pixel
             );
            //建立字体大小的数组,循环找出适合图片的水印字体
            //int[] sizes = new int[] { 1000, 800, 700, 650, 600, 560, 540, 500, 450, 400, 380, 360, 340, 320, 300, 280, 260, 240, 220, 200, 180, 160, 140, 120, 100, 80, 72, 64, 48, 32, 28, 26, 24, 20, 28, 16, 14, 12, 10, 8, 6, 4, 2 };
            , , , , , ,  };
            System.Drawing.Font crFont = null;
            System.Drawing.SizeF crSize = new SizeF();
            ; i < ; i++)
            {
                crFont = new Font("微软雅黑", sizes[i], FontStyle.Bold);
                crSize = gbmPhoto.MeasureString(TextFont, crFont);
                if ((ushort)crSize.Width < (ushort)imgPhotoWidth * widthFont)
                    break;
            }
            //设置水印字体的位置
            //int yPixlesFromBottom = (int)(imgPhotoHeight * hScale);
            //float yPosFromBottom = ((imgPhotoHeight - yPixlesFromBottom) - (crSize.Height / 2));
            //float xCenterOfImg = (imgPhotoWidth * 1 / 2);
            float yPosFromBottom = imgPhotoHeight * 0.85f;
            float xCenterOfImg = imgPhotoWidth * 0.8f;
            //if (xCenterOfImg<crSize.Height)
            // xCenterOfImg = (imgPhotoWidth * (1 - (crSize.Height)/ imgPhotoWidth));
            System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();
            StrFormat.Alignment = System.Drawing.StringAlignment.Center;
            //
            System.Drawing.SolidBrush semiTransBrush2 = , , ));
            gbmPhoto.DrawString(
              TextFont
             , crFont
             , semiTransBrush2
             , , yPosFromBottom + )
             , StrFormat
             );
            System.Drawing.SolidBrush semiTransBrush = , , ));
            //gbmPhoto.FillRectangle(semiTransBrush2, new RectangleF(new PointF(xCenterOfImg - crSize.Width / 2, yPosFromBottom - 4), crSize));
            gbmPhoto.DrawString(
              TextFont
             , crFont
             , semiTransBrush
             , new System.Drawing.PointF(xCenterOfImg, yPosFromBottom)
             , StrFormat
             );
            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            gbmPhoto.Dispose();
            imgPhoto.Dispose();
            bmPhoto.Dispose();
            return true;
        }
        catch(Exception ex)
        {
            return false;
        }
    }
    /**//// <summary>
        /// 文字和Logo图片水印
        /// </summary>
        /// <param name="ImgFile">原图文件地址</param>
        /// <param name="WaterImg">水印图片地址</param>
        /// <param name="TextFont">水印文字信息</param>
        /// <param name="sImgPath">生存水印图片后的保存地址</param>
        /// <param name="ImgAlpha">水印图片的透明度</param>
        /// <param name="imgiScale">水印图片在原图上的显示比例</param>
        /// <param name="intimgDistance">水印图片在原图上的边距确定,以图片的右边和下边为准,当设定的边距超过一定大小后参数会自动失效</param>
        /// <param name="texthScale">水印文字高度位置,从图片底部开始计算,0-1</param>
        /// <param name="textwidthFont">文字块在图片中所占宽度比例 0-1</param>
        /// <param name="textAlpha">文字透明度 其数值的范围在0到255</param>
    public void zzsImgTextWater(
      string ImgFile
     , string WaterImg
     , string TextFont
     , string sImgPath
     , float ImgAlpha
     , float imgiScale
     , int intimgDistance
     , float texthScale
     , float textwidthFont
     , int textAlpha
     )
    {
        try
        {
            FileStream fs = new FileStream(ImgFile, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            byte[] bytes = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);
            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);
            int imgPhotoWidth = imgPhoto.Width;
            int imgPhotoHeight = imgPhoto.Height;
            Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(, );
            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gbmPhoto.DrawImage(
              imgPhoto
             , , , imgPhotoWidth, imgPhotoHeight)
             ,
             ,
             , imgPhotoWidth
             , imgPhotoHeight
             , GraphicsUnit.Pixel
             );
            //建立字体大小的数组,循环找出适合图片的水印字体
            , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  };
            System.Drawing.Font crFont = null;
            System.Drawing.SizeF crSize = new SizeF();
            ; i < ; i++)
            {
                crFont = new Font("arial", sizes[i], FontStyle.Bold);
                crSize = gbmPhoto.MeasureString(TextFont, crFont);
                if ((ushort)crSize.Width < (ushort)imgPhotoWidth * textwidthFont)
                    break;
            }
            //设置水印字体的位置
            int yPixlesFromBottom = (int)(imgPhotoHeight * texthScale);
            ));
             / );
            System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();
            StrFormat.Alignment = System.Drawing.StringAlignment.Center;
            //
            System.Drawing.SolidBrush semiTransBrush2 = , , ));
            gbmPhoto.DrawString(
              TextFont
             , crFont
             , semiTransBrush2
             , , yPosFromBottom + )
             , StrFormat
             );
            System.Drawing.SolidBrush semiTransBrush = , , ));
            gbmPhoto.DrawString(
              TextFont
             , crFont
             , semiTransBrush
             , new System.Drawing.PointF(xCenterOfImg, yPosFromBottom)
             , StrFormat
             );
            System.Drawing.Image imgWatermark = new Bitmap(WaterImg);
            int imgWatermarkWidth = imgWatermark.Width;
            int imgWatermarkHeight = imgWatermark.Height;
            //计算水印图片尺寸
            decimal aScale = Convert.ToDecimal(imgiScale);
            decimal pScale = 0.05M;
            decimal MinScale = aScale - pScale;
            decimal MaxScale = aScale + pScale;
            int imgWatermarkWidthNew = imgWatermarkWidth;
            int imgWatermarkHeightNew = imgWatermarkHeight;
            if (imgPhotoWidth >= imgWatermarkWidth && imgPhotoHeight >= imgWatermarkHeight && imgPhotoWidth >= imgPhotoHeight)
                if (imgWatermarkWidth > imgWatermarkHeight)
                    )) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), ) <= MaxScale))
                    {
                    }
                    else
                    {
                        imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                        imgWatermarkHeightNew = Convert.ToInt32((imgPhotoWidth * aScale / imgWatermarkWidth) * imgWatermarkHeight);
                    }
                else
                 )) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), ) <= MaxScale))
                {
                }
                else
                {
                    imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                    imgWatermarkWidthNew = Convert.ToInt32((imgPhotoHeight * aScale / imgWatermarkHeight) * imgWatermarkWidth);
                }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgWatermarkWidth >= imgWatermarkHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight <= imgPhotoHeight && imgPhotoWidth >= imgPhotoHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth <= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgPhotoWidth >= imgPhotoHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            if (imgPhotoWidth >= imgWatermarkWidth && imgPhotoHeight >= imgWatermarkHeight && imgPhotoWidth <= imgPhotoHeight)
                if (imgWatermarkWidth > imgWatermarkHeight)
                    )) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), ) <= MaxScale))
                    {
                    }
                    else
                    {
                        imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                        imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
                    }
                else
                 )) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), ) <= MaxScale))
                {
                }
                else
                {
                    imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                    imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
                }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgWatermarkWidth <= imgWatermarkHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            if (imgWatermarkWidth >= imgPhotoWidth && imgWatermarkHeight <= imgPhotoHeight && imgPhotoWidth <= imgPhotoHeight)
            {
                imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);
                imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);
            }
            if (imgWatermarkWidth <= imgPhotoWidth && imgWatermarkHeight >= imgPhotoHeight && imgPhotoWidth <= imgPhotoHeight)
            {
                imgWatermarkHeightNew = Convert.ToInt32(imgPhotoHeight * aScale);
                imgWatermarkWidthNew = Convert.ToInt32(((imgPhotoHeight * aScale) / imgWatermarkHeight) * imgWatermarkWidth);
            }
            //将原图画出来
            Bitmap bmWatermark = new Bitmap(bmPhoto);
            bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
            Graphics gWatermark = Graphics.FromImage(bmWatermark);
            //指定高质量显示水印图片质量
            gWatermark.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gWatermark.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            System.Drawing.Imaging.ImageAttributes imageAttributes = new System.Drawing.Imaging.ImageAttributes();
            //设置两种颜色,达到合成效果
            System.Drawing.Imaging.ColorMap colorMap = new System.Drawing.Imaging.ColorMap();
            colorMap.OldColor = Color.FromArgb(, , , );
            colorMap.NewColor = Color.FromArgb(, , , );
            System.Drawing.Imaging.ColorMap[] remapTable = { colorMap };
            imageAttributes.SetRemapTable(remapTable, System.Drawing.Imaging.ColorAdjustType.Bitmap);
            //用矩阵设置水印图片透明度
            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, ImgAlpha, 0.0f},
    new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
   };
            System.Drawing.Imaging.ColorMatrix wmColorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
            imageAttributes.SetColorMatrix(wmColorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);
            //确定水印边距
            int xPos = imgPhotoWidth - imgWatermarkWidthNew;
            int yPos = imgPhotoHeight - imgWatermarkHeightNew;
            ;
            ;
            if (xPos > intimgDistance)
                xPosOfWm = xPos - intimgDistance;
            else
                xPosOfWm = xPos;
            if (yPos > intimgDistance)
                yPosOfWm = yPos - intimgDistance;
            else
                yPosOfWm = yPos;
            gWatermark.DrawImage(
              imgWatermark
             , new Rectangle(xPosOfWm, yPosOfWm, imgWatermarkWidthNew, imgWatermarkHeightNew)
             ,
             ,
             , imgWatermarkWidth
             , imgWatermarkHeight
             , GraphicsUnit.Pixel
             , imageAttributes
             );
            imgPhoto = bmWatermark;
            //以jpg格式保存图片
            imgPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            //销毁对象
            gbmPhoto.Dispose();
            gWatermark.Dispose();
            bmPhoto.Dispose();
            imgPhoto.Dispose();
            imgWatermark.Dispose();
        }
        catch
        {
        }
    }
    /**//// <summary>
        /// 缩略图
        /// </summary>
        /// <param name="ImgFile">原图文件地址</param>
        /// <param name="sImgPath">缩略图保存地址</param>
        /// <param name="ResizeWidth">缩略图宽度</param>
        /// <param name="ResizeHeight">缩略图高度</param>
        /// <param name="BgColor">缩略图背景颜色,注意,背景颜色只能指定KnownColor中的值,如blue,red,green等</param>
    public bool zzsResizeImg(string ImgFile, string sImgPath, int ResizeWidth, int ResizeHeight, string BgColor)
    {
        try
        {
            FileStream fs = new FileStream(ImgFile, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            byte[] bytes = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);
            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);
            int imgPhotoWidth = imgPhoto.Width;
            int imgPhotoHeight = imgPhoto.Height;
            ;
            ;
            ;
            ;
            if (imgPhotoWidth >= ResizeWidth && imgPhotoHeight >= ResizeHeight)
            {
                NewWidth = ResizeWidth;
                NewHeight = Convert.ToInt32(imgPhotoHeight * Math.Round(Convert.ToDecimal(ResizeWidth) / Convert.ToDecimal(imgPhotoWidth), ));
                startX = ;
                StartY = (ResizeHeight - NewHeight) / ;
            }
            if (ResizeWidth > imgPhotoWidth && ResizeHeight < imgPhotoHeight)
            {
                NewHeight = ResizeHeight;
                NewWidth = Convert.ToInt32(imgPhotoWidth * Math.Round(Convert.ToDecimal(ResizeHeight) / Convert.ToDecimal(imgPhotoHeight), ));
                startX = (ResizeWidth - NewWidth) / ;
                StartY = ;
            }
            if (ResizeWidth < imgPhotoWidth && ResizeHeight > imgPhotoHeight)
            {
                NewWidth = ResizeWidth;
                NewHeight = Convert.ToInt32(imgPhotoHeight * Math.Round(Convert.ToDecimal(ResizeWidth) / Convert.ToDecimal(imgPhotoWidth), ));
                startX = ;
                StartY = (ResizeHeight - NewHeight) / ;
            }
            if (imgPhotoWidth < ResizeWidth && imgPhotoHeight < ResizeHeight)
            {
                NewWidth = imgPhotoWidth;
                NewHeight = imgPhotoHeight;
                startX = (ResizeWidth - imgPhotoWidth) / ;
                StartY = (ResizeHeight - imgPhotoHeight) / ;
            }
            //计算缩放图片尺寸
            Bitmap bmPhoto = new Bitmap(ResizeWidth, ResizeHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(, );
            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.Clear(Color.FromName(BgColor));
            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gbmPhoto.DrawImage(
              imgPhoto
             , new Rectangle(startX, StartY, NewWidth, NewHeight)
             , , , imgPhotoWidth, imgPhotoHeight)
             , GraphicsUnit.Pixel
             );
            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            imgPhoto.Dispose();
            gbmPhoto.Dispose();
            bmPhoto.Dispose();
            ms.Close();
            return true;
        }
        catch
        {
            return false;
        }
    }
    /**//// <summary>
        /// 图片剪切
        /// </summary>
        /// <param name="ImgFile">原图文件地址</param>
        /// <param name="sImgPath">缩略图保存地址</param>
        /// <param name="PointX">剪切起始点 X坐标</param>
        /// <param name="PointY">剪切起始点 Y坐标</param>
        /// <param name="CutWidth">剪切宽度</param>
        /// <param name="CutHeight">剪切高度</param>
    public bool zzsCutImg(string ImgFile, string sImgPath, int PointX, int PointY, int CutWidth, int CutHeight)
    {
        FileStream fs = new FileStream(ImgFile, FileMode.Open);
        BinaryReader br = new BinaryReader(fs);
        try
        {
            byte[] bytes = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);
            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);
            //此处只能用filestream,用 System.Drawing.Image则会报多过进程访问文件的错误,会锁定文件
            Bitmap bmPhoto = new Bitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(, );
            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gbmPhoto.DrawImage(
              imgPhoto
             , , , CutWidth, CutHeight)
             , new Rectangle(PointX, PointY, CutHeight, CutHeight)
             , GraphicsUnit.Pixel
             );
            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            imgPhoto.Dispose();
            gbmPhoto.Dispose();
            bmPhoto.Dispose();
            ms.Close();
            return true;
        }
        catch
        {
            return false;
        }
        finally
        {
        }
    }
}

public partial class WebForm1 : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    ImgWater img = new ImgWater();
    bool f = img.zzsTextWater(@"F:\ConsoleApplication1\LOGO.png",
    "水印测试", @"F:\LOGO.png",15.00F,0.25F,100);


  }
}

 

C#添加水印的更多相关文章

  1. PHP-生成缩略图和添加水印图-学习笔记

    1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...

  2. C#中如何给Excel添加水印

    我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观.所以在这篇文章中,我将 ...

  3. C# 给word文档添加水印

    和PDF一样,在word中,水印也分为图片水印和文本水印,给文档添加图片水印可以使文档变得更为美观,更具有吸引力.文本水印则可以保护文档,提醒别人该文档是受版权保护的,不能随意抄袭.前面我分享了如何给 ...

  4. C# 给PDF文件添加水印

      水印种类及功能介绍 PDF水印分为两种:文本水印和图片水印.文本水印一般被用在商业领域,提醒读者该文档是受版权保护的,其他人不能抄袭或者免费使用.除了这个特征,水印还可以用来标记这个文档 的一些基 ...

  5. C#基于两种需求向图片添加水印

    使用场景 1.也就是大家经常用的,一般是图片的4个角落,基于横纵坐标来添加. 2.在图片内基于固定位置,文字始终居中.刚开始我基于第一种场景来根据水印汉字的长度来计算坐标,后来发现方法始终不可靠.现在 ...

  6. PHP 图片处理工具类(添加水印与生成缩略图)

    =================ImageTool.class.php================= <?php class ImageTool { private $imagePath; ...

  7. ios 给图片添加水印

    //第一种添加水印方法 -(UIImage *)watermarkImage:(UIImage *)img withName:(NSString *)name{ NSString* mark = na ...

  8. Android 图片添加水印图片或者文字

    给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  9. iOS 学习 - 15.添加水印

    绘制到位图 下面利用位图图形上下文给一个图片添加水印,在下面的程序中我们首先创建上下文,然后在上下文中绘制图片.直线和文本,最后从当前位图上下文中取得最终形成的新图片显示到界面 - (void)vie ...

  10. c#图片添加水印

    今天讲一个上传图片添加水印的方法,直接上代码吧 protected void Button1_Click(object sender, EventArgs e)    {        int loc ...

随机推荐

  1. vue -- 脚手架之webpack.dev.conf.js

    webpack.dev.conf.js  开发环境模式配置文件: 'use strict'//js按照严格模式执行 const utils = require('./utils')//导入utils. ...

  2. javafx DropShadow

    public class EffectTest extends Application { DropShadow shadow = new DropShadow(); public static vo ...

  3. 在windows上面安装并用jupyter运行pyspark

    1,下载hadoop  winutils 设置HADOOP_HOME 2.下载spark,设置SPARK_HOME,将%SPARK_HOME%/加入到PATH路径下 3.安装Anaconda 就是py ...

  4. HTML中行内元素与块级元素有哪些及区别

    二.行内元素与块级元素有什么不同? 块级元素和行内元素的区别是,块级元素会占一行显示,而行内元素可以在一行并排显示. 通过样式控制,它们可以相互转换. 1.尺寸-块级元素和行内元素之间的一个重要的不同 ...

  5. 洛谷 P1709 [USACO5.5]隐藏口令Hidden Password

    P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...

  6. php课程 12-39 继承中parent的作用是什么

    php课程 12-39 继承中parent的作用是什么 一.总结 一句话总结:PHP5中使用parent::来引用父类的方法.parent:: 可用于调用父类中定义的成员方法. parent::的追溯 ...

  7. ReactJs 入门DEMO(转自别人)

    附件是分享的一些他人的ReactJs入门DEMO,以前版本使用的是JSXTransformer.js,新版的用browser.min.js替代了. DEMO 下载地址:http://files.cnb ...

  8. VNC Server模拟攻击实战

    VNC目前已被广泛应用的一个远程控制程序,很多攻击者对VNC的攻击技术研究热情是高涨的,丝毫不亚于对Windows的远程桌面(3389).PcAnywhere的攻击研究.从最开始爆发出来的VNC的低版 ...

  9. Linux架设Jsp环境

    本文已发表在2010年<网管员世界> 650) this.width=650;" onclick="window.open("http://blog.51ct ...

  10. 找不到或无法载入主类 org.jivesoftware.openfire.starter.ServerStarter

    刚接触openfire的配置就出现了这个错误.解决方法非常easy,忘记了将openfire的源文件加入到user entries中了