ASP.NET简单好用功能齐全图片上传工具类(水印、缩略图、裁剪等)

使用方法:

UploadImage ui = new UploadImage();

     /***可选参数***/

     ui.SetWordWater = "哈哈";//文字水印
     // ui.SetPicWater = Server.MapPath("2.png");//图片水印(图片和文字都赋值图片有效)
     ui.SetPositionWater = 4;//水印图片的位置 0居中、1左上角、2右上角、3左下角、4右下角

     ui.SetSmallImgHeight = "110,40,20";//设置缩略图可以多个
     ui.SetSmallImgWidth = "100,40,20";

     //保存图片生成缩略图
     var reponseMessage = ui.FileSaveAs(Request.Files[0], Server.MapPath("~/file/temp"));

     //裁剪图片
     var reponseMessage2 = ui.FileCutSaveAs(Request.Files[0], Server.MapPath("~/file/temp2"), 400, 300, UploadImage.CutMode.CutNo);

     /***返回信息***/
     var isError = reponseMessage.IsError;//是否异常
     var webPath = reponseMessage.WebPath;//web路径
     var filePath = reponseMessage.filePath;//物理路径
     var message = reponseMessage.Message;//错误信息
     var directory = reponseMessage.Directory;//目录
     var smallPath1 = reponseMessage.SmallPath(0);//缩略图路径1
     var smallPath2 = reponseMessage.SmallPath(1);//缩略图路径2
     var smallPath3 = reponseMessage.SmallPath(2);//缩略图路径3

效果:

源码:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Net;
using System.Text.RegularExpressions;
using System.Configuration;

namespace SyntacticSugar
{
  /// <summary>
  /// ** 描述:图片上传类、支持水印、缩略图
  /// ** 创始时间:2015-5-28
  /// ** 修改时间:-
  /// ** 修改人:sunkaixuan
  /// </summary>
  public class UploadImage
  {

    #region 属性
    /// <summary>
    /// 允许图片格式
    /// </summary>
    public string SetAllowFormat { get; set; }
    /// <summary>
    /// 允许上传图片大小
    /// </summary>
    public double SetAllowSize { get; set; }
    /// <summary>
    /// 文字水印字符
    /// </summary>
    public string SetWordWater { get; set; }
    /// <summary>
    /// 图片水印
    /// </summary>
    public string SetPicWater { get; set; }
    /// <summary>
    /// 水印图片的位置 0居中、1左上角、2右上角、3左下角、4右下角
    /// </summary>
    public int SetPositionWater { get; set; }
    /// <summary>
    /// 缩略图宽度多个逗号格开(例如:200,100)
    /// </summary>
    public string SetSmallImgWidth { get; set; }
    /// <summary>
    /// 缩略图高度多个逗号格开(例如:200,100)
    /// </summary>
    public string SetSmallImgHeight { get; set; }
    /// <summary>
    /// 是否限制最大宽度,默认为true
    /// </summary>
    public bool SetLimitWidth { get; set; }
    /// <summary>
    /// 最大宽度尺寸,默认为600
    /// </summary>
    public int SetMaxWidth { get; set; }
    /// <summary>
    /// 是否剪裁图片,默认true
    /// </summary>
    public bool SetCutImage { get; set; }
    /// <summary>
    /// 限制图片最小宽度,0表示不限制
    /// </summary>
    public int SetMinWidth { get; set; }

    #endregion

    public UploadImage()
    {
      SetAllowFormat = ".jpeg|.jpg|.bmp|.gif|.png";  //允许图片格式
      SetAllowSize = 1;    //允许上传图片大小,默认为1MB
      SetPositionWater = 4;
      SetCutImage = true;
    }

    #region main method

    /// <summary>
    /// 裁剪图片
    /// </summary>
    /// <param name="PostedFile">HttpPostedFile控件</param>
    /// <param name="SavePath">保存路径【sys.config配置路径】</param>
    /// <param name="oImgWidth">图片宽度</param>
    /// <param name="oImgHeight">图片高度</param>
    /// <param name="cMode">剪切类型</param>
    /// <param name="ext">返回格式</param>
    /// <returns>返回上传信息</returns>
    public ResponseMessage FileCutSaveAs(System.Web.HttpPostedFile PostedFile, string SavePath, int oImgWidth, int oImgHeight, CutMode cMode)
    {
      ResponseMessage rm = new ResponseMessage();
      try
      {
        //获取上传文件的扩展名
        string sEx = System.IO.Path.GetExtension(PostedFile.FileName);
        if (!CheckValidExt(SetAllowFormat, sEx))
        {
          TryError(rm, 2);
          return rm;
        }

        //获取上传文件的大小
        double PostFileSize = PostedFile.ContentLength / 1024.0 / 1024.0;

        if (PostFileSize > SetAllowSize)
        {
          TryError(rm, 3);
          return rm; //超过文件上传大小
        }
        if (!System.IO.Directory.Exists(SavePath))
        {
          System.IO.Directory.CreateDirectory(SavePath);
        }
        //重命名名称
        string NewfileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString("000");
        string fName = "s" + NewfileName + sEx;
        string fullPath = Path.Combine(SavePath, fName);
        PostedFile.SaveAs(fullPath);

        //重命名名称
        string sNewfileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString("000");
        string sFName = sNewfileName + sEx;
        rm.IsError = false;
        rm.FileName = sFName;
        string sFullPath = Path.Combine(SavePath, sFName);
        rm.filePath = sFullPath;
        rm.WebPath = "/"+sFullPath.Replace(HttpContext.Current.Server.MapPath("~/"), "").Replace("\\", "/");
        CreateSmallPhoto(fullPath, oImgWidth, oImgHeight, sFullPath, SetPicWater, SetWordWater, cMode);
        if (File.Exists(fullPath))
        {
          File.Delete(fullPath);
        }
        //压缩
        if (PostFileSize > 100)
        {
          CompressPhoto(sFullPath, 100);
        }
      }
      catch (Exception ex)
      {
        TryError(rm, ex.Message);
      }
      return rm;
    }

    /// <summary>
    /// 通用图片上传类
    /// </summary>
    /// <param name="PostedFile">HttpPostedFile控件</param>
    /// <param name="SavePath">保存路径【sys.config配置路径】</param>
    /// <param name="finame">返回文件名</param>
    /// <param name="fisize">返回文件大小</param>
    /// <returns>返回上传信息</returns>
    public ResponseMessage FileSaveAs(System.Web.HttpPostedFile PostedFile, string SavePath)
    {
      ResponseMessage rm = new ResponseMessage();
      try
      {
        if (string.IsNullOrEmpty(PostedFile.FileName))
        {
          TryError(rm, 4);
          return rm;
        }

        Random rd = new Random();
        int rdInt = rd.Next(1000, 9999);
        //重命名名称
        string NewfileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + rdInt;

        //获取上传文件的扩展名
        string sEx = System.IO.Path.GetExtension(PostedFile.FileName);
        if (!CheckValidExt(SetAllowFormat, sEx))
        {
          TryError(rm, 2);
          return rm;
        }

        //获取上传文件的大小
        double PostFileSize = PostedFile.ContentLength / 1024.0 / 1024.0;

        if (PostFileSize > SetAllowSize)
        {
          TryError(rm, 3);
          return rm;
        }

        if (!System.IO.Directory.Exists(SavePath))
        {
          System.IO.Directory.CreateDirectory(SavePath);
        }

        rm.FileName = NewfileName + sEx;
        string fullPath = SavePath.Trim('\\') + "\\" + rm.FileName;
        rm.WebPath = "/"+fullPath.Replace(HttpContext.Current.Server.MapPath("~/"), "").Replace("\\", "/");
        rm.filePath = fullPath;
        rm.Size = PostFileSize;
        PostedFile.SaveAs(fullPath);

        System.Drawing.Bitmap bmp = new Bitmap(fullPath);
        int realWidth = bmp.Width;
        int realHeight = bmp.Height;
        bmp.Dispose();

        #region 检测图片宽度限制
        if (SetMinWidth > 0)
        {
          if (realWidth < SetMinWidth)
          {
            TryError(rm, 7);
            return rm;
          }
        }
        #endregion

        #region 监测图片宽度是否超过600,超过的话,自动压缩到600
        if (SetLimitWidth && realWidth > SetMaxWidth)
        {
          int mWidth = SetMaxWidth;
          int mHeight = mWidth * realHeight / realWidth;

          string tempFile = SavePath + Guid.NewGuid().ToString() + sEx;
          File.Move(fullPath, tempFile);
          CreateSmallPhoto(tempFile, mWidth, mHeight, fullPath, "", "");
          File.Delete(tempFile);
        }
        #endregion

        #region 压缩图片存储尺寸
        if (sEx.ToLower() != ".gif")
        {
          CompressPhoto(fullPath, 100);
        }
        #endregion

        //生成缩略图片高宽
        if (string.IsNullOrEmpty(SetSmallImgWidth))
        {
          rm.Message = "上传成功,无缩略图";
          return rm;
        }

        string[] oWidthArray = SetSmallImgWidth.Split(',');
        string[] oHeightArray = SetSmallImgHeight.Split(',');
        if (oWidthArray.Length != oHeightArray.Length)
        {
          TryError(rm, 6);
          return rm;
        }

        for (int i = 0; i < oWidthArray.Length; i++)
        {
          if (Convert.ToInt32(oWidthArray[i]) <= 0 || Convert.ToInt32(oHeightArray[i]) <= 0)
            continue;

          string sImg = SavePath.TrimEnd('\\') + '\\' + NewfileName + "_" + i.ToString() + sEx;

          //判断图片高宽是否大于生成高宽。否则用原图
          if (realWidth > Convert.ToInt32(oWidthArray[i]))
          {
            if (SetCutImage)
              CreateSmallPhoto(fullPath, Convert.ToInt32(oWidthArray[i]), Convert.ToInt32(oHeightArray[i]), sImg, "", "");
            else
              CreateSmallPhoto(fullPath, Convert.ToInt32(oWidthArray[i]), Convert.ToInt32(oHeightArray[i]), sImg, "", "", CutMode.CutNo);
          }
          else
          {
            if (SetCutImage)
              CreateSmallPhoto(fullPath, realWidth, realHeight, sImg, "", "");
            else
              CreateSmallPhoto(fullPath, realWidth, realHeight, sImg, "", "", CutMode.CutNo);
          }
        }

        #region 给大图添加水印
        if (!string.IsNullOrEmpty(SetPicWater))
          AttachPng(SetPicWater, fullPath);
        else if (!string.IsNullOrEmpty(SetWordWater))
          AttachText(SetWordWater, fullPath);
        #endregion

      }
      catch (Exception ex)
      {
        TryError(rm, ex.Message);
      }
      return rm;
    }

    #region 验证格式
    /// <summary>
    /// 验证格式
    /// </summary>
    /// <param name="allType">所有格式</param>
    /// <param name="chkType">被检查的格式</param>
    /// <returns>bool</returns>
    public bool CheckValidExt(string allType, string chkType)
    {
      bool flag = false;
      string[] sArray = allType.Split('|');
      foreach (string temp in sArray)
      {
        if (temp.ToLower() == chkType.ToLower())
        {
          flag = true;
          break;
        }
      }

      return flag;
    }
    #endregion

    #region 根据需要的图片尺寸,按比例剪裁原始图片
    /// <summary>
    /// 根据需要的图片尺寸,按比例剪裁原始图片
    /// </summary>
    /// <param name="nWidth">缩略图宽度</param>
    /// <param name="nHeight">缩略图高度</param>
    /// <param name="img">原始图片</param>
    /// <returns>剪裁区域尺寸</returns>
    public Size CutRegion(int nWidth, int nHeight, Image img)
    {
      double width = 0.0;
      double height = 0.0;

      double nw = (double)nWidth;
      double nh = (double)nHeight;

      double pw = (double)img.Width;
      double ph = (double)img.Height;

      if (nw / nh > pw / ph)
      {
        width = pw;
        height = pw * nh / nw;
      }
      else if (nw / nh < pw / ph)
      {
        width = ph * nw / nh;
        height = ph;
      }
      else
      {
        width = pw;
        height = ph;
      }

      return new Size(Convert.ToInt32(width), Convert.ToInt32(height));
    }
    #endregion

    #region 等比例缩小图片
    public Size NewSize(int nWidth, int nHeight, Image img)
    {
      double w = 0.0;
      double h = 0.0;
      double sw = Convert.ToDouble(img.Width);
      double sh = Convert.ToDouble(img.Height);
      double mw = Convert.ToDouble(nWidth);
      double mh = Convert.ToDouble(nHeight);

      if (sw < mw && sh < mh)
      {
        w = sw;
        h = sh;
      }
      else if ((sw / sh) > (mw / mh))
      {
        w = nWidth;
        h = (w * sh) / sw;
      }
      else
      {
        h = nHeight;
        w = (h * sw) / sh;
      }

      return new Size(Convert.ToInt32(w), Convert.ToInt32(h));
    }
    #endregion

    #region 生成缩略图

    #region 生成缩略图,不加水印
    /// <summary>
    /// 生成缩略图,不加水印
    /// </summary>
    /// <param name="filename">源文件</param>
    /// <param name="nWidth">缩略图宽度</param>
    /// <param name="nHeight">缩略图高度</param>
    /// <param name="destfile">缩略图保存位置</param>
    public void CreateSmallPhoto(string filename, int nWidth, int nHeight, string destfile)
    {
      Image img = Image.FromFile(filename);
      ImageFormat thisFormat = img.RawFormat;

      Size CutSize = CutRegion(nWidth, nHeight, img);
      Bitmap outBmp = new Bitmap(nWidth, nHeight);
      Graphics g = Graphics.FromImage(outBmp);

      // 设置画布的描绘质量
      g.CompositingQuality = CompositingQuality.HighQuality;
      g.SmoothingMode = SmoothingMode.HighQuality;
      g.InterpolationMode = InterpolationMode.HighQualityBicubic;

      int nStartX = (img.Width - CutSize.Width) / 2;
      int nStartY = (img.Height - CutSize.Height) / 2;

      g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
        nStartX, nStartY, CutSize.Width, CutSize.Height, GraphicsUnit.Pixel);
      g.Dispose();

      //if (thisFormat.Equals(ImageFormat.Gif))
      //{
      //  Response.ContentType = "image/gif";
      //}
      //else
      //{
      //  Response.ContentType = "image/jpeg";
      //}

      // 以下代码为保存图片时,设置压缩质量
      EncoderParameters encoderParams = new EncoderParameters();
      long[] quality = new long[1];
      quality[0] = 100;

      EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
      encoderParams.Param[0] = encoderParam;

      //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
      ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
      ImageCodecInfo jpegICI = null;
      for (int x = 0; x < arrayICI.Length; x++)
      {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
          jpegICI = arrayICI[x];//设置JPEG编码
          break;
        }
      }

      if (jpegICI != null)
      {
        //outBmp.Save(Response.OutputStream, jpegICI, encoderParams);
        outBmp.Save(destfile, jpegICI, encoderParams);
      }
      else
      {
        //outBmp.Save(Response.OutputStream, thisFormat);
        outBmp.Save(destfile, thisFormat);
      }

      img.Dispose();
      outBmp.Dispose();
    }
    #endregion

    #region 生成缩略图,加水印
    public void CreateSmallPhoto(string filename, int nWidth, int nHeight, string destfile, string sy, int nType)
    {
      if (nType == 0)
        CreateSmallPhoto(filename, nWidth, nHeight, destfile, sy, "");
      else
        CreateSmallPhoto(filename, nWidth, nHeight, destfile, "", sy);
    }
    #endregion

    #region 生成缩略图
    /// <summary>
    /// 生成缩略图
    /// </summary>
    /// <param name="filename">源文件</param>
    /// <param name="nWidth">缩略图宽度</param>
    /// <param name="nHeight">缩略图高度</param>
    /// <param name="destfile">缩略图保存位置</param>
    /// <param name="png">图片水印</param>
    /// <param name="text">文本水印</param>
    public void CreateSmallPhoto(string filename, int nWidth, int nHeight, string destfile, string png, string text)
    {
      Image img = Image.FromFile(filename);
      ImageFormat thisFormat = img.RawFormat;

      Size CutSize = CutRegion(nWidth, nHeight, img);
      Bitmap outBmp = new Bitmap(nWidth, nHeight);
      Graphics g = Graphics.FromImage(outBmp);
      g.Clear(Color.White);

      // 设置画布的描绘质量
      g.CompositingQuality = CompositingQuality.HighQuality;
      g.SmoothingMode = SmoothingMode.HighQuality;
      g.InterpolationMode = InterpolationMode.HighQualityBicubic;

      int nStartX = (img.Width - CutSize.Width) / 2;
      int nStartY = (img.Height - CutSize.Height) / 2;

      g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
        nStartX, nStartY, CutSize.Width, CutSize.Height, GraphicsUnit.Pixel);
      g.Dispose();

      // 以下代码为保存图片时,设置压缩质量
      EncoderParameters encoderParams = new EncoderParameters();
      long[] quality = new long[1];
      quality[0] = 100;

      EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
      encoderParams.Param[0] = encoderParam;

      //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
      ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
      ImageCodecInfo jpegICI = null;
      for (int x = 0; x < arrayICI.Length; x++)
      {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
          jpegICI = arrayICI[x];//设置JPEG编码
          break;
        }
      }

      if (jpegICI != null)
      {
        outBmp.Save(destfile, jpegICI, encoderParams);
      }
      else
      {
        outBmp.Save(destfile, thisFormat);
      }

      img.Dispose();
      outBmp.Dispose();

      if (!string.IsNullOrEmpty(png))
        AttachPng(png, destfile);

      if (!string.IsNullOrEmpty(text))
        AttachText(text, destfile);
    }

    public void CreateSmallPhoto(string filename, int nWidth, int nHeight, string destfile, string png, string text, CutMode cMode)
    {
      Image img = Image.FromFile(filename);

      if (nWidth <= 0)
        nWidth = img.Width;
      if (nHeight <= 0)
        nHeight = img.Height;

      int towidth = nWidth;
      int toheight = nHeight;

      switch (cMode)
      {
        case CutMode.CutWH://指定高宽缩放(可能变形)
          break;
        case CutMode.CutW://指定宽,高按比例
          toheight = img.Height * nWidth / img.Width;
          break;
        case CutMode.CutH://指定高,宽按比例
          towidth = img.Width * nHeight / img.Height;
          break;
        case CutMode.CutNo: //缩放不剪裁
          int maxSize = (nWidth >= nHeight ? nWidth : nHeight);
          if (img.Width >= img.Height)
          {
            towidth = maxSize;
            toheight = img.Height * maxSize / img.Width;
          }
          else
          {
            toheight = maxSize;
            towidth = img.Width * maxSize / img.Height;
          }
          break;
        default:
          break;
      }
      nWidth = towidth;
      nHeight = toheight;

      ImageFormat thisFormat = img.RawFormat;

      Size CutSize = new Size(nWidth, nHeight);
      if (cMode != CutMode.CutNo)
        CutSize = CutRegion(nWidth, nHeight, img);

      Bitmap outBmp = new Bitmap(CutSize.Width, CutSize.Height);

      Graphics g = Graphics.FromImage(outBmp);
      g.Clear(Color.White);

      // 设置画布的描绘质量
      g.CompositingQuality = CompositingQuality.HighQuality;
      g.SmoothingMode = SmoothingMode.HighQuality;
      g.InterpolationMode = InterpolationMode.HighQualityBicubic;

      int nStartX = (img.Width - CutSize.Width) / 2;
      int nStartY = (img.Height - CutSize.Height) / 2;

      //int x1 = (outBmp.Width - nWidth) / 2;
      //int y1 = (outBmp.Height - nHeight) / 2;

      if (cMode != CutMode.CutNo)
        g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
          nStartX, nStartY, CutSize.Width, CutSize.Height, GraphicsUnit.Pixel);
      else
        g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
        0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
      g.Dispose();

      // 以下代码为保存图片时,设置压缩质量
      EncoderParameters encoderParams = new EncoderParameters();
      long[] quality = new long[1];
      quality[0] = 100;

      EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
      encoderParams.Param[0] = encoderParam;

      //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
      ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
      ImageCodecInfo jpegICI = null;
      for (int x = 0; x < arrayICI.Length; x++)
      {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
          jpegICI = arrayICI[x];//设置JPEG编码
          break;
        }
      }

      if (jpegICI != null)
      {
        outBmp.Save(destfile, jpegICI, encoderParams);
      }
      else
      {
        outBmp.Save(destfile, thisFormat);
      }

      img.Dispose();
      outBmp.Dispose();

      if (!string.IsNullOrEmpty(png))
        AttachPng(png, destfile);

      if (!string.IsNullOrEmpty(text))
        AttachText(text, destfile);
    }
    #endregion

    #endregion

    #region 添加文字水印
    public void AttachText(string text, string file)
    {
      if (string.IsNullOrEmpty(text))
        return;

      if (!System.IO.File.Exists(file))
        return;

      System.IO.FileInfo oFile = new System.IO.FileInfo(file);
      string strTempFile = System.IO.Path.Combine(oFile.DirectoryName, Guid.NewGuid().ToString() + oFile.Extension);
      oFile.CopyTo(strTempFile);

      Image img = Image.FromFile(strTempFile);
      ImageFormat thisFormat = img.RawFormat;

      int nHeight = img.Height;
      int nWidth = img.Width;

      Bitmap outBmp = new Bitmap(nWidth, nHeight);
      Graphics g = Graphics.FromImage(outBmp);
      g.Clear(Color.White);

      // 设置画布的描绘质量
      g.CompositingQuality = CompositingQuality.HighQuality;
      g.SmoothingMode = SmoothingMode.HighQuality;
      g.InterpolationMode = InterpolationMode.HighQualityBicubic;

      g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
        0, 0, nWidth, nHeight, GraphicsUnit.Pixel);

      int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };

      Font crFont = null;
      SizeF crSize = new SizeF();

      //通过循环这个数组,来选用不同的字体大小
      //如果它的大小小于图像的宽度,就选用这个大小的字体
      for (int i = 0; i < 7; i++)
      {
        //设置字体,这里是用arial,黑体
        crFont = new Font("arial", sizes[i], FontStyle.Bold);
        //Measure the Copyright string in this Font
        crSize = g.MeasureString(text, crFont);

        if ((ushort)crSize.Width < (ushort)nWidth)
          break;
      }

      //因为图片的高度可能不尽相同, 所以定义了
      //从图片底部算起预留了5%的空间
      int yPixlesFromBottom = (int)(nHeight * .08);

      //现在使用版权信息字符串的高度来确定要绘制的图像的字符串的y坐标

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

      //计算x坐标
      float xCenterOfImg = (nWidth / 2);

      //把文本布局设置为居中
      StringFormat StrFormat = new StringFormat();
      StrFormat.Alignment = StringAlignment.Center;

      //通过Brush来设置黑色半透明
      SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));

      //绘制版权字符串
      g.DrawString(text,         //版权字符串文本
        crFont,                  //字体
        semiTransBrush2,              //Brush
        new PointF(xCenterOfImg + 1, yPosFromBottom + 1), //位置
        StrFormat);

      //设置成白色半透明
      SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));

      //第二次绘制版权字符串来创建阴影效果
      //记住移动文本的位置1像素
      g.DrawString(text,         //版权文本
        crFont,                  //字体
        semiTransBrush,              //Brush
        new PointF(xCenterOfImg, yPosFromBottom), //位置
        StrFormat);

      g.Dispose();

      // 以下代码为保存图片时,设置压缩质量
      EncoderParameters encoderParams = new EncoderParameters();
      long[] quality = new long[1];
      quality[0] = 100;

      EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
      encoderParams.Param[0] = encoderParam;

      //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
      ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
      ImageCodecInfo jpegICI = null;
      for (int x = 0; x < arrayICI.Length; x++)
      {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
          jpegICI = arrayICI[x];//设置JPEG编码
          break;
        }
      }

      if (jpegICI != null)
      {
        outBmp.Save(file, jpegICI, encoderParams);
      }
      else
      {
        outBmp.Save(file, thisFormat);
      }

      img.Dispose();
      outBmp.Dispose();

      System.IO.File.Delete(strTempFile);
    }
    #endregion

    #region 添加图片水印
    ///<summary>
    /// 添加图片水印
    /// </summary>
    /// <param name="png">水印图片</param>
    /// <param name="file">原文件</param>
    /// <param name="position">水印图片的位置 0居中、1左上角、2右上角、3左下角、4右下角</param>
    public void AttachPng(string png, string file)
    {
      if (string.IsNullOrEmpty(png))
        return;

      if (!System.IO.File.Exists(png))
        return;

      if (!System.IO.File.Exists(file))
        return;

      System.IO.FileInfo oFile = new System.IO.FileInfo(file);
      string strTempFile = System.IO.Path.Combine(oFile.DirectoryName, Guid.NewGuid().ToString() + oFile.Extension);
      oFile.CopyTo(strTempFile);

      Image img = Image.FromFile(strTempFile);
      ImageFormat thisFormat = img.RawFormat;
      int nHeight = img.Height;
      int nWidth = img.Width;

      Bitmap outBmp = new Bitmap(nWidth, nHeight);
      Graphics g = Graphics.FromImage(outBmp);

      // 设置画布的描绘质量
      g.CompositingQuality = CompositingQuality.HighQuality;
      g.SmoothingMode = SmoothingMode.HighQuality;
      g.InterpolationMode = InterpolationMode.HighQualityBicubic;

      g.DrawImage(img, new Rectangle(0, 0, nWidth, nHeight),
        0, 0, nWidth, nHeight, GraphicsUnit.Pixel);

      img.Dispose();

      img = Image.FromFile(png);

      //Bitmap bmpPng = new Bitmap(img);

      //ImageAttributes imageAttr = new ImageAttributes();
      //Color bg = Color.Green;
      //imageAttr.SetColorKey(bg, bg);

      Size pngSize = NewSize(nWidth, nHeight, img);
      int nx = 0;
      int ny = 0;
      int padding = 10;
      if (SetPositionWater == 0)
      {
        nx = (nWidth - pngSize.Width) / 2;
        ny = (nHeight - pngSize.Height) / 2;
      }
      else if (SetPositionWater == 1)
      {
        nx = padding;
        ny = padding;
      }
      else if (SetPositionWater == 2)
      {
        nx = (nWidth - pngSize.Width) - padding;
        ny = padding;
      }
      else if (SetPositionWater == 3)
      {
        nx = padding;
        ny = (nHeight - pngSize.Height) - padding;
      }
      else
      {
        nx = (nWidth - pngSize.Width) - padding;
        ny = (nHeight - pngSize.Height) - padding;
      }
      g.DrawImage(img, new Rectangle(nx, ny, pngSize.Width, pngSize.Height),
        0, 0, img.Width, img.Height, GraphicsUnit.Pixel);

      g.Dispose();

      // 以下代码为保存图片时,设置压缩质量
      EncoderParameters encoderParams = new EncoderParameters();
      long[] quality = new long[1];
      quality[0] = 100;

      EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
      encoderParams.Param[0] = encoderParam;

      //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
      ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
      ImageCodecInfo jpegICI = null;
      for (int x = 0; x < arrayICI.Length; x++)
      {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
          jpegICI = arrayICI[x];//设置JPEG编码
          break;
        }
      }

      if (jpegICI != null)
      {
        outBmp.Save(file, jpegICI, encoderParams);
      }
      else
      {
        outBmp.Save(file, thisFormat);
      }

      img.Dispose();
      outBmp.Dispose();

      System.IO.File.Delete(strTempFile);
    }
    #endregion

    #region 得到指定mimeType的ImageCodecInfo
    /// <summary>
    /// 保存JPG时用
    /// </summary>
    /// <param name="mimeType"> </param>
    /// <returns>得到指定mimeType的ImageCodecInfo </returns>
    private ImageCodecInfo GetCodecInfo(string mimeType)
    {
      ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
      foreach (ImageCodecInfo ici in CodecInfo)
      {
        if (ici.MimeType == mimeType) return ici;
      }
      return null;
    }
    #endregion

    #region 保存为JPEG格式,支持压缩质量选项
    /// <summary>
    /// 保存为JPEG格式,支持压缩质量选项
    /// </summary>
    /// <param name="SourceFile"></param>
    /// <param name="FileName"></param>
    /// <param name="Qty"></param>
    /// <returns></returns>
    public bool KiSaveAsJPEG(string SourceFile, string FileName, int Qty)
    {
      Bitmap bmp = new Bitmap(SourceFile);

      try
      {
        EncoderParameter p;
        EncoderParameters ps;

        ps = new EncoderParameters(1);

        p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty);
        ps.Param[0] = p;

        bmp.Save(FileName, GetCodecInfo("image/jpeg"), ps);

        bmp.Dispose();

        return true;
      }
      catch
      {
        bmp.Dispose();
        return false;
      }

    }
    #endregion

    #region 将图片压缩到指定大小
    /// <summary>
    /// 将图片压缩到指定大小
    /// </summary>
    /// <param name="FileName">待压缩图片</param>
    /// <param name="size">期望压缩后的尺寸</param>
    public void CompressPhoto(string FileName, int size)
    {
      if (!System.IO.File.Exists(FileName))
        return;

      int nCount = 0;
      System.IO.FileInfo oFile = new System.IO.FileInfo(FileName);
      long nLen = oFile.Length;
      while (nLen > size * 1024 && nCount < 10)
      {
        string dir = oFile.Directory.FullName;
        string TempFile = System.IO.Path.Combine(dir, Guid.NewGuid().ToString() + "." + oFile.Extension);
        oFile.CopyTo(TempFile, true);

        KiSaveAsJPEG(TempFile, FileName, 70);

        try
        {
          System.IO.File.Delete(TempFile);
        }
        catch { }

        nCount++;

        oFile = new System.IO.FileInfo(FileName);
        nLen = oFile.Length;
      }
    }
    #endregion

    #endregion

    #region common method

    /// <summary>
    /// 图片上传错误编码
    /// </summary>
    /// <param name="code"></param>
    /// <returns></returns>
    private string GetCodeMessage(int code)
    {
      var dic = new Dictionary<int, string>(){
    {0,"系统配置错误"},
    {1,"上传图片成功"},
    {2,string.Format( "对不起,上传格式错误!请上传{0}格式图片",SetAllowFormat)},
    {3,string.Format("超过文件上传大小,不得超过{0}M",SetAllowSize)},
    {4,"未上传文件"},
    {5,""},
    {6,"缩略图长度和宽度配置错误"},
    {7,"检测图片宽度限制"}
     };
      return dic[code];
    }
    private void TryError(ResponseMessage rm, int code)
    {
      rm.IsError = true;
      rm.Message = GetCodeMessage(code);
    }
    private void TryError(ResponseMessage rm, string message)
    {
      rm.IsError = true;
      rm.Message = message;
    }
    #endregion

    #region models
    public enum CutMode
    {
      /// <summary>
      /// 根据高宽剪切
      /// </summary>
      CutWH = 1,
      /// <summary>
      /// 根据宽剪切
      /// </summary>
      CutW = 2,
      /// <summary>
      /// 根据高剪切
      /// </summary>
      CutH = 3,
      /// <summary>
      /// 缩放不剪裁
      /// </summary>
      CutNo = 4
    }
    public class ResponseMessage
    {
      /// <summary>
      /// 是否遇到错误
      /// </summary>
      public bool IsError { get; set; }
      /// <summary>
      /// web路径
      /// </summary>
      public string WebPath { get; set; }
      /// <summary>
      /// 文件物理路径
      /// </summary>
      public string filePath { get; set; }
      /// <summary>
      /// 反回消息
      /// </summary>
      public string Message { get; set; }
      /// <summary>
      /// 文件大小
      /// </summary>
      public double Size { get; set; }
      /// <summary>
      /// 图片名
      /// </summary>
      public string FileName { get; set; }
      /// <summary>
      /// 图片目录
      /// </summary>
      public string Directory
      {
        get
        {
          if (WebPath == null) return null;
          return WebPath.Replace(FileName, "");
        }
      }
      /// <summary>
      /// 缩略图路径
      /// </summary>
      public string SmallPath(int index)
      {
        return string.Format("{0}{1}_{2}{3}", Directory, Path.GetFileNameWithoutExtension(FileName), index, Path.GetExtension(FileName));
      }
    }
    #endregion
  }

}
(0)

相关推荐

  • ASP.Net 上传图片并生成高清晰缩略图

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT

  • asp.net 上传图片并同时生成缩略图的代码

    复制代码 代码如下: <%@ Page Language="C#" ResponseEncoding="gb2312" %> <%@ Import Namespace="System" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Drawing" %> <%@ I

  • asp.net下GDI+的一些常用应用(水印,文字,圆角处理)技巧

    public class MyGDI {     public static void CreateWatermark(string sSrcFilePath, string sDstFilePath, string sText1, string sColor1, string sSize1, string sFont1, string sText2, string sColor2, string sSize2, string sFont2, string sBgColor, string sT

  • asp.net上传图片并作处理水印与缩略图的实例代码

    方法类: 复制代码 代码如下: upFileClass.cs 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.HtmlC

  • asp.net文件上传功能(单文件,多文件,自定义生成缩略图,水印)

    前言 上传功能,是大家经常用到了,可能每一个项目都可以会用到.网上到处都有上传功能的代码.比我写的好的有很多.我这里也仅是分享我的代码. 功能实现点 1.单个文件上传: 2.多个文件上传: 3.对于图片等类型的图像,可以自定义生成缩略图大小: 4.文件服务器扩展. 模式 主要使用的是"模板方法"的设计模式. 本文章的功能优缺点 1.可以自定义生成缩略图的大小,任意定义.对于像微生活运动户外商城(http://sports.8t8x.com/) .淘宝网等的网站,他们需要上传大量的商品图

  • asp.net图片上传生成缩略图的注意事项

    bitmap.Save(imgPath,ImageFormat.Jpeg);   //这是保存缩略图的一段代码,其中的ImageFormat.Jpeg一定不能省略,即使你保存的文件本来就是jpg格式的,也不能去掉.因为如果去掉的话,生成的缩略图比原始图片还要大! //另外,imgPath必须首先创建,否则会产生GDI+的一般性错误. path=System.Web.HttpContext.Current.Server.MapPath(path); 使用if(!System.IO.Director

  • asp.net实现生成缩略图及给原始图加水印的方法示例

    本文实例讲述了asp.net实现生成缩略图及给原始图加水印的方法.分享给大家供大家参考,具体如下: using System.IO; using System.Drawing.Imaging; private void Button1_ServerClick(object sender, System.EventArgs e) { Graphics g=null; System.Drawing.Image upimage=null; System.Drawing.Image thumimg=nu

  • asp.net如何在图片上加水印文字具体实现

    第一步,添加一个一般处理程序(Handler),本例是ImageHandler 复制代码 代码如下: using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;usin

  • asp.net 添加水印的代码(已测试)

    加水印的功能代码如下所示 复制代码 代码如下: /// <summary> /// 图片修改类,主要是用来保护图片版权的,版权归原作者所有 /// </summary> public class picmark { #region "member fields" private string modifyImagePath = null; private string drawedImagePath = null; private int rightSpace;

  • ASP.NET实现上传图片并生成缩略图的方法

    本文实例讲述了ASP.NET实现上传图片并生成缩略图的方法.分享给大家供大家参考,具体如下: protected void bt_upload_Click(object sender, EventArgs e) { //检查上传文件的格式是否有效 if (this.UploadFile.PostedFile.ContentType.ToLower().IndexOf("image") < 0) { Response.Write("上传图片格式无效!"); re

  • Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)

    复制代码 代码如下: 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; usi

随机推荐