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

 更新时间:2015年12月10日 15:43:16   作者:思齐_  
这篇文章主要介绍了C#给图片添加水印的方法,以完整实例形式分析了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#程序设计有所帮助。

相关文章

最新评论