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
   {
   }
  }
}

转载于:https://www.cnblogs.com/Rambo-wu/p/5222327.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值