好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#给图片添加水印完整实例

本文实例讲述了C#给图片添加水印的方法。分享给大家供大家参考,具体如下:

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)

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7) <= MaxScale))

       {

      }

      else

       {

       imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);

       imgWatermarkHeightNew = Convert.ToInt32((imgPhotoWidth * aScale / imgWatermarkWidth) * imgWatermarkHeight);

      }

     else

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7) <= 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)

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7) <= MaxScale))

       {

      }

      else

       {

       imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);

       imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);

      }

     else

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7) <= 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(72, 72);

    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

     , new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight)

     , 0

     , 0

     , 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(255, 0, 255, 0);

    colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);

    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;

    int xPosOfWm = 0;

    int yPosOfWm = 0;

    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)

     , 0

     , 0

     , 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(72, 72);

    Graphics gbmPhoto = Graphics.FromImage(bmPhoto);

    gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

    gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    gbmPhoto.DrawImage(

      imgPhoto

     , new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight)

     , 0

     , 0

     , 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 };

    int [] sizes = new int [] { 28, 26, 24, 20, 16, 14, 12 };

    System.Drawing.Font crFont = null ;

    System.Drawing.SizeF crSize = new SizeF();

    for ( int i = 0; i < 7; 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 = new System.Drawing.SolidBrush(Color.FromArgb(Alpha, 0, 0, 0));

    gbmPhoto.DrawString(

      TextFont

     , crFont

     , semiTransBrush2

     , new System.Drawing.PointF(xCenterOfImg + 1, yPosFromBottom + 1)

     , StrFormat

     );

    System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(Color.FromArgb(Alpha, 255, 255, 255));

    //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

   {

    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(72, 72);

    Graphics gbmPhoto = Graphics.FromImage(bmPhoto);

    gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

    gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    gbmPhoto.DrawImage(

      imgPhoto

     , new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight)

     , 0

     , 0

     , 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();

    for ( int i = 0; i < 43; 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);

    float yPosFromBottom = ((imgPhotoHeight - yPixlesFromBottom) - (crSize.Height / 2));

    float xCenterOfImg = (imgPhotoWidth * 1 / 2);

    System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();

    StrFormat.Alignment = System.Drawing.StringAlignment.Center;

    //

    System.Drawing.SolidBrush semiTransBrush2 = new System.Drawing.SolidBrush(Color.FromArgb(textAlpha, 0, 0, 0));

    gbmPhoto.DrawString(

      TextFont

     , crFont

     , semiTransBrush2

     , new System.Drawing.PointF(xCenterOfImg + 1, yPosFromBottom + 1)

     , StrFormat

     );

    System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(Color.FromArgb(textAlpha, 255, 255, 255));

    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)

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7) <= MaxScale))

      {

      }

      else

      {

       imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);

       imgWatermarkHeightNew = Convert.ToInt32((imgPhotoWidth * aScale / imgWatermarkWidth) * imgWatermarkHeight);

      }

     else

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7) <= 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)

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkWidth) / Convert.ToDecimal(imgPhotoWidth)), 7) <= MaxScale))

      {

      }

      else

      {

       imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);

       imgWatermarkHeightNew = Convert.ToInt32(((imgPhotoWidth * aScale) / imgWatermarkWidth) * imgWatermarkHeight);

      }

     else

      if ((MinScale <= Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7)) && (Math.Round((Convert.ToDecimal(imgWatermarkHeight) / Convert.ToDecimal(imgPhotoHeight)), 7) <= 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(255, 0, 255, 0);

    colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);

    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;

    int xPosOfWm = 0;

    int yPosOfWm = 0;

    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)

     , 0

     , 0

     , 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;

    int startX = 0;

    int StartY = 0;

    int NewWidth = 0;

    int NewHeight = 0;

    if (imgPhotoWidth >= ResizeWidth && imgPhotoHeight >= ResizeHeight)

    {

     NewWidth = ResizeWidth;

     NewHeight = Convert.ToInt32(imgPhotoHeight * Math.Round(Convert.ToDecimal(ResizeWidth) / Convert.ToDecimal(imgPhotoWidth), 10));

     startX = 0;

     StartY = (ResizeHeight - NewHeight) / 2;

    }

    if (ResizeWidth > imgPhotoWidth && ResizeHeight < imgPhotoHeight)

    {

     NewHeight = ResizeHeight;

     NewWidth = Convert.ToInt32(imgPhotoWidth * Math.Round(Convert.ToDecimal(ResizeHeight) / Convert.ToDecimal(imgPhotoHeight), 10));

     startX = (ResizeWidth - NewWidth) / 2;

     StartY = 0;

    }

    if (ResizeWidth < imgPhotoWidth && ResizeHeight > imgPhotoHeight)

    {

     NewWidth = ResizeWidth;

     NewHeight = Convert.ToInt32(imgPhotoHeight * Math.Round(Convert.ToDecimal(ResizeWidth) / Convert.ToDecimal(imgPhotoWidth), 10));

     startX = 0;

     StartY = (ResizeHeight - NewHeight) / 2;

    }

    if (imgPhotoWidth < ResizeWidth && imgPhotoHeight < ResizeHeight)

    {

     NewWidth = imgPhotoWidth;

     NewHeight = imgPhotoHeight;

     startX = (ResizeWidth - imgPhotoWidth) / 2;

     StartY = (ResizeHeight - imgPhotoHeight) / 2;

    }

    //计算缩放图片尺寸

    Bitmap bmPhoto = new Bitmap(ResizeWidth, ResizeHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

    bmPhoto.SetResolution(72, 72);

    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)

     , new Rectangle(0, 0, 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(72, 72);

    Graphics gbmPhoto = Graphics.FromImage(bmPhoto);

    gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

    gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    gbmPhoto.DrawImage(

      imgPhoto

     , new Rectangle(0, 0, 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

   {

   }

  }

}

希望本文所述对大家C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#给图片添加水印完整实例的详细内容...

  阅读:70次