using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.UI.HtmlControls; namespace RMYY_CallCenter_Api.Utility { public class ImageHelper { #region 私有成员 private int _Error = 0;//返回上传状态。 private int _MaxSize = 20 * 1024 * 1024;//最大单个上传文件 (默认) private string _FileType = "jpg;gif;bmp;png";//所支持的上传类型用"/"隔开 private string _SavePath = System.Web.HttpContext.Current.Server.MapPath(".") + "\\";//保存文件的实际路径 private int _SaveType = 0;//上传文件的类型,0代表自动生成文件名 private HtmlInputFile _FormFile;//上传控件。 private string _DataUrl;//base64编码的文本 private string _InFileName = "";//非自动生成文件名设置。 private string _OutFileName = "";//输出文件名。 private bool _IsCreateImg = true;//是否生成缩略图。 private bool _Iss = false;//是否有缩略图生成. private int _Height = 0;//获取上传图片的高度 private int _Width = 0;//获取上传图片的宽度 private int _sHeight = 120;//设置生成缩略图的高度 private int _sWidth = 120;//设置生成缩略图的宽度 private int _DrawString_x = 10;//绘制文本的X坐标(左上角) private int _DrawString_y = 10;//绘制文本的Y坐标(左上角) private int _FileSize = 0;//获取已经上传文件的大小 #endregion #region 公有属性 /// /// Error返回值 /// 1、没有上传的文件 /// 2、类型不允许 /// 3、大小超限 /// 4、未知错误 /// 0、上传成功。 /// public int Error { get { return _Error; } } /// /// 最大单个上传文件 /// public int MaxSize { set { _MaxSize = value; } } /// /// 所支持的上传类型用";"隔开 /// public string FileType { set { _FileType = value; } } /// /// 保存文件的实际路径 /// public string SavePath { set { _SavePath = System.Web.HttpContext.Current.Server.MapPath(value); } get { return _SavePath; } } /// /// 上传文件的类型,0代表自动生成文件名 /// public int SaveType { set { _SaveType = value; } } /// /// base64编码的文本 /// public string DataUrl { set { _DataUrl = value; } } /// /// 非自动生成文件名设置。 /// public string InFileName { set { _InFileName = value; } } /// /// 输出文件名 /// public string OutFileName { get { return _OutFileName; } set { _OutFileName = value; } } /// /// 输出的缩略图文件名 /// public string OutThumbFileName { get; set; } /// /// 是否有缩略图生成. /// public bool Iss { get { return _Iss; } } /// /// 获取上传图片的宽度 /// public int Width { get { return _Width; } } /// /// 获取上传图片的高度 /// public int Height { get { return _Height; } } /// /// 设置缩略图的宽度 /// public int sWidth { get { return _sWidth; } set { _sWidth = value; } } /// /// 设置缩略图的高度 /// public int sHeight { get { return _sHeight; } set { _sHeight = value; } } /// /// 是否生成缩略图 /// public bool IsCreateImg { get { return _IsCreateImg; } set { _IsCreateImg = value; } } /// /// 绘制文本的X坐标(左上角) /// public int DrawString_x { get { return _DrawString_x; } set { _DrawString_x = value; } } /// /// 绘制文本的Y坐标(左上角) /// public int DrawString_y { get { return _DrawString_y; } set { _DrawString_y = value; } } /// /// 文件大小 /// public int FileSize { get { return _FileSize; } set { _FileSize = value; } } public HttpPostedFileBase PostFile { get; set; } #endregion #region 私有方法 /// /// 获取文件的后缀名 /// private string GetExt(string path) { return Path.GetExtension(path); } /// /// 获取输出文件的文件名 /// private string FileName(string Ext) { if (_SaveType == 0 || _InFileName.Trim() == "") return "(" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ")" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Ext; else return "(" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ")" + _InFileName; } /// /// 检查上传的文件的类型,是否允许上传。 /// private bool IsUpload(string Ext) { Ext = Ext.Replace(".", ""); bool b = false; string[] arrFileType = _FileType.Split(';'); foreach (string str in arrFileType) { if (str.ToLower() == Ext.ToLower()) { b = true; break; } } return b; } #endregion #region 上传图片 public void Upload() { HttpPostedFileBase hpFile = PostFile; if (hpFile == null || hpFile.FileName.Trim() == "") { _Error = 1; return; } string Ext = GetExt(hpFile.FileName); if (!IsUpload(Ext)) { _Error = 2; return; } int iLen = hpFile.ContentLength; if (iLen > _MaxSize) { _Error = 3; return; } try { if (!Directory.Exists(_SavePath)) Directory.CreateDirectory(_SavePath); byte[] bData = new byte[iLen]; hpFile.InputStream.Read(bData, 0, iLen); string FName; FName = FileName(Ext); string TempFile = FName; FileStream newFile = new FileStream(_SavePath + TempFile, FileMode.Create); newFile.Write(bData, 0, bData.Length); newFile.Flush(); int _FileSizeTemp = hpFile.ContentLength; string ImageFilePath = _SavePath + FName; //获取图片的高度和宽度 System.Drawing.Image Img = System.Drawing.Image.FromStream(newFile); _Width = Img.Width; _Height = Img.Height; //生成缩略图部分 if (_IsCreateImg) { #region 缩略图大小只设置了最大范围,并不是实际大小 float realbili = (float)_Width / (float)_Height; float wishbili = (float)_sWidth / (float)_sHeight; //实际图比缩略图最大尺寸更宽矮,以宽为准 if (realbili > wishbili) { _sHeight = (int)((float)_sWidth / realbili); } //实际图比缩略图最大尺寸更高长,以高为准 else { _sWidth = (int)((float)_sHeight * realbili); } #endregion this.OutThumbFileName = FName.Split('.').GetValue(0).ToString() + "_s." + FName.Split('.').GetValue(1).ToString(); string ImgFilePath = _SavePath + this.OutThumbFileName; System.Drawing.Image newImg = Img.GetThumbnailImage(_sWidth, _sHeight, null, System.IntPtr.Zero); newImg.Save(ImgFilePath); newImg.Dispose(); _Iss = true; } newFile.Close(); newFile.Dispose(); _OutFileName = FName; _FileSize = _FileSizeTemp; _Error = 0; return; } catch { _Error = 4; return; } } public void Upload64() { int delLength = _DataUrl.IndexOf(',') + 1; string str = _DataUrl.Substring(delLength, _DataUrl.Length - delLength); str=str.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+"); if (str.Length % 4 > 0) { str = str.PadRight(str.Length + 4 - str.Length % 4, '='); } byte[] bData = Convert.FromBase64String(str); int iLen = bData.Length; if (iLen > _MaxSize) { _Error = 3; return; } try { if (!Directory.Exists(_SavePath)) Directory.CreateDirectory(_SavePath); string FName; FName = FileName(".jpg"); string TempFile = FName; FileStream newFile = new FileStream(_SavePath + TempFile, FileMode.Create); newFile.Write(bData, 0, bData.Length); newFile.Flush(); int _FileSizeTemp = iLen; string ImageFilePath = _SavePath + FName; //获取图片的高度和宽度 System.Drawing.Image Img = System.Drawing.Image.FromStream(newFile); _Width = Img.Width; _Height = Img.Height; //生成缩略图部分 if (_IsCreateImg) { #region 缩略图大小只设置了最大范围,并不是实际大小 float realbili = (float)_Width / (float)_Height; float wishbili = (float)_sWidth / (float)_sHeight; //实际图比缩略图最大尺寸更宽矮,以宽为准 if (realbili > wishbili) { _sHeight = (int)((float)_sWidth / realbili); } //实际图比缩略图最大尺寸更高长,以高为准 else { _sWidth = (int)((float)_sHeight * realbili); } #endregion this.OutThumbFileName = FName.Split('.').GetValue(0).ToString() + "_s." + FName.Split('.').GetValue(1).ToString(); string ImgFilePath = _SavePath + this.OutThumbFileName; System.Drawing.Image newImg = Img.GetThumbnailImage(_sWidth, _sHeight, null, System.IntPtr.Zero); newImg.Save(ImgFilePath); newImg.Dispose(); _Iss = true; } newFile.Close(); newFile.Dispose(); _OutFileName = FName; _FileSize = _FileSizeTemp; _Error = 0; return; } catch { _Error = 4; return; } } #endregion } }