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