C# 工具类分享(7~14)

目录

 

 

7. JSON操作类

8.ExcelHelper 类9

9.ImageHelper

10.Color Helper类

11.ImageClass 类

12.ImageDown 图片下载类

13. imageUpload 图片上传类

14. gif 可变长度压缩算法类


 

7. JSON操作类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Collections;
using System.Data;
using System.Data.Common;

namespace Core.Json
{
    //JSON转换类
    public class ConvertJson
    {
        #region 私有方法
        /// <summary>
        /// 过滤特殊字符
        /// </summary>
        private static string String2Json(String s)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.Length; i++)
            {
                char c = s.ToCharArray()[i];
                switch (c)
                {
                    case '\"':
                        sb.Append("\\\""); break;
                    case '\\':
                        sb.Append("\\\\"); break;
                    case '/':
                        sb.Append("\\/"); break;
                    case '\b':
                        sb.Append("\\b"); break;
                    case '\f':
                        sb.Append("\\f"); break;
                    case '\n':
                        sb.Append("\\n"); break;
                    case '\r':
                        sb.Append("\\r"); break;
                    case '\t':
                        sb.Append("\\t"); break;
                    default:
                        sb.Append(c); break;
                }
            }
            return sb.ToString();
        }

        /// <summary>
        /// 格式化字符型、日期型、布尔型
        /// </summary>
        private static string StringFormat(string str, Type type)
        {
            if (type == typeof(string))
            {
                str = String2Json(str);
                str = "\"" + str + "\"";
            }
            else if (type == typeof(DateTime))
            {
                str = "\"" + str + "\"";
            }
            else if (type == typeof(bool))
            {
                str = str.ToLower();
            }
            else if (type != typeof(string) && string.IsNullOrEmpty(str))
            {
                str = "\"" + str + "\"";
            }
            return str;
        }
        #endregion

        #region List转换成Json
        /// <summary>
        /// List转换成Json
        /// </summary>
        public static string ListToJson<T>(IList<T> list)
        {
            object obj = list[0];
            return ListToJson<T>(list, obj.GetType().Name);
        }

        /// <summary>
        /// List转换成Json 
        /// </summary>
        public static string ListToJson<T>(IList<T> list, string jsonName)
        {
            StringBuilder Json = new StringBuilder();
            if (string.IsNullOrEmpty(jsonName)) jsonName = list[0].GetType().Name;
            Json.Append("{\"" + jsonName + "\":[");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    T obj = Activator.CreateInstance<T>();
                    PropertyInfo[] pi = obj.GetType().GetProperties();
                    Json.Append("{");
                    for (int j = 0; j < pi.Length; j++)
                    {
                        Type type = pi[j].GetValue(list[i], null).GetType();
                        Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));

                        if (j < pi.Length - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < list.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }
        #endregion

        #region 对象转换为Json
        /// <summary> 
        /// 对象转换为Json 
        /// </summary> 
        /// <param name="jsonObject">对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToJson(object jsonObject)
        {
            string jsonString = "{";
            PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();
            for (int i = 0; i < propertyInfo.Length; i++)
            {
                object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);
                string value = string.Empty;
                if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)
                {
                    value = "'" + objectValue.ToString() + "'";
                }
                else if (objectValue is string)
                {
                    value = "'" + ToJson(objectValue.ToString()) + "'";
                }
                else if (objectValue is IEnumerable)
                {
                    value = ToJson((IEnumerable)objectValue);
                }
                else
                {
                    value = ToJson(objectValue.ToString());
                }
                jsonString += "\"" + ToJson(propertyInfo[i].Name) + "\":" + value + ",";
            }
            jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            return jsonString + "}";
        }
        #endregion

        #region 对象集合转换Json
        /// <summary> 
        /// 对象集合转换Json 
        /// </summary> 
        /// <param name="array">集合对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToJson(IEnumerable array)
        {
            string jsonString = "[";
            foreach (object item in array)
            {
                jsonString += ToJson(item) + ",";
            }
            jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            return jsonString + "]";
        }
        #endregion

        #region 普通集合转换Json
        /// <summary> 
        /// 普通集合转换Json 
        /// </summary> 
        /// <param name="array">集合对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToArrayString(IEnumerable array)
        {
            string jsonString = "[";
            foreach (object item in array)
            {
                jsonString = ToJson(item.ToString()) + ",";
            }
            jsonString.Remove(jsonString.Length - 1, jsonString.Length);
            return jsonString + "]";
        }
        #endregion

        #region  DataSet转换为Json
        /// <summary> 
        /// DataSet转换为Json 
        /// </summary> 
        /// <param name="dataSet">DataSet对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToJson(DataSet dataSet)
        {
            string jsonString = "{";
            foreach (DataTable table in dataSet.Tables)
            {
                jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
            }
            jsonString = jsonString.TrimEnd(',');
            return jsonString + "}";
        }
        #endregion

        #region Datatable转换为Json
        /// <summary> 
        /// Datatable转换为Json 
        /// </summary> 
        /// <param name="table">Datatable对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToJson(DataTable dt)
        {
            StringBuilder jsonString = new StringBuilder();
            jsonString.Append("[");
            DataRowCollection drc = dt.Rows;
            for (int i = 0; i < drc.Count; i++)
            {
                jsonString.Append("{");
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    string strKey = dt.Columns[j].ColumnName;
                    string strValue = drc[i][j].ToString();
                    Type type = dt.Columns[j].DataType;
                    jsonString.Append("\"" + strKey + "\":");
                    strValue = StringFormat(strValue, type);
                    if (j < dt.Columns.Count - 1)
                    {
                        jsonString.Append(strValue + ",");
                    }
                    else
                    {
                        jsonString.Append(strValue);
                    }
                }
                jsonString.Append("},");
            }
            jsonString.Remove(jsonString.Length - 1, 1);
            jsonString.Append("]");
            return jsonString.ToString();
        }

        /// <summary>
        /// DataTable转换为Json 
        /// </summary>
        public static string ToJson(DataTable dt, string jsonName)
        {
            StringBuilder Json = new StringBuilder();
            if (string.IsNullOrEmpty(jsonName)) jsonName = dt.TableName;
            Json.Append("{\"" + jsonName + "\":[");
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Json.Append("{");
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        Type type = dt.Rows[i][j].GetType();
                        Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j].ToString(), type));
                        if (j < dt.Columns.Count - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < dt.Rows.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }
        #endregion

        #region DataReader转换为Json
        /// <summary> 
        /// DataReader转换为Json 
        /// </summary> 
        /// <param name="dataReader">DataReader对象</param> 
        /// <returns>Json字符串</returns> 
        public static string ToJson(DbDataReader dataReader)
        {
            StringBuilder jsonString = new StringBuilder();
            jsonString.Append("[");
            while (dataReader.Read())
            {
                jsonString.Append("{");
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    Type type = dataReader.GetFieldType(i);
                    string strKey = dataReader.GetName(i);
                    string strValue = dataReader[i].ToString();
                    jsonString.Append("\"" + strKey + "\":");
                    strValue = StringFormat(strValue, type);
                    if (i < dataReader.FieldCount - 1)
                    {
                        jsonString.Append(strValue + ",");
                    }
                    else
                    {
                        jsonString.Append(strValue);
                    }
                }
                jsonString.Append("},");
            }
            dataReader.Close();
            jsonString.Remove(jsonString.Length - 1, 1);
            jsonString.Append("]");
            return jsonString.ToString();
        }
        #endregion
    }
}

8.ExcelHelper 类9

  • using System;
    using System.Collections;
    using System.IO;
    using System.Data;
    using System.Data.OleDb;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Windows.Forms;
    using DataGrid = System.Windows.Forms.DataGrid;
    
    
    namespace Core.Office
    {
        /// <summary>
        /// Excel操作辅助类(无需VBA引用)
        /// </summary>
        public class ExcelHelper
        {
    
            /// <summary>
            /// Excel 版本
            /// </summary>
            public enum ExcelType
            {
                Excel2003, Excel2007
            }
    
            /// <summary>
            /// IMEX 三种模式。
            /// IMEX是用来告诉驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。
            /// </summary>
            public enum IMEXType
            {
                ExportMode = 0, ImportMode = 1, LinkedMode = 2
            }
    
            #region 获取Excel连接字符串
    
            /// <summary>
            /// 返回Excel 连接字符串   [IMEX=1]
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="header">是否把第一行作为列名</param>
            /// <param name="eType">Excel 版本 </param>
            /// <returns></returns>
            public static string GetExcelConnectstring(string excelPath, bool header, ExcelType eType)
            {
                return GetExcelConnectstring(excelPath, header, eType, IMEXType.ImportMode);
            }
    
            /// <summary>
            /// 返回Excel 连接字符串
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="header">是否把第一行作为列名</param>
            /// <param name="eType">Excel 版本 </param>
            /// <param name="imex">IMEX模式</param>
            /// <returns></returns>
            public static string GetExcelConnectstring(string excelPath, bool header, ExcelType eType, IMEXType imex)
            {
                if (!File.Exists(excelPath))
                    throw new FileNotFoundException("Excel路径不存在!");
    
                string connectstring = string.Empty;
    
                string hdr = "NO";
                if (header)
                    hdr = "YES";
    
                if (eType == ExcelType.Excel2003)
                    connectstring = "Provider=Microsoft.Jet.OleDb.4.0; data source=" + excelPath + ";Extended Properties='Excel 8.0; HDR=" + hdr + "; IMEX=" + imex.GetHashCode() + "'";
                else
                    connectstring = "Provider=Microsoft.ACE.OLEDB.12.0; data source=" + excelPath + ";Extended Properties='Excel 12.0 Xml; HDR=" + hdr + "; IMEX=" + imex.GetHashCode() + "'";
    
                return connectstring;
            }
    
            #endregion
    
            #region 获取Excel工作表名
    
            /// <summary>
            /// 返回Excel工作表名
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="eType">Excel 版本 </param>
            /// <returns></returns>
            public static List<string> GetExcelTablesName(string excelPath, ExcelType eType)
            {
                string connectstring = GetExcelConnectstring(excelPath, true, eType);
                return GetExcelTablesName(connectstring);
            }
    
            /// <summary>
            /// 返回Excel工作表名
            /// </summary>
            /// <param name="connectstring">excel连接字符串</param>
            /// <returns></returns>
            public static List<string> GetExcelTablesName(string connectstring)
            {
                using (OleDbConnection conn = new OleDbConnection(connectstring))
                {
                    return GetExcelTablesName(conn);
                }
            }
    
            /// <summary>
            /// 返回Excel工作表名
            /// </summary>
            /// <param name="connection">excel连接</param>
            /// <returns></returns>
            public static List<string> GetExcelTablesName(OleDbConnection connection)
            {
                List<string> list = new List<string>();
    
                if (connection.State == ConnectionState.Closed)
                    connection.Open();
    
                DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        list.Add(ConvertTo<string>(dt.Rows[i][2]));
                    }
                }
    
                return list;
            }
            
            /// <summary>
            /// 返回Excel第一个工作表表名
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="eType">Excel 版本 </param>
            /// <returns></returns>
            public static string GetExcelFirstTableName(string excelPath, ExcelType eType)
            {
                string connectstring = GetExcelConnectstring(excelPath, true, eType);
                return GetExcelFirstTableName(connectstring);
            }
    
            /// <summary>
            /// 返回Excel第一个工作表表名
            /// </summary>
            /// <param name="connectstring">excel连接字符串</param>
            /// <returns></returns>
            public static string GetExcelFirstTableName(string connectstring)
            {
                using (OleDbConnection conn = new OleDbConnection(connectstring))
                {
                    return GetExcelFirstTableName(conn);
                }
            }
    
            /// <summary>
            /// 返回Excel第一个工作表表名
            /// </summary>
            /// <param name="connection">excel连接</param>
            /// <returns></returns>
            public static string GetExcelFirstTableName(OleDbConnection connection)
            {
                string tableName = string.Empty;
    
                if (connection.State == ConnectionState.Closed)
                    connection.Open();
    
                DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (dt != null && dt.Rows.Count > 0)
                {
                    tableName = ConvertTo<string>(dt.Rows[0][2]);
                }
    
                return tableName;
            }
    
            /// <summary>
            /// 获取Excel文件中指定工作表的列
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="table">名称 excel table  例如:Sheet1$</param>
            /// <returns></returns>
            public static List<string> GetColumnsList(string excelPath, ExcelType eType, string table)
            {
                List<string> list = new List<string>();
                DataTable tableColumns = null;
                string connectstring = GetExcelConnectstring(excelPath, true, eType);
                using (OleDbConnection conn = new OleDbConnection(connectstring))
                {
                    conn.Open();
                    tableColumns = GetReaderSchema(table, conn);
                }
                foreach (DataRow dr in tableColumns.Rows)
                {
                    string columnName = dr["ColumnName"].ToString();
                    string datatype = ((OleDbType)dr["ProviderType"]).ToString();//对应数据库类型
                    string netType = dr["DataType"].ToString();//对应的.NET类型,如System.String
                    list.Add(columnName);
                }         
    
                return list;
            }
    
            private static DataTable GetReaderSchema(string tableName, OleDbConnection connection)
            {
                DataTable schemaTable = null;
                IDbCommand cmd = new OleDbCommand();
                cmd.CommandText = string.Format("select * from [{0}]", tableName);
                cmd.Connection = connection;
    
                using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
                {
                    schemaTable = reader.GetSchemaTable();
                }
                return schemaTable;
            }
    
            #endregion
    
            #region EXCEL导入DataSet
    
            /// <summary>
            /// EXCEL导入DataSet
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="table">名称 excel table  例如:Sheet1$ </param>
            /// <param name="header">是否把第一行作为列名</param>
            /// <param name="eType">Excel 版本 </param>
            /// <returns>返回Excel相应工作表中的数据 DataSet   [table不存在时返回空的DataSet]</returns>
            public static DataSet ExcelToDataSet(string excelPath, string table, bool header, ExcelType eType)
            {
                string connectstring = GetExcelConnectstring(excelPath, header, eType);
                return ExcelToDataSet(connectstring, table);
            }
    
            /// <summary>
            /// 判断工作表名是否存在
            /// </summary>
            /// <param name="connection">excel连接</param>
            /// <param name="table">名称 excel table  例如:Sheet1$</param>
            /// <returns></returns>
            private static bool isExistExcelTableName(OleDbConnection connection, string table)
            {
                List<string> list = GetExcelTablesName(connection);
                foreach (string tName in list)
                {
                    if (tName.ToLower() == table.ToLower())
                        return true;
                }
    
                return false;
            }
    
            /// <summary>
            /// EXCEL导入DataSet
            /// </summary>
            /// <param name="connectstring">excel连接字符串</param>
            /// <param name="table">名称 excel table  例如:Sheet1$ </param>
            /// <returns>返回Excel相应工作表中的数据 DataSet   [table不存在时返回空的DataSet]</returns>
            public static DataSet ExcelToDataSet(string connectstring, string table)
            {
                using (OleDbConnection conn = new OleDbConnection(connectstring))
                {
                    DataSet ds = new DataSet();
    
                    //判断该工作表在Excel中是否存在
                    if (isExistExcelTableName(conn, table))
                    {
                        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [" + table + "]", conn);
                        adapter.Fill(ds, table);
                    }
    
                    return ds;
                }
            }
    
            /// <summary>
            /// EXCEL所有工作表导入DataSet
            /// </summary>
            /// <param name="excelPath">Excel文件 绝对路径</param>
            /// <param name="header">是否把第一行作为列名</param>
            /// <param name="eType">Excel 版本 </param>
            /// <returns>返回Excel第一个工作表中的数据 DataSet </returns>
            public static DataSet ExcelToDataSet(string excelPath, bool header, ExcelType eType)
            {
                string connectstring = GetExcelConnectstring(excelPath, header, eType);
                return ExcelToDataSet(connectstring);
            }
    
            /// <summary>
            /// EXCEL所有工作表导入DataSet
            /// </summary>
            /// <param name="connectstring">excel连接字符串</param>
            /// <returns>返回Excel第一个工作表中的数据 DataSet </returns>
            public static DataSet ExcelToDataSet(string connectstring)
            {
                using (OleDbConnection conn = new OleDbConnection(connectstring))
                {
                    DataSet ds = new DataSet();
                    List<string> tableNames = GetExcelTablesName(conn);
    
                    foreach (string tableName in tableNames)
                    {
                        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [" + tableName + "]", conn);
                        adapter.Fill(ds, tableName);
                    }
                    return ds;
                }
            }
    
            #endregion
    
            #region 数据导出至Excel文件
    
            #region 把一个数据集中的数据导出到Excel文件中(XML格式操作)
            
            /// <summary>
            /// 把一个数据集中的数据导出到Excel文件中(XML格式操作)
            /// </summary>
            /// <param name="source">DataSet数据</param>
            /// <param name="fileName">保存的Excel文件名</param>
            public static void DataSetToExcel(DataSet source, string fileName)
            {
                #region Excel格式内容
                var excelDoc = new StreamWriter(fileName);
                const string startExcelXML = "<xml version>\r\n<Workbook " +
                      "xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
                      " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
                      "xmlns:x=\"urn:schemas-    microsoft-com:office:" +
                      "excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
                      "office:spreadsheet\">\r\n <Styles>\r\n " +
                      "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
                      "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
                      "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
                      "\r\n <Protection/>\r\n </Style>\r\n " +
                      "<Style ss:ID=\"BoldColumn\">\r\n <Font " +
                      "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
                      "<Style     ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
                      " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
                      "ss:ID=\"Decimal\">\r\n <NumberFormat " +
                      "ss:Format=\"#,##0.###\"/>\r\n </Style>\r\n " +
                      "<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
                      "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
                      "ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
                      "ss:Format=\"yyyy-mm-dd;@\"/>\r\n </Style>\r\n " +
                      "</Styles>\r\n ";
                const string endExcelXML = "</Workbook>";
                #endregion
    
                int sheetCount = 1;
                excelDoc.Write(startExcelXML);
                for (int i = 0; i < source.Tables.Count; i++)
                {
                    int rowCount = 0;
                    DataTable dt = source.Tables[i];
    
                    excelDoc.Write("<Worksheet ss:Name=\"Sheet" + sheetCount + "\">");
                    excelDoc.Write("<Table>");
                    excelDoc.Write("<Row>");
                    for (int x = 0; x < dt.Columns.Count; x++)
                    {
                        excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
                        excelDoc.Write(source.Tables[0].Columns[x].ColumnName);
                        excelDoc.Write("</Data></Cell>");
                    }
                    excelDoc.Write("</Row>");
                    foreach (DataRow x in dt.Rows)
                    {
                        rowCount++;
                        //if the number of rows is > 64000 create a new page to continue output
    
                        if (rowCount == 64000)
                        {
                            rowCount = 0;
                            sheetCount++;
                            excelDoc.Write("</Table>");
                            excelDoc.Write(" </Worksheet>");
                            excelDoc.Write("<Worksheet ss:Name=\"Sheet" + sheetCount + "\">");
                            excelDoc.Write("<Table>");
                        }
                        excelDoc.Write("<Row>"); //ID=" + rowCount + "
    
                        for (int y = 0; y < source.Tables[0].Columns.Count; y++)
                        {
                            Type rowType = x[y].GetType();
                            #region 根据不同数据类型生成内容
                            switch (rowType.ToString())
                            {
                                case "System.String":
                                    string XMLstring = x[y].ToString();
                                    XMLstring = XMLstring.Trim();
                                    XMLstring = XMLstring.Replace("&", "&");
                                    XMLstring = XMLstring.Replace(">", ">");
                                    XMLstring = XMLstring.Replace("<", "<");
                                    excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                                   "<Data ss:Type=\"String\">");
                                    excelDoc.Write(XMLstring);
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                case "System.DateTime":
                                    //Excel has a specific Date Format of YYYY-MM-DD followed by
                                    //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
                                    //The Following Code puts the date stored in XMLDate
                                    //to the format above
    
                                    var XMLDate = (DateTime)x[y];
    
                                    string XMLDatetoString = XMLDate.Year +
                                                             "-" +
                                                             (XMLDate.Month < 10
                                                                  ? "0" +
                                                                    XMLDate.Month
                                                                  : XMLDate.Month.ToString()) +
                                                             "-" +
                                                             (XMLDate.Day < 10
                                                                  ? "0" +
                                                                    XMLDate.Day
                                                                  : XMLDate.Day.ToString()) +
                                                             "T" +
                                                             (XMLDate.Hour < 10
                                                                  ? "0" +
                                                                    XMLDate.Hour
                                                                  : XMLDate.Hour.ToString()) +
                                                             ":" +
                                                             (XMLDate.Minute < 10
                                                                  ? "0" +
                                                                    XMLDate.Minute
                                                                  : XMLDate.Minute.ToString()) +
                                                             ":" +
                                                             (XMLDate.Second < 10
                                                                  ? "0" +
                                                                    XMLDate.Second
                                                                  : XMLDate.Second.ToString()) +
                                                             ".000";
                                    excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
                                                 "<Data ss:Type=\"DateTime\">");
                                    excelDoc.Write(XMLDatetoString);
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                case "System.Boolean":
                                    excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                                "<Data ss:Type=\"String\">");
                                    excelDoc.Write(x[y].ToString());
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                case "System.Int16":
                                case "System.Int32":
                                case "System.Int64":
                                case "System.Byte":
                                    excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
                                            "<Data ss:Type=\"Number\">");
                                    excelDoc.Write(x[y].ToString());
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                case "System.Decimal":
                                case "System.Double":
                                    excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
                                          "<Data ss:Type=\"Number\">");
                                    excelDoc.Write(x[y].ToString());
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                case "System.DBNull":
                                    excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                          "<Data ss:Type=\"String\">");
                                    excelDoc.Write("");
                                    excelDoc.Write("</Data></Cell>");
                                    break;
                                default:
                                    throw (new Exception(rowType.ToString() + " not handled."));
                            }
                            #endregion
                        }
                        excelDoc.Write("</Row>");
                    }
                    excelDoc.Write("</Table>");
                    excelDoc.Write(" </Worksheet>");
    
                    sheetCount++;
                }
    
                excelDoc.Write(endExcelXML);
                excelDoc.Close();
            }
            #endregion
    
            #region 将DataTable导出为Excel(OleDb 方式操作)
    
           
            /// <summary>
            /// 将DataTable导出为Excel(OleDb 方式操作)
            /// </summary>
            /// <param name="dataTable">表</param>
            /// <param name="fileName">导出默认文件名</param>
            public static void DataSetToExcel(DataTable dataTable, string fileName)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "xls files (*.xls)|*.xls";
                saveFileDialog.FileName = fileName;
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    fileName = saveFileDialog.FileName;
                    if (File.Exists(fileName))
                    {
                        try
                        {
                            File.Delete(fileName);
                        }
                        catch
                        {
                            MessageBox.Show("该文件正在使用中,关闭文件或重新命名导出文件再试!");
                            return;
                        }
                    }
                    OleDbConnection oleDbConn = new OleDbConnection();
                    OleDbCommand oleDbCmd = new OleDbCommand();
                    string sSql = "";
                    try
                    {
                        oleDbConn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + fileName + @";Extended ProPerties=""Excel 8.0;HDR=Yes;""";
                        oleDbConn.Open();
                        oleDbCmd.CommandType = CommandType.Text;
                        oleDbCmd.Connection = oleDbConn;
                        sSql = "CREATE TABLE sheet1 (";
                        for (int i = 0; i < dataTable.Columns.Count; i++)
                        {
                            // 字段名称出现关键字会导致错误。
                            if (i < dataTable.Columns.Count - 1)
                                sSql += "[" + dataTable.Columns[i].Caption + "] TEXT(100) ,";
                            else
                                sSql += "[" + dataTable.Columns[i].Caption + "] TEXT(200) )";
                        }
                        oleDbCmd.CommandText = sSql;
                        oleDbCmd.ExecuteNonQuery();
                        for (int j = 0; j < dataTable.Rows.Count; j++)
                        {
                            sSql = "INSERT INTO sheet1 VALUES('";
                            for (int i = 0; i < dataTable.Columns.Count; i++)
                            {
                                if (i < dataTable.Columns.Count - 1)
                                    sSql += dataTable.Rows[j][i].ToString() + " ','";
                                else
                                    sSql += dataTable.Rows[j][i].ToString() + " ')";
                            }
                            oleDbCmd.CommandText = sSql;
                            oleDbCmd.ExecuteNonQuery();
                        }
                        MessageBox.Show("导出EXCEL成功");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("导出EXCEL失败:" + ex.Message);
                    }
                    finally
                    {
                        oleDbCmd.Dispose();
                        oleDbConn.Close();
                        oleDbConn.Dispose();
                    }
                }
            }
            #endregion
    
            #region   导出Excel文件,自动返回可下载的文件流
    
            /// <summary> 
            /// 导出Excel文件,自动返回可下载的文件流 
            /// </summary> 
            public static void DataTable1Excel(DataTable dtData)
            {
                GridView gvExport = null;
                HttpContext curContext = HttpContext.Current;
                StringWriter strWriter = null;
                HtmlTextWriter htmlWriter = null;
                if (dtData != null)
                {
                    curContext.Response.ContentType = "application/vnd.ms-excel";
                    curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                    curContext.Response.Charset = "utf-8";
                    strWriter = new StringWriter();
                    htmlWriter = new HtmlTextWriter(strWriter);
                    gvExport = new GridView();
                    gvExport.DataSource = dtData.DefaultView;
                    gvExport.AllowPaging = false;
                    gvExport.DataBind();
                    gvExport.RenderControl(htmlWriter);
                    curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString());
                    curContext.Response.End();
                }
            }
            #endregion
    
            #region  导出Excel文件,转换为可读模式
    
            
            /// <summary>
            /// 导出Excel文件,转换为可读模式
            /// </summary>
            public static void DataTable2Excel(DataTable dtData)
            {
                System.Web.UI.WebControls.DataGrid dgExport = null;
                HttpContext curContext = HttpContext.Current;
                StringWriter strWriter = null;
                HtmlTextWriter htmlWriter = null;
    
                if (dtData != null)
                {
                    curContext.Response.ContentType = "application/vnd.ms-excel";
                    curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    curContext.Response.Charset = "";
                    strWriter = new StringWriter();
                    htmlWriter = new HtmlTextWriter(strWriter);
                    dgExport = new System.Web.UI.WebControls.DataGrid();
                    dgExport.DataSource = dtData.DefaultView;
                    dgExport.AllowPaging = false;
                    dgExport.DataBind();
                    dgExport.RenderControl(htmlWriter);
                    curContext.Response.Write(strWriter.ToString());
                    curContext.Response.End();
                }
            }
            #endregion
    
            #region    导出Excel文件,并自定义文件名
          
            /// <summary>
            /// 导出Excel文件,并自定义文件名
            /// </summary>
            public static void DataTable3Excel(DataTable dtData, String FileName)
            {
                GridView dgExport = null;
                HttpContext curContext = HttpContext.Current;
                StringWriter strWriter = null;
                HtmlTextWriter htmlWriter = null;
    
                if (dtData != null)
                {
                    HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8);
                    curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls");
                    curContext.Response.ContentType = "application nd.ms-excel";
                    curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    curContext.Response.Charset = "GB2312";
                    strWriter = new StringWriter();
                    htmlWriter = new HtmlTextWriter(strWriter);
                    dgExport = new GridView();
                    dgExport.DataSource = dtData.DefaultView;
                    dgExport.AllowPaging = false;
                    dgExport.DataBind();
                    dgExport.RenderControl(htmlWriter);
                    curContext.Response.Write(strWriter.ToString());
                    curContext.Response.End();
                }
            }
            #endregion
    
            #region 将数据导出至Excel文件
           
            /// <summary>
            /// 将数据导出至Excel文件
            /// </summary>
            /// <param name="Table">DataTable对象</param>
            /// <param name="ExcelFilePath">Excel文件路径</param>
            public static bool OutputToExcel(DataTable Table, string ExcelFilePath)
            {
                if (File.Exists(ExcelFilePath))
                {
                    throw new Exception("该文件已经存在!");
                }
    
                if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
                {
                    Table.TableName = "Sheet1";
                }
    
                //数据表的列数
                int ColCount = Table.Columns.Count;
    
                //用于记数,实例化参数时的序号
                int i = 0;
    
                //创建参数
                OleDbParameter[] para = new OleDbParameter[ColCount];
    
                //创建表结构的SQL语句
                string TableStructStr = @"Create Table " + Table.TableName + "(";
    
                //连接字符串
                string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
                OleDbConnection objConn = new OleDbConnection(connString);
    
                //创建表结构
                OleDbCommand objCmd = new OleDbCommand();
    
                //数据类型集合
                ArrayList DataTypeList = new ArrayList();
                DataTypeList.Add("System.Decimal");
                DataTypeList.Add("System.Double");
                DataTypeList.Add("System.Int16");
                DataTypeList.Add("System.Int32");
                DataTypeList.Add("System.Int64");
                DataTypeList.Add("System.Single");
    
                //遍历数据表的所有列,用于创建表结构
                foreach (DataColumn col in Table.Columns)
                {
                    //如果列属于数字列,则设置该列的数据类型为double
                    if (DataTypeList.IndexOf(col.DataType.ToString()) >= 0)
                    {
                        para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.Double);
                        objCmd.Parameters.Add(para[i]);
    
                        //如果是最后一列
                        if (i + 1 == ColCount)
                        {
                            TableStructStr += col.ColumnName + " double)";
                        }
                        else
                        {
                            TableStructStr += col.ColumnName + " double,";
                        }
                    }
                    else
                    {
                        para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.VarChar);
                        objCmd.Parameters.Add(para[i]);
    
                        //如果是最后一列
                        if (i + 1 == ColCount)
                        {
                            TableStructStr += col.ColumnName + " varchar)";
                        }
                        else
                        {
                            TableStructStr += col.ColumnName + " varchar,";
                        }
                    }
                    i++;
                }
    
                //创建Excel文件及文件结构
                try
                {
                    objCmd.Connection = objConn;
                    objCmd.CommandText = TableStructStr;
    
                    if (objConn.State == ConnectionState.Closed)
                    {
                        objConn.Open();
                    }
                    objCmd.ExecuteNonQuery();
                }
                catch (Exception exp)
                {
                    throw exp;
                }
    
                //插入记录的SQL语句
                string InsertSql_1 = "Insert into " + Table.TableName + " (";
                string InsertSql_2 = " Values (";
                string InsertSql = "";
    
                //遍历所有列,用于插入记录,在此创建插入记录的SQL语句
                for (int colID = 0; colID < ColCount; colID++)
                {
                    if (colID + 1 == ColCount)  //最后一列
                    {
                        InsertSql_1 += Table.Columns[colID].ColumnName + ")";
                        InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ")";
                    }
                    else
                    {
                        InsertSql_1 += Table.Columns[colID].ColumnName + ",";
                        InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ",";
                    }
                }
    
                InsertSql = InsertSql_1 + InsertSql_2;
    
                //遍历数据表的所有数据行
                for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
                {
                    for (int colID = 0; colID < ColCount; colID++)
                    {
                        if (para[colID].DbType == DbType.Double && Table.Rows[rowID][colID].ToString().Trim() == "")
                        {
                            para[colID].Value = 0;
                        }
                        else
                        {
                            para[colID].Value = Table.Rows[rowID][colID].ToString().Trim();
                        }
                    }
                    try
                    {
                        objCmd.CommandText = InsertSql;
                        objCmd.ExecuteNonQuery();
                    }
                    catch (Exception exp)
                    {
                        string str = exp.Message;
                    }
                }
                try
                {
                    if (objConn.State == ConnectionState.Open)
                    {
                        objConn.Close();
                    }
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                return true;
            }
            #endregion
    
            #region 将数据导出至Excel文件
    
           
            /// <summary>
            /// 将数据导出至Excel文件
            /// </summary>
            /// <param name="Table">DataTable对象</param>
            /// <param name="Columns">要导出的数据列集合</param>
            /// <param name="ExcelFilePath">Excel文件路径</param>
            public static bool OutputToExcel(DataTable Table, ArrayList Columns, string ExcelFilePath)
            {
                if (File.Exists(ExcelFilePath))
                {
                    throw new Exception("该文件已经存在!");
                }
    
                //如果数据列数大于表的列数,取数据表的所有列
                if (Columns.Count > Table.Columns.Count)
                {
                    for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++)
                    {
                        Columns.RemoveAt(s);   //移除数据表列数后的所有列
                    }
                }
    
                //遍历所有的数据列,如果有数据列的数据类型不是 DataColumn,则将它移除
                DataColumn column = new DataColumn();
                for (int j = 0; j < Columns.Count; j++)
                {
                    try
                    {
                        column = (DataColumn)Columns[j];
                    }
                    catch (Exception)
                    {
                        Columns.RemoveAt(j);
                    }
                }
                if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))
                {
                    Table.TableName = "Sheet1";
                }
    
                //数据表的列数
                int ColCount = Columns.Count;
    
                //创建参数
                OleDbParameter[] para = new OleDbParameter[ColCount];
    
                //创建表结构的SQL语句
                string TableStructStr = @"Create Table " + Table.TableName + "(";
    
                //连接字符串
                string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
                OleDbConnection objConn = new OleDbConnection(connString);
    
                //创建表结构
                OleDbCommand objCmd = new OleDbCommand();
    
                //数据类型集合
                ArrayList DataTypeList = new ArrayList();
                DataTypeList.Add("System.Decimal");
                DataTypeList.Add("System.Double");
                DataTypeList.Add("System.Int16");
                DataTypeList.Add("System.Int32");
                DataTypeList.Add("System.Int64");
                DataTypeList.Add("System.Single");
    
                DataColumn col = new DataColumn();
    
                //遍历数据表的所有列,用于创建表结构
                for (int k = 0; k < ColCount; k++)
                {
                    col = (DataColumn)Columns[k];
    
                    //列的数据类型是数字型
                    if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0)
                    {
                        para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double);
                        objCmd.Parameters.Add(para[k]);
    
                        //如果是最后一列
                        if (k + 1 == ColCount)
                        {
                            TableStructStr += col.Caption.Trim() + " Double)";
                        }
                        else
                        {
                            TableStructStr += col.Caption.Trim() + " Double,";
                        }
                    }
                    else
                    {
                        para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar);
                        objCmd.Parameters.Add(para[k]);
    
                        //如果是最后一列
                        if (k + 1 == ColCount)
                        {
                            TableStructStr += col.Caption.Trim() + " VarChar)";
                        }
                        else
                        {
                            TableStructStr += col.Caption.Trim() + " VarChar,";
                        }
                    }
                }
    
                //创建Excel文件及文件结构
                try
                {
                    objCmd.Connection = objConn;
                    objCmd.CommandText = TableStructStr;
    
                    if (objConn.State == ConnectionState.Closed)
                    {
                        objConn.Open();
                    }
                    objCmd.ExecuteNonQuery();
                }
                catch (Exception exp)
                {
                    throw exp;
                }
    
                //插入记录的SQL语句
                string InsertSql_1 = "Insert into " + Table.TableName + " (";
                string InsertSql_2 = " Values (";
                string InsertSql = "";
    
                //遍历所有列,用于插入记录,在此创建插入记录的SQL语句
                for (int colID = 0; colID < ColCount; colID++)
                {
                    if (colID + 1 == ColCount)  //最后一列
                    {
                        InsertSql_1 += Columns[colID].ToString().Trim() + ")";
                        InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")";
                    }
                    else
                    {
                        InsertSql_1 += Columns[colID].ToString().Trim() + ",";
                        InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ",";
                    }
                }
    
                InsertSql = InsertSql_1 + InsertSql_2;
    
                //遍历数据表的所有数据行
                DataColumn DataCol = new DataColumn();
                for (int rowID = 0; rowID < Table.Rows.Count; rowID++)
                {
                    for (int colID = 0; colID < ColCount; colID++)
                    {
                        //因为列不连续,所以在取得单元格时不能用行列编号,列需得用列的名称
                        DataCol = (DataColumn)Columns[colID];
                        if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "")
                        {
                            para[colID].Value = 0;
                        }
                        else
                        {
                            para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim();
                        }
                    }
                    try
                    {
                        objCmd.CommandText = InsertSql;
                        objCmd.ExecuteNonQuery();
                    }
                    catch (Exception exp)
                    {
                        string str = exp.Message;
                    }
                }
                try
                {
                    if (objConn.State == ConnectionState.Open)
                    {
                        objConn.Close();
                    }
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                return true;
            }
            #endregion
            #endregion
    
            #region  获取Excel文件数据表列表
           
            /// <summary>
            /// 获取Excel文件数据表列表
            /// </summary>
            public static ArrayList GetExcelTables(string ExcelFileName)
            {
                DataTable dt = new DataTable();
                ArrayList TablesList = new ArrayList();
                if (File.Exists(ExcelFileName))
                {
                    using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
                    {
                        try
                        {
                            conn.Open();
                            dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        }
                        catch (Exception exp)
                        {
                            throw exp;
                        }
    
                        //获取数据表个数
                        int tablecount = dt.Rows.Count;
                        for (int i = 0; i < tablecount; i++)
                        {
                            string tablename = dt.Rows[i][2].ToString().Trim().TrimEnd('$');
                            if (TablesList.IndexOf(tablename) < 0)
                            {
                                TablesList.Add(tablename);
                            }
                        }
                    }
                }
                return TablesList;
            }
            #endregion
    
            #region      将Excel文件导出至DataTable(第一行作为表头)
           
            /// <summary>
            /// 将Excel文件导出至DataTable(第一行作为表头)
            /// </summary>
            /// <param name="ExcelFilePath">Excel文件路径</param>
            /// <param name="TableName">数据表名,如果数据表名错误,默认为第一个数据表名</param>
            public static DataTable InputFromExcel(string ExcelFilePath, string TableName)
            {
                if (!File.Exists(ExcelFilePath))
                {
                    throw new Exception("Excel文件不存在!");
                }
    
                //如果数据表名不存在,则数据表名为Excel文件的第一个数据表
                ArrayList TableList = new ArrayList();
                TableList = GetExcelTables(ExcelFilePath);
    
                if (TableName.IndexOf(TableName) < 0)
                {
                    TableName = TableList[0].ToString().Trim();
                }
    
                DataTable table = new DataTable();
                OleDbConnection dbcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0");
                OleDbCommand cmd = new OleDbCommand("select * from [" + TableName + "$]", dbcon);
                OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    
                try
                {
                    if (dbcon.State == ConnectionState.Closed)
                    {
                        dbcon.Open();
                    }
                    adapter.Fill(table);
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                finally
                {
                    if (dbcon.State == ConnectionState.Open)
                    {
                        dbcon.Close();
                    }
                }
                return table;
            }
            #endregion
       
            #region 获取Excel文件指定数据表的数据列表
    
           
            /// <summary>
            /// 获取Excel文件指定数据表的数据列表
            /// </summary>
            /// <param name="ExcelFileName">Excel文件名</param>
            /// <param name="TableName">数据表名</param>
            public static ArrayList GetExcelTableColumns(string ExcelFileName, string TableName)
            {
                DataTable dt = new DataTable();
                ArrayList ColsList = new ArrayList();
                if (File.Exists(ExcelFileName))
                {
                    using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))
                    {
                        conn.Open();
                        dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });
    
                        //获取列个数
                        int colcount = dt.Rows.Count;
                        for (int i = 0; i < colcount; i++)
                        {
                            string colname = dt.Rows[i]["Column_Name"].ToString().Trim();
                            ColsList.Add(colname);
                        }
                    }
                }
                return ColsList;
            }
            #endregion
          
            #region  清理过时的Excel文件
    
            private void ClearFile(string FilePath)
            {
                String[] Files = System.IO.Directory.GetFiles(FilePath);
                if (Files.Length > 10)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        try
                        {
                            System.IO.File.Delete(Files[i]);
                        }
                        catch
                        {
                        }
    
                    }
                }
            }
            #endregion
            
            #region 将数据转换为指定类型
            /// <summary>
            /// 将数据转换为指定类型
            /// </summary>
            /// <param name="data">转换的数据</param>
            /// <param name="targetType">转换的目标类型</param>
            public static object ConvertTo(object data, Type targetType)
            {
                if (data == null || Convert.IsDBNull(data))
                {
                    return null;
                }
    
                Type type2 = data.GetType();
                if (targetType == type2)
                {
                    return data;
                }
                if (((targetType == typeof(Guid)) || (targetType == typeof(Guid?))) && (type2 == typeof(string)))
                {
                    if (string.IsNullOrEmpty(data.ToString()))
                    {
                        return null;
                    }
                    return new Guid(data.ToString());
                }
    
                if (targetType.IsEnum)
                {
                    try
                    {
                        return Enum.Parse(targetType, data.ToString(), true);
                    }
                    catch
                    {
                        return Enum.ToObject(targetType, data);
                    }
                }
    
                if (targetType.IsGenericType)
                {
                    targetType = targetType.GetGenericArguments()[0];
                }
    
                return Convert.ChangeType(data, targetType);
            }
    
            /// <summary>
            /// 将数据转换为指定类型
            /// </summary>
            /// <typeparam name="T">转换的目标类型</typeparam>
            /// <param name="data">转换的数据</param>
            public static T ConvertTo<T>(object data)
            {
                if (data == null || Convert.IsDBNull(data))
                    return default(T);
    
                object obj = ConvertTo(data, typeof(T));
                if (obj == null)
                {
                    return default(T);
                }
                return (T)obj;
            }
            #endregion
        }
    }
    

9.ImageHelper

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace Core.Drawing
{
    class ImageHelper
    {     
        /// <summary>
        /// 改变原图片的格式,使其成为后缀名为strFormat的图片
        /// path是图片的地址
        /// </summary>
        /// <param name="path">原图片的地址</param>
        /// <param name="strFormat">修改后图片的格式</param>
        /// <param name="isDelSourcefile">是否删除源文件</param>
        public static void ChangeFormat(string path, string strFormat, bool isDelSourcefile)
        {
            if (isAPicFile(path) == false)
            {
                MessageBox.Show("非图片文件,请确定路径");
                return;
            }
            Image img = null;
            bool canGoOn = true;
            try
            {
                img = Image.FromFile(path);
            }
            catch (Exception)
            {
                MessageBox.Show("文件" + path + "未找到,请确认路径是否正确");
                canGoOn = false;
            }
            if (canGoOn)////已经打开成功
            {
                try
                {
                    img.Save(getDirectory(path) + "." + strFormat); //CAN
                }
                catch (Exception)
                {
                    canGoOn = false;
                }
                if (canGoOn)//修改格式成功
                {
                    try
                    {
                        img.Dispose();
                        if (isDelSourcefile)
                        {
                            File.Delete(path);
                        }
                    }
                    catch (Exception efail)
                    {
                        MessageBox.Show("文件" + path + "删除失败,错误原因:" + efail.Message);
                    }
                }
            }
        }

        /// <summary>
        /// 改变图片尺寸的函数,原则上不会有变大的可能性,所以我会将其减小
        /// 而且会保存图片,并且决定时候删除原文件,否则保存时文件名要改动
        /// </summary>
        /// <param name="path">文件的路径</param>
        /// <param name="width">要修改的宽度</param>
        /// <param name="height">要修改的高度</param>
        /// <param name="isDelSourceFile">是否删除原文件</param>
        public static void ChangeSize(string path, int width, int height, bool isDelSourceFile)
        {
            if (isAPicFile(path) == false)
            {
                MessageBox.Show("非图片文件,请确定路径");
                return;
            }
            Image img = null;
            bool canGoOn = true;
            if (width <= 0 || height <= 0)
            {
                MessageBox.Show("尺寸错误,请不要使用非正整数尺寸!");
                return;
            }
            try
            {
                img = Image.FromFile(path);
            }
            catch (Exception)
            {
                MessageBox.Show("文件" + path + "未找到,请确认路径是否正确");
                canGoOn = false;
            }
            if (canGoOn)////已经打开成功
            {
                if (width > img.Width)
                {
                    width = img.Width;
                }
                if (height > img.Height)
                {
                    height = img.Height;
                }
                Bitmap bmp = new Bitmap(width, height);////Empty Bitmap
                Bitmap pic = (Bitmap)img;

                ///
                /// 缩小图片算法:
                /// 1,拿原长度比上要求的长度,得到一个double类型的比值 bi
                /// 2,依次将这个比值 bi 加 要求的长度次,每次得到的值取整,则这个整数就是要求的点!
                /// 3,将这些点填充到bmp变量里面,再将该变量强制转换成image格式,保存...
                ///
                double biOfWidth = ((double)pic.Width) / width;
                double biOfHeight = ((double)pic.Height) / height;
                int y = 0, x;
                double dy = 0, dx;
                for (int i = 0; i < height; i++)
                {
                    dy += biOfHeight;
                    y = (int)dy;
                    x = 0;
                    dx = 0;
                    for (int j = 0; j < width; j++)
                    {
                        dx += biOfWidth;
                        x = (int)dx;
                        try
                        {
                            bmp.SetPixel(j, i, pic.GetPixel(x - 1, y - 1));
                            //MessageBox.Show("" + j + " " + i + " " + x + " " + y);
                        }
                        catch (Exception) { MessageBox.Show("x=" + pic.Width); }
                    }
                }
                // img = (Image)pic;
                if (isDelSourceFile == true)
                {
                    img.Dispose();
                    File.Delete(path);
                    img = (Image)bmp;
                    img.Save(path);
                    MessageBox.Show("saved");
                }
                else
                {
                    img = (Image)bmp;
                    img.Save(getDirectory(path) + "_." + getLast(path));
                }
                pic.Dispose();
                bmp.Dispose();
                img.Dispose();
            }
        }
        /// <summary>
        /// 得到路径包含文件名但不包含后缀名的部分
        /// </summary>
        /// <param name="path">图片文件路径</param>
        /// <returns></returns>
        public static string getDirectory(string path)
        {
            for (int i = path.Length - 1; i >= 0; i--)
            {
                if (path[i] == '.')
                {
                    return path.Substring(0, i);
                }
            }
            return null;
        }
        /// <summary>
        /// 得到文件路径的后缀名
        /// </summary>
        /// <param name="path">图片文件的路径</param>
        /// <returns></returns>
        public static string getLast(string path)
        {
            for (int i = path.Length - 1; i >= 0; i--)
            {
                if (path[i] == '.')
                {
                    return path.Substring(i + 1, path.Length - i - 1);
                }
            }
            return null;
        }
        /// <summary>
        /// 判断是否是否是一个图片文件
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static bool isAPicFile(string path)
        {
            string last = getLast(path);
            last = last.Trim();
            if (last.Equals("jpg") || last.Equals("jpeg") || last.Equals("png") || last.Equals("bmp"))
            {
                return true;
            }
            return false;
        }
    }
}

10.Color Helper类

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace Core.Drawing
{
    #region Public Structs


    public struct MyColor
    {
        public RGB RGB;
        public HSB HSB;
        public CMYK CMYK;

        public MyColor(Color color)
        {
            this.RGB = color;
            this.HSB = color;
            this.CMYK = color;
        }

        public static implicit operator MyColor(Color color)
        {
            return new MyColor(color);
        }

        public static implicit operator Color(MyColor color)
        {
            return color.RGB;
        }

        public static bool operator ==(MyColor left, MyColor right)
        {
            return (left.RGB == right.RGB) && (left.HSB == right.HSB) && (left.CMYK == right.CMYK);
        }

        public static bool operator !=(MyColor left, MyColor right)
        {
            return !(left == right);
        }

        public void RGBUpdate()
        {
            this.HSB = this.RGB;
            this.CMYK = this.RGB;
        }

        public void HSBUpdate()
        {
            this.RGB = this.HSB;
            this.CMYK = this.HSB;
        }

        public void CMYKUpdate()
        {
            this.RGB = this.CMYK;
            this.HSB = this.CMYK;
        }

        public override string ToString()
        {
            return String.Format("{0}\r\n{1}\r\n{2}", RGB, HSB, CMYK);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }

    public struct RGB
    {
        private int red;
        private int green;
        private int blue;

        public int Red
        {
            get { return red; }
            set { red = ColorHelper.CheckColor(value); }
        }

        public int Green
        {
            get { return green; }
            set { green = ColorHelper.CheckColor(value); }
        }

        public int Blue
        {
            get { return blue; }
            set { blue = ColorHelper.CheckColor(value); }
        }

        public RGB(int red, int green, int blue)
            : this()
        {
            this.Red = red;
            this.Green = green;
            this.Blue = blue;
        }

        public RGB(Color color)
        {
            this = new RGB(color.R, color.G, color.B);
        }

        public static implicit operator RGB(Color color)
        {
            return new RGB(color.R, color.G, color.B);
        }

        public static implicit operator Color(RGB color)
        {
            return color.ToColor();
        }

        public static implicit operator HSB(RGB color)
        {
            return color.ToHSB();
        }

        public static implicit operator CMYK(RGB color)
        {
            return color.ToCMYK();
        }

        public static bool operator ==(RGB left, RGB right)
        {
            return (left.Red == right.Red) && (left.Green == right.Green) && (left.Blue == right.Blue);
        }

        public static bool operator !=(RGB left, RGB right)
        {
            return !(left == right);
        }

        public override string ToString()
        {
            return String.Format("Red: {0}, Green: {1}, Blue: {2}", Red, Green, Blue);
        }

        public static Color ToColor(int red, int green, int blue)
        {
            return Color.FromArgb(red, green, blue);
        }

        public Color ToColor()
        {
            return ToColor(Red, Green, Blue);
        }

        public static HSB ToHSB(Color color)
        {
            HSB hsb = new HSB();

            int Max, Min;

            if (color.R > color.G) { Max = color.R; Min = color.G; }
            else { Max = color.G; Min = color.R; }
            if (color.B > Max) Max = color.B;
            else if (color.B < Min) Min = color.B;

            int Diff = Max - Min;

            hsb.Brightness = (double)Max / 255;

            if (Max == 0) hsb.Saturation = 0;
            else hsb.Saturation = (double)Diff / Max;

            double q;
            if (Diff == 0) q = 0;
            else q = (double)60 / Diff;

            if (Max == color.R)
            {
                if (color.G < color.B) hsb.Hue = (360 + q * (color.G - color.B)) / 360;
                else hsb.Hue = q * (color.G - color.B) / 360;
            }
            else if (Max == color.G) hsb.Hue = (120 + q * (color.B - color.R)) / 360;
            else if (Max == color.B) hsb.Hue = (240 + q * (color.R - color.G)) / 360;
            else hsb.Hue = 0.0;

            return hsb;
        }

        public HSB ToHSB()
        {
            return ToHSB(this);
        }

        public static CMYK ToCMYK(Color color)
        {
            CMYK cmyk = new CMYK();
            double low = 1.0;

            cmyk.Cyan = (double)(255 - color.R) / 255;
            if (low > cmyk.Cyan)
                low = cmyk.Cyan;

            cmyk.Magenta = (double)(255 - color.G) / 255;
            if (low > cmyk.Magenta)
                low = cmyk.Magenta;

            cmyk.Yellow = (double)(255 - color.B) / 255;
            if (low > cmyk.Yellow)
                low = cmyk.Yellow;

            if (low > 0.0)
            {
                cmyk.Key = low;
            }

            return cmyk;
        }

        public CMYK ToCMYK()
        {
            return ToCMYK(this);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }

    public struct HSB
    {
        private double hue;
        private double saturation;
        private double brightness;

        public double Hue
        {
            get { return hue; }
            set { hue = ColorHelper.CheckColor(value); }
        }

        public double Hue360
        {
            get { return hue * 360; }
            set { hue = ColorHelper.CheckColor(value / 360); }
        }

        public double Saturation
        {
            get { return saturation; }
            set { saturation = ColorHelper.CheckColor(value); }
        }

        public double Saturation100
        {
            get { return saturation * 100; }
            set { saturation = ColorHelper.CheckColor(value / 100); }
        }

        public double Brightness
        {
            get { return brightness; }
            set { brightness = ColorHelper.CheckColor(value); }
        }

        public double Brightness100
        {
            get { return brightness * 100; }
            set { brightness = ColorHelper.CheckColor(value / 100); }
        }

        public HSB(double hue, double saturation, double brightness)
            : this()
        {
            this.Hue = hue;
            this.Saturation = saturation;
            this.Brightness = brightness;
        }

        public HSB(int hue, int saturation, int brightness)
            : this()
        {
            this.Hue360 = hue;
            this.Saturation100 = saturation;
            this.Brightness100 = brightness;
        }

        public HSB(Color color)
        {
            this = RGB.ToHSB(color);
        }

        public static implicit operator HSB(Color color)
        {
            return RGB.ToHSB(color);
        }

        public static implicit operator Color(HSB color)
        {
            return color.ToColor();
        }

        public static implicit operator RGB(HSB color)
        {
            return color.ToColor();
        }

        public static implicit operator CMYK(HSB color)
        {
            return color.ToColor();
        }

        public static bool operator ==(HSB left, HSB right)
        {
            return (left.Hue == right.Hue) && (left.Saturation == right.Saturation) && (left.Brightness == right.Brightness);
        }

        public static bool operator !=(HSB left, HSB right)
        {
            return !(left == right);
        }

        public override string ToString()
        {
            return String.Format("Hue: {0}, Saturation: {1}, Brightness: {2}", ColorHelper.Round(Hue360),
              ColorHelper.Round(Saturation100), ColorHelper.Round(Brightness100));
        }

        public static Color ToColor(HSB hsb)
        {
            int Mid;

            int Max = ColorHelper.Round(hsb.Brightness * 255);
            int Min = ColorHelper.Round((1.0 - hsb.Saturation) * (hsb.Brightness / 1.0) * 255);
            double q = (double)(Max - Min) / 255;

            if (hsb.Hue >= 0 && hsb.Hue <= (double)1 / 6)
            {
                Mid = ColorHelper.Round(((hsb.Hue - 0) * q) * 1530 + Min);
                return Color.FromArgb(Max, Mid, Min);
            }
            if (hsb.Hue <= (double)1 / 3)
            {
                Mid = ColorHelper.Round(-((hsb.Hue - (double)1 / 6) * q) * 1530 + Max);
                return Color.FromArgb(Mid, Max, Min);
            }
            if (hsb.Hue <= 0.5)
            {
                Mid = ColorHelper.Round(((hsb.Hue - (double)1 / 3) * q) * 1530 + Min);
                return Color.FromArgb(Min, Max, Mid);
            }
            if (hsb.Hue <= (double)2 / 3)
            {
                Mid = ColorHelper.Round(-((hsb.Hue - 0.5) * q) * 1530 + Max);
                return Color.FromArgb(Min, Mid, Max);
            }
            if (hsb.Hue <= (double)5 / 6)
            {
                Mid = ColorHelper.Round(((hsb.Hue - (double)2 / 3) * q) * 1530 + Min);
                return Color.FromArgb(Mid, Min, Max);
            }
            if (hsb.Hue <= 1.0)
            {
                Mid = ColorHelper.Round(-((hsb.Hue - (double)5 / 6) * q) * 1530 + Max);
                return Color.FromArgb(Max, Min, Mid);
            }
            return Color.FromArgb(0, 0, 0);
        }

        public static Color ToColor(double hue, double saturation, double brightness)
        {
            return ToColor(new HSB(hue, saturation, brightness));
        }

        public Color ToColor()
        {
            return ToColor(this);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }

    public struct CMYK
    {
        private double cyan;
        private double magenta;
        private double yellow;
        private double key;

        public double Cyan
        {
            get { return cyan; }
            set { cyan = ColorHelper.CheckColor(value); }
        }

        public double Cyan100
        {
            get { return cyan * 100; }
            set { cyan = ColorHelper.CheckColor(value / 100); }
        }

        public double Magenta
        {
            get { return magenta; }
            set { magenta = ColorHelper.CheckColor(value); }
        }

        public double Magenta100
        {
            get { return magenta * 100; }
            set { magenta = ColorHelper.CheckColor(value / 100); }
        }

        public double Yellow
        {
            get { return yellow; }
            set { yellow = ColorHelper.CheckColor(value); }
        }

        public double Yellow100
        {
            get { return yellow * 100; }
            set { yellow = ColorHelper.CheckColor(value / 100); }
        }

        public double Key
        {
            get { return key; }
            set { key = ColorHelper.CheckColor(value); }
        }

        public double Key100
        {
            get { return key * 100; }
            set { key = ColorHelper.CheckColor(value / 100); }
        }

        public CMYK(double cyan, double magenta, double yellow, double key)
            : this()
        {
            this.Cyan = cyan;
            this.Magenta = magenta;
            this.Yellow = yellow;
            this.Key = key;
        }

        public CMYK(int cyan, int magenta, int yellow, int key)
            : this()
        {
            this.Cyan100 = cyan;
            this.Magenta100 = magenta;
            this.Yellow100 = yellow;
            this.Key100 = key;
        }

        public CMYK(Color color)
        {
            this = RGB.ToCMYK(color);
        }

        public static implicit operator CMYK(Color color)
        {
            return RGB.ToCMYK(color);
        }

        public static implicit operator Color(CMYK color)
        {
            return color.ToColor();
        }

        public static implicit operator RGB(CMYK color)
        {
            return color.ToColor();
        }

        public static implicit operator HSB(CMYK color)
        {
            return color.ToColor();
        }

        public static bool operator ==(CMYK left, CMYK right)
        {
            return (left.Cyan == right.Cyan) && (left.Magenta == right.Magenta) && (left.Yellow == right.Yellow) &&
                (left.Key == right.Key);
        }

        public static bool operator !=(CMYK left, CMYK right)
        {
            return !(left == right);
        }

        public override string ToString()
        {
            return String.Format("Cyan: {0}, Magenta: {1}, Yellow: {2}, Key: {3}", ColorHelper.Round(Cyan100),
              ColorHelper.Round(Magenta100), ColorHelper.Round(Yellow100), ColorHelper.Round(Key100));
        }

        public static Color ToColor(CMYK cmyk)
        {
            int red = ColorHelper.Round(255 - (255 * cmyk.Cyan));
            int green = ColorHelper.Round(255 - (255 * cmyk.Magenta));
            int blue = ColorHelper.Round(255 - (255 * cmyk.Yellow));

            return Color.FromArgb(red, green, blue);
        }

        public static Color ToColor(double cyan, double magenta, double yellow, double key)
        {
            return ToColor(new CMYK(cyan, magenta, yellow, key));
        }

        public Color ToColor()
        {
            return ToColor(this);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }

    #endregion

    internal class ColorHelper
    {
        #region CheckColorHelper
        public static double CheckColor(double number)
        {
            return GetBetween(number, 0, 1);
        }

        public static int CheckColor(int number)
        {
            return GetBetween(number, 0, 255);
        }

        public static int GetBetween(int number, int min, int max)
        {
            return Math.Max(Math.Min(number, max), min);
        }

        public static double GetBetween(double value, double min, double max)
        {
            return Math.Max(Math.Min(value, max), min);
        }

        public static int Round(double val)
        {
            int ret_val = (int)val;

            int temp = (int)(val * 100);

            if ((temp % 100) >= 50)
                ret_val += 1;

            return ret_val;
        }
        #endregion
    }

    /// <summary>
    /// RGB颜色操作辅助类
    /// </summary>
    public static class MyColors
    {
        public static Color ParseColor(string color)
        {
            if (color.StartsWith("#"))
            {
                return MyColors.HexToColor(color);
            }
            else if (color.Contains(","))
            {
                string[] colorArray = color.Split(',');
                List<int> colorList = new List<int>();
                foreach (string strColor in colorArray)
                {
                    colorList.Add(Convert.ToInt32(strColor));
                }
                int[] colors = colorList.ToArray();

                if (colors.Length == 3)
                {
                    return Color.FromArgb(colors[0], colors[1], colors[2]);
                }
                if (colors.Length == 4)
                {
                    return Color.FromArgb(colors[0], colors[1], colors[2], colors[3]);
                }
            }

            return Color.FromName(color);
        }

        public static string ColorToHex(Color color)
        {
            return string.Format("{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
        }

        public static int ColorToDecimal(Color color)
        {
            return HexToDecimal(ColorToHex(color));
        }

        public static Color HexToColor(string hex)
        {
            if (hex.StartsWith("#"))
            {
                hex = hex.Substring(1);
            }

            string a = string.Empty;

            if (hex.Length == 8)
            {
                a = hex.Substring(0, 2);
                hex = hex.Substring(2);
            }

            string r = hex.Substring(0, 2);
            string g = hex.Substring(2, 2);
            string b = hex.Substring(4, 2);

            if (string.IsNullOrEmpty(a))
            {
                return Color.FromArgb(HexToDecimal(r), HexToDecimal(g), HexToDecimal(b));
            }
            else
            {
                return Color.FromArgb(HexToDecimal(a), HexToDecimal(r), HexToDecimal(g), HexToDecimal(b));
            }
        }

        public static int HexToDecimal(string hex)
        {
            //return int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
            return Convert.ToInt32(hex, 16);
        }

        public static string DecimalToHex(int dec)
        {
            return dec.ToString("X6");
        }

        public static Color DecimalToColor(int dec)
        {
            return Color.FromArgb(dec & 0xFF, (dec & 0xff00) / 256, dec / 65536);
        }

        public static Color GetPixelColor(Point point)
        {
            Bitmap bmp = new Bitmap(1, 1);
            Graphics.FromImage(bmp).CopyFromScreen(point, new Point(0, 0), new Size(1, 1));
            return bmp.GetPixel(0, 0);
        }

        public static Color SetHue(Color c, double Hue)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Hue = Hue;
            return hsb.ToColor();
        }

        public static Color ModifyHue(Color c, double Hue)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Hue *= Hue;
            return hsb.ToColor();
        }

        public static Color SetSaturation(Color c, double Saturation)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Saturation = Saturation;
            return hsb.ToColor();
        }

        public static Color ModifySaturation(Color c, double Saturation)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Saturation *= Saturation;
            return hsb.ToColor();
        }

        public static Color SetBrightness(Color c, double brightness)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Brightness = brightness;
            return hsb.ToColor();
        }

        public static Color ModifyBrightness(Color c, double brightness)
        {
            HSB hsb = RGB.ToHSB(c);
            hsb.Brightness *= brightness;
            return hsb.ToColor();
        }

        public static Color RandomColor()
        {
            Random rand = new Random();
            return Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
        }
    }
}

11.ImageClass 类

using System;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Core.Drawing
{
    public class ImageClass
    {
        public ImageClass()
        { }
        public static string[] postion = new string[] { "WM_TOP_LEFT", "WM_TOP_RIGHT", "WM_TOP_MIDDLE", "WM_BOTTOM_RIGHT", "WM_BOTTOM_LEFT", "WM_BOTTOM_MIDDLE" };

        #region 缩略图
        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="originalImagePath">源图路径(物理路径)</param>
        /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">生成缩略图的方式</param>    
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);

            int towidth = width;
            int toheight = height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;

            switch (mode)
            {
                case "HW":  //指定高宽缩放(可能变形)                
                    break;
                case "W":   //指定宽,高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H":   //指定高,宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut": //指定高宽裁减(不变形)                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
                new System.Drawing.Rectangle(x, y, ow, oh),
                System.Drawing.GraphicsUnit.Pixel);

            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }
        #endregion

        #region 图片水印
        /// <summary>
        /// 图片水印处理方法
        /// </summary>
        /// <param name="path">需要加载水印的图片路径(绝对路径)</param>
        /// <param name="waterpath">水印图片(绝对路径)</param>
        /// <param name="location">水印位置(传送正确的代码)</param>
        public static string ImageWatermark(string path, string waterpath, string location)
        {
            string kz_name = Path.GetExtension(path);
            if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")
            {
                DateTime time = DateTime.Now;
                string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();
                Image img = Bitmap.FromFile(path);
                Image waterimg = Image.FromFile(waterpath);
                Graphics g = Graphics.FromImage(img);
                ArrayList loca = GetLocation(location, img, waterimg);
                g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), waterimg.Width, waterimg.Height));
                waterimg.Dispose();
                g.Dispose();
                string newpath = Path.GetDirectoryName(path) + filename + kz_name;
                img.Save(newpath);
                img.Dispose();
                File.Copy(newpath, path, true);
                if (File.Exists(newpath))
                {
                    File.Delete(newpath);
                }
            }
            return path;
        }

        /// <summary>
        /// 图片水印位置处理方法
        /// </summary>
        /// <param name="location">水印位置</param>
        /// <param name="img">需要添加水印的图片</param>
        /// <param name="waterimg">水印图片</param>
        private static ArrayList GetLocation(string location, Image img, Image waterimg)
        {
            ArrayList loca = new ArrayList();
            int x = 0;
            int y = 0;

            if (location == "LT")
            {
                x = 10;
                y = 10;
            }
            else if (location == "T")
            {
                x = img.Width / 2 - waterimg.Width / 2;
                y = img.Height - waterimg.Height;
            }
            else if (location == "RT")
            {
                x = img.Width - waterimg.Width;
                y = 10;
            }
            else if (location == "LC")
            {
                x = 10;
                y = img.Height / 2 - waterimg.Height / 2;
            }
            else if (location == "C")
            {
                x = img.Width / 2 - waterimg.Width / 2;
                y = img.Height / 2 - waterimg.Height / 2;
            }
            else if (location == "RC")
            {
                x = img.Width - waterimg.Width;
                y = img.Height / 2 - waterimg.Height / 2;
            }
            else if (location == "LB")
            {
                x = 10;
                y = img.Height - waterimg.Height;
            }
            else if (location == "B")
            {
                x = img.Width / 2 - waterimg.Width / 2;
                y = img.Height - waterimg.Height;
            }
            else
            {
                x = img.Width - waterimg.Width;
                y = img.Height - waterimg.Height;
            }
            loca.Add(x);
            loca.Add(y);
            return loca;
        }
        /// <summary>
        ///  加水印图片
        /// </summary>
        /// <param name="picture">imge 对象</param>
        /// <param name="WaterMarkPicPath">水印图片的地址</param>
        /// <param name="_watermarkPosition">水印位置</param>
        /// <param name="_width">被加水印图片的宽</param>
        /// <param name="_height">被加水印图片的高</param>
        public static void addWatermarkImage(Graphics picture, string WaterMarkPicPath, string _watermarkPosition, int _width, int _height)
        {
            Image watermark = new Bitmap(WaterMarkPicPath);

            int xpos = 0;
            int ypos = 0;

            int w = watermark.Width;
            int h = watermark.Height;

            switch (_watermarkPosition)
            {
                case "WM_TOP_LEFT":
                    xpos = 0 + 10;
                    ypos = 0 + 10;
                    break;
                case "WM_TOP_RIGHT":
                    xpos = _width - w - 10;
                    ypos = 0 + 10;
                    break;
                case "WM_BOTTOM_RIGHT":
                    xpos = _width - w - 10;
                    ypos = _height - h - 10;
                    break;
                case "WM_BOTTOM_LEFT":
                    xpos = 0 + 10;
                    ypos = _height - h - 10;
                    break;
                case "WM_BOTTOM_MIDDLE":
                    xpos = _width / 2 - w / 2;
                    ypos = _height - h - 10;
                    break;
                case "WM_TOP_MIDDLE":
                    xpos = _width / 2 - w / 2;
                    ypos = 0 + 10;
                    break;
            }

            picture.DrawImage(watermark, xpos, ypos, w, h);


            watermark.Dispose();
        }

        /// <summary>
        /// 打水印
        /// </summary>
        /// <param name="img"></param>
        /// <param name="saveFile">保存文件路径</param>
        /// <param name="logoFile">LOGO文件地址</param>
        public static void MakeLogo(Image img, string saveFile, string logoFile)
        {
            using (System.Drawing.Image logo = System.Drawing.Image.FromFile(logoFile))
            {
                if (img.Width < logo.Width || img.Height < logo.Height)
                    img.Save(saveFile);
                else
                {
                    Graphics g = System.Drawing.Graphics.FromImage(img);
                    Random r = new Random();
                    g.DrawImage(logo, img.Width - logo.Width - r.Next(img.Width - logo.Width), img.Height - logo.Height - r.Next(img.Height - logo.Height), logo.Width, logo.Height);

                    g.Save();
                    img.Save(saveFile);
                    g.Dispose();
                }
                logo.Dispose();
            }
        }
        #endregion

        #region 文字水印
        /// <summary>
        /// 文字水印处理方法
        /// </summary>
        /// <param name="path">图片路径(绝对路径)</param>
        /// <param name="size">字体大小</param>
        /// <param name="letter">水印文字</param>
        /// <param name="color">颜色</param>
        /// <param name="location">水印位置</param>
        public static string LetterWatermark(string path, int size, string letter, Color color, string location)
        {
            #region

            string kz_name = Path.GetExtension(path);
            if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")
            {
                DateTime time = DateTime.Now;
                string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();
                Image img = Bitmap.FromFile(path);
                Graphics gs = Graphics.FromImage(img);
                ArrayList loca = GetLocation(location, img, size, letter.Length);
                Font font = new Font("宋体", size);
                Brush br = new SolidBrush(color);
                gs.DrawString(letter, font, br, float.Parse(loca[0].ToString()), float.Parse(loca[1].ToString()));
                gs.Dispose();
                string newpath = Path.GetDirectoryName(path) + filename + kz_name;
                img.Save(newpath);
                img.Dispose();
                File.Copy(newpath, path, true);
                if (File.Exists(newpath))
                {
                    File.Delete(newpath);
                }
            }
            return path;

            #endregion
        }

        /// <summary>
        /// 文字水印位置的方法
        /// </summary>
        /// <param name="location">位置代码</param>
        /// <param name="img">图片对象</param>
        /// <param name="width">宽(当水印类型为文字时,传过来的就是字体的大小)</param>
        /// <param name="height">高(当水印类型为文字时,传过来的就是字符的长度)</param>
        private static ArrayList GetLocation(string location, Image img, int width, int height)
        {
            #region

            ArrayList loca = new ArrayList();  //定义数组存储位置
            float x = 10;
            float y = 10;

            if (location == "LT")
            {
                loca.Add(x);
                loca.Add(y);
            }
            else if (location == "T")
            {
                x = img.Width / 2 - (width * height) / 2;
                loca.Add(x);
                loca.Add(y);
            }
            else if (location == "RT")
            {
                x = img.Width - width * height;
            }
            else if (location == "LC")
            {
                y = img.Height / 2;
            }
            else if (location == "C")
            {
                x = img.Width / 2 - (width * height) / 2;
                y = img.Height / 2;
            }
            else if (location == "RC")
            {
                x = img.Width - height;
                y = img.Height / 2;
            }
            else if (location == "LB")
            {
                y = img.Height - width - 5;
            }
            else if (location == "B")
            {
                x = img.Width / 2 - (width * height) / 2;
                y = img.Height - width - 5;
            }
            else
            {
                x = img.Width - width * height;
                y = img.Height - width - 5;
            }
            loca.Add(x);
            loca.Add(y);
            return loca;

            #endregion
        }
        #endregion

        #region 调整光暗
        /// <summary>
        /// 调整光暗
        /// </summary>
        /// <param name="mybm">原始图片</param>
        /// <param name="width">原始图片的长度</param>
        /// <param name="height">原始图片的高度</param>
        /// <param name="val">增加或减少的光暗值</param>
        public Bitmap LDPic(Bitmap mybm, int width, int height, int val)
        {
            Bitmap bm = new Bitmap(width, height);//初始化一个记录经过处理后的图片对象
            int x, y, resultR, resultG, resultB;//x、y是循环次数,后面三个是记录红绿蓝三个值的
            Color pixel;
            for (x = 0; x < width; x++)
            {
                for (y = 0; y < height; y++)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前像素的值
                    resultR = pixel.R + val;//检查红色值会不会超出[0, 255]
                    resultG = pixel.G + val;//检查绿色值会不会超出[0, 255]
                    resultB = pixel.B + val;//检查蓝色值会不会超出[0, 255]
                    bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图
                }
            }
            return bm;
        }
        #endregion

        #region 反色处理
        /// <summary>
        /// 反色处理
        /// </summary>
        /// <param name="mybm">原始图片</param>
        /// <param name="width">原始图片的长度</param>
        /// <param name="height">原始图片的高度</param>
        public Bitmap RePic(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);//初始化一个记录处理后的图片的对象
            int x, y, resultR, resultG, resultB;
            Color pixel;
            for (x = 0; x < width; x++)
            {
                for (y = 0; y < height; y++)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                    resultR = 255 - pixel.R;//反红
                    resultG = 255 - pixel.G;//反绿
                    resultB = 255 - pixel.B;//反蓝
                    bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图
                }
            }
            return bm;
        }
        #endregion

        #region 浮雕处理
        /// <summary>
        /// 浮雕处理
        /// </summary>
        /// <param name="oldBitmap">原始图片</param>
        /// <param name="Width">原始图片的长度</param>
        /// <param name="Height">原始图片的高度</param>
        public Bitmap FD(Bitmap oldBitmap, int Width, int Height)
        {
            Bitmap newBitmap = new Bitmap(Width, Height);
            Color color1, color2;
            for (int x = 0; x < Width - 1; x++)
            {
                for (int y = 0; y < Height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    color1 = oldBitmap.GetPixel(x, y);
                    color2 = oldBitmap.GetPixel(x + 1, y + 1);
                    r = Math.Abs(color1.R - color2.R + 128);
                    g = Math.Abs(color1.G - color2.G + 128);
                    b = Math.Abs(color1.B - color2.B + 128);
                    if (r > 255) r = 255;
                    if (r < 0) r = 0;
                    if (g > 255) g = 255;
                    if (g < 0) g = 0;
                    if (b > 255) b = 255;
                    if (b < 0) b = 0;
                    newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b));
                }
            }
            return newBitmap;
        }
        #endregion

        #region 拉伸图片
        /// <summary>
        /// 拉伸图片
        /// </summary>
        /// <param name="bmp">原始图片</param>
        /// <param name="newW">新的宽度</param>
        /// <param name="newH">新的高度</param>
        public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH)
        {
            try
            {
                Bitmap bap = new Bitmap(newW, newH);
                Graphics g = Graphics.FromImage(bap);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel);
                g.Dispose();
                return bap;
            }
            catch
            {
                return null;
            }
        }
        #endregion

        #region 滤色处理
        /// <summary>
        /// 滤色处理
        /// </summary>
        /// <param name="mybm">原始图片</param>
        /// <param name="width">原始图片的长度</param>
        /// <param name="height">原始图片的高度</param>
        public Bitmap FilPic(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);//初始化一个记录滤色效果的图片对象
            int x, y;
            Color pixel;

            for (x = 0; x < width; x++)
            {
                for (y = 0; y < height; y++)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                    bm.SetPixel(x, y, Color.FromArgb(0, pixel.G, pixel.B));//绘图
                }
            }
            return bm;
        }
        #endregion

        #region 左右翻转
        /// <summary>
        /// 左右翻转
        /// </summary>
        /// <param name="mybm">原始图片</param>
        /// <param name="width">原始图片的长度</param>
        /// <param name="height">原始图片的高度</param>
        public Bitmap RevPicLR(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);
            int x, y, z; //x,y是循环次数,z是用来记录像素点的x坐标的变化的
            Color pixel;
            for (y = height - 1; y >= 0; y--)
            {
                for (x = width - 1, z = 0; x >= 0; x--)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前像素的值
                    bm.SetPixel(z++, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图
                }
            }
            return bm;
        }
        #endregion

        #region 上下翻转
        /// <summary>
        /// 上下翻转
        /// </summary>
        /// <param name="mybm">原始图片</param>
        /// <param name="width">原始图片的长度</param>
        /// <param name="height">原始图片的高度</param>
        public Bitmap RevPicUD(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);
            int x, y, z;
            Color pixel;
            for (x = 0; x < width; x++)
            {
                for (y = height - 1, z = 0; y >= 0; y--)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前像素的值
                    bm.SetPixel(x, z++, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图
                }
            }
            return bm;
        }
        #endregion

        #region 压缩图片
        /// <summary>
        /// 压缩到指定尺寸
        /// </summary>
        /// <param name="oldfile">原文件</param>
        /// <param name="newfile">新文件</param>
        public bool Compress(string oldfile, string newfile)
        {
            try
            {
                Image img = Image.FromFile(oldfile);
                ImageFormat thisFormat = img.RawFormat;
                Size newSize = new Size(100, 125);
                Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);
                Graphics g = Graphics.FromImage(outBmp);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.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[] 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;
                    }
                img.Dispose();
                if (jpegICI != null) outBmp.Save(newfile, System.Drawing.Imaging.ImageFormat.Jpeg);
                outBmp.Dispose();
                return true;
            }
            catch
            {
                return false;
            }
        }
        #region 图片压缩(降低质量)Compress
        private static ImageCodecInfo GetEncoderInfo(String mimeType)
        {
            int j;
            ImageCodecInfo[] encoders;
            encoders = ImageCodecInfo.GetImageEncoders();
            for (j = 0; j < encoders.Length; ++j)
            {
                if (encoders[j].MimeType == mimeType)
                    return encoders[j];
            }
            return null;
        }
        /// <summary>
        /// 图片压缩(降低质量以减小文件的大小)
        /// </summary>
        /// <param name="srcBitmap">传入的Bitmap对象</param>
        /// <param name="destStream">压缩后的Stream对象</param>
        /// <param name="level">压缩等级,0到100,0 最差质量,100 最佳</param>
        public static void Compress(Bitmap srcBitmap, Stream destStream, long level)
        {
            ImageCodecInfo myImageCodecInfo;
            Encoder myEncoder;
            EncoderParameter myEncoderParameter;
            EncoderParameters myEncoderParameters;
            myImageCodecInfo = GetEncoderInfo("image/jpeg");
            myEncoder = Encoder.Quality;
            myEncoderParameters = new EncoderParameters(1);
            myEncoderParameter = new EncoderParameter(myEncoder, level);
            myEncoderParameters.Param[0] = myEncoderParameter;
            srcBitmap.Save(destStream, myImageCodecInfo, myEncoderParameters);
        }
        /// <summary>
        /// 图片压缩(降低质量以减小文件的大小)
        /// </summary>
        /// <param name="srcBitMap">传入的Bitmap对象</param>
        /// <param name="destFile">压缩后的图片保存路径</param>
        /// <param name="level">压缩等级,0到100,0 最差质量,100 最佳</param>
        public static void Compress(Bitmap srcBitMap, string destFile, long level)
        {
            Stream s = new FileStream(destFile, FileMode.Create);
            Compress(srcBitMap, s, level);
            s.Close();
        }
        /// <summary>
        /// 图片压缩(降低质量以减小文件的大小)
        /// </summary>
        /// <param name="srcFile">传入的Stream对象</param>
        /// <param name="destFile">压缩后的图片保存路径</param>
        /// <param name="level">压缩等级,0到100,0 最差质量,100 最佳</param>
        public static void Compress(Stream srcStream, string destFile, long level)
        {
            Bitmap bm = new Bitmap(srcStream);
            Compress(bm, destFile, level);
            bm.Dispose();
        }
        /// <summary>
        /// 图片压缩(降低质量以减小文件的大小)
        /// </summary>
        /// <param name="srcFile">传入的Image对象</param>
        /// <param name="destFile">压缩后的图片保存路径</param>
        /// <param name="level">压缩等级,0到100,0 最差质量,100 最佳</param>
        public static void Compress(Image srcImg, string destFile, long level)
        {
            Bitmap bm = new Bitmap(srcImg);
            Compress(bm, destFile, level);
            bm.Dispose();
        }
        /// <summary>
        /// 图片压缩(降低质量以减小文件的大小)
        /// </summary>
        /// <param name="srcFile">待压缩的BMP文件名</param>
        /// <param name="destFile">压缩后的图片保存路径</param>
        /// <param name="level">压缩等级,0到100,0 最差质量,100 最佳</param>
        public static void Compress(string srcFile, string destFile, long level)
        {
            // Create a Bitmap object based on a BMP file.
            Bitmap bm = new Bitmap(srcFile);
            Compress(bm, destFile, level);
            bm.Dispose();
        }

        #endregion 图片压缩(降低质量)
        #endregion

        #region 图片灰度化
        public Color Gray(Color c)
        {
            int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B)));
            return Color.FromArgb(rgb, rgb, rgb);
        }
        #endregion

        #region 转换为黑白图片
        /// <summary>
        /// 转换为黑白图片
        /// </summary>
        /// <param name="mybt">要进行处理的图片</param>
        /// <param name="width">图片的长度</param>
        /// <param name="height">图片的高度</param>
        public Bitmap BWPic(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);
            int x, y, result; //x,y是循环次数,result是记录处理后的像素值
            Color pixel;
            for (x = 0; x < width; x++)
            {
                for (y = 0; y < height; y++)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                    result = (pixel.R + pixel.G + pixel.B) / 3;//取红绿蓝三色的平均值
                    bm.SetPixel(x, y, Color.FromArgb(result, result, result));
                }
            }
            return bm;
        }
        #endregion

        #region 获取图片中的各帧
        /// <summary>
        /// 获取图片中的各帧
        /// </summary>
        /// <param name="pPath">图片路径</param>
        /// <param name="pSavePath">保存路径</param>
        public void GetFrames(string pPath, string pSavedPath)
        {
            Image gif = Image.FromFile(pPath);
            FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]);
            int count = gif.GetFrameCount(fd); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧)
            for (int i = 0; i < count; i++)    //以Jpeg格式保存各帧
            {
                gif.SelectActiveFrame(fd, i);
                gif.Save(pSavedPath + "\\frame_" + i + ".jpg", ImageFormat.Jpeg);
            }
        }
        #endregion
    }
}

12.ImageDown 图片下载类

using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;

namespace Core.Drawing
{
    /// <summary>
    /// 图片下载
    /// </summary>
    public class ImageDown
    {
        public ImageDown()
        { }

        #region 私有方法
        /// <summary>
        /// 获取图片标志
        /// </summary>
        private string[] GetImgTag(string htmlStr)
        {
            Regex regObj = new Regex("<img.+?>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            string[] strAry = new string[regObj.Matches(htmlStr).Count];
            int i = 0;
            foreach (Match matchItem in regObj.Matches(htmlStr))
            {
                strAry[i] = GetImgUrl(matchItem.Value);
                i++;
            }
            return strAry;
        }

        /// <summary>
        /// 获取图片URL地址
        /// </summary>
        private string GetImgUrl(string imgTagStr)
        {
            string str = "";
            Regex regObj = new Regex("http://.+.(?:jpg|gif|bmp|png)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            foreach (Match matchItem in regObj.Matches(imgTagStr))
            {
                str = matchItem.Value;
            }
            return str;
        }
        #endregion

        /// <summary>
        /// 下载图片到本地
        /// </summary>
        /// <param name="strHTML">HTML</param>
        /// <param name="path">路径</param>
        /// <param name="nowyymm">年月</param>
        /// <param name="nowdd">日</param>
        public string SaveUrlPics(string strHTML, string path)
        {
            string nowym = DateTime.Now.ToString("yyyy-MM");  //当前年月
            string nowdd = DateTime.Now.ToString("dd");       //当天号数
            path = path + nowym + "/" + nowdd;
            if (!Directory.Exists(path)) Directory.CreateDirectory(path);

            string[] imgurlAry = GetImgTag(strHTML);
            try
            {
                for (int i = 0; i < imgurlAry.Length; i++)
                {
                    string preStr = System.DateTime.Now.ToString() + "_";
                    preStr = preStr.Replace("-", "");
                    preStr = preStr.Replace(":", "");
                    preStr = preStr.Replace(" ", "");
                    WebClient wc = new WebClient();
                    wc.DownloadFile(imgurlAry[i], path + "/" + preStr + imgurlAry[i].Substring(imgurlAry[i].LastIndexOf("/") + 1));
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return strHTML;
        }
    }
}

13. imageUpload 图片上传类

using System;
using System.IO;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Drawing;

namespace Core.Drawing
{
    /// <summary>
    /// 文件类型
    /// </summary>
    public enum FileExtension
    {
        JPG = 255216,
        GIF = 7173,
        BMP = 6677,
        PNG = 13780,
        RAR = 8297,
        jpg = 255216,
        exe = 7790,
        xml = 6063,
        html = 6033,
        aspx = 239187,
        cs = 117115,
        js = 119105,
        txt = 210187,
        sql = 255254
    }

    /// <summary>
    /// 图片检测类
    /// </summary>
    public static class FileValidation
    {
        #region 上传图片检测类
        /// <summary>
        /// 是否允许
        /// </summary>
        public static bool IsAllowedExtension(HttpPostedFile oFile, FileExtension[] fileEx)
        {
            int fileLen = oFile.ContentLength;
            byte[] imgArray = new byte[fileLen];
            oFile.InputStream.Read(imgArray, 0, fileLen);
            MemoryStream ms = new MemoryStream(imgArray);
            System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
            string fileclass = "";
            byte buffer;
            try
            {
                buffer = br.ReadByte();
                fileclass = buffer.ToString();
                buffer = br.ReadByte();
                fileclass += buffer.ToString();
            }
            catch { }
            br.Close();
            ms.Close();
            foreach (FileExtension fe in fileEx)
            {
                if (Int32.Parse(fileclass) == (int)fe) return true;
            }
            return false;
        }

        /// <summary>
        /// 上传前的图片是否可靠
        /// </summary>
        public static bool IsSecureUploadPhoto(HttpPostedFile oFile)
        {
            bool isPhoto = false;
            string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }
            if (!isPhoto)
            {
                return true;
            }
            FileExtension[] fe = { FileExtension.BMP, FileExtension.GIF, FileExtension.JPG, FileExtension.PNG };

            if (IsAllowedExtension(oFile, fe))
                return true;
            else
                return false;
        }

        /// <summary>
        /// 上传后的图片是否安全
        /// </summary>
        /// <param name="photoFile">物理地址</param>
        public static bool IsSecureUpfilePhoto(string photoFile)
        {
            bool isPhoto = false;
            string Img = "Yes";
            string fileExtension = System.IO.Path.GetExtension(photoFile).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }

            if (!isPhoto)
            {
                return true;
            }
            StreamReader sr = new StreamReader(photoFile, System.Text.Encoding.Default);
            string strContent = sr.ReadToEnd();
            sr.Close();
            string str = "request|<script|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=";
            foreach (string s in str.Split('|'))
            {
                if (strContent.ToLower().IndexOf(s) != -1)
                {
                    File.Delete(photoFile);
                    Img = "No";
                    break;
                }
            }
            return (Img == "Yes");
        }
        #endregion
    }

    /// <summary>
    /// 图片上传类
    /// </summary>
    //----------------调用-------------------
    //imageUpload iu = new imageUpload();
    //iu.AddText = "";
    //iu.CopyIamgePath = "";
    //iu.DrawString_x = ;
    //iu.DrawString_y = ;
    //iu.DrawStyle = ;
    //iu.Font = "";
    //iu.FontSize = ;
    //iu.FormFile = File1;
    //iu.IsCreateImg =;
    //iu.IsDraw = ;
    //iu.OutFileName = "";
    //iu.OutThumbFileName = "";
    //iu.SavePath = @"~/image/";
    //iu.SaveType = ;
    //iu.sHeight  = ;
    //iu.sWidth   = ;
    //iu.Upload();
    //--------------------------------------
    public class ImageUpload
    {
        #region 私有成员
        private int _Error = 0;//返回上传状态。 
        private int _MaxSize = 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 _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 bool _IsDraw = false;//设置是否加水印
        private int _DrawStyle = 0;//设置加水印的方式0:文字水印模式,1:图片水印模式,2:不加
        private int _DrawString_x = 10;//绘制文本的X坐标(左上角)
        private int _DrawString_y = 10;//绘制文本的Y坐标(左上角)
        private string _AddText = "GlobalNatureCrafts";//设置水印内容
        private string _Font = "宋体";//设置水印字体
        private int _FontSize = 12;//设置水印字大小
        private int _FileSize = 0;//获取已经上传文件的大小
        private string _CopyIamgePath = System.Web.HttpContext.Current.Server.MapPath(".") + "/images/5dm_new.jpg";//图片水印模式下的覆盖图片的实际地址
        #endregion

        #region 公有属性
        /// <summary>
        /// Error返回值
        /// 1、没有上传的文件
        /// 2、类型不允许
        /// 3、大小超限
        /// 4、未知错误
        /// 0、上传成功。 
        /// </summary>
        public int Error
        {
            get { return _Error; }
        }

        /// <summary>
        /// 最大单个上传文件
        /// </summary>
        public int MaxSize
        {
            set { _MaxSize = value; }
        }

        /// <summary>
        /// 所支持的上传类型用";"隔开 
        /// </summary>
        public string FileType
        {
            set { _FileType = value; }
        }

        /// <summary>
        /// 保存文件的实际路径 
        /// </summary>
        public string SavePath
        {
            set { _SavePath = System.Web.HttpContext.Current.Server.MapPath(value); }
            get { return _SavePath; }
        }

        /// <summary>
        /// 上传文件的类型,0代表自动生成文件名
        /// </summary>
        public int SaveType
        {
            set { _SaveType = value; }
        }

        /// <summary>
        /// 上传控件
        /// </summary>
        public HtmlInputFile FormFile
        {
            set { _FormFile = value; }
        }

        /// <summary>
        /// 非自动生成文件名设置。
        /// </summary>
        public string InFileName
        {
            set { _InFileName = value; }
        }

        /// <summary>
        /// 输出文件名
        /// </summary>
        public string OutFileName
        {
            get { return _OutFileName; }
            set { _OutFileName = value; }
        }

        /// <summary>
        /// 输出的缩略图文件名
        /// </summary>
        public string OutThumbFileName
        {
            get;
            set;
        }

        /// <summary>
        /// 是否有缩略图生成.
        /// </summary>
        public bool Iss
        {
            get { return _Iss; }
        }

        /// <summary>
        /// 获取上传图片的宽度
        /// </summary>
        public int Width
        {
            get { return _Width; }
        }

        /// <summary>
        /// 获取上传图片的高度
        /// </summary>
        public int Height
        {
            get { return _Height; }
        }

        /// <summary>
        /// 设置缩略图的宽度
        /// </summary>
        public int sWidth
        {
            get { return _sWidth; }
            set { _sWidth = value; }
        }

        /// <summary>
        /// 设置缩略图的高度
        /// </summary>
        public int sHeight
        {
            get { return _sHeight; }
            set { _sHeight = value; }
        }

        /// <summary>
        /// 是否生成缩略图
        /// </summary>
        public bool IsCreateImg
        {
            get { return _IsCreateImg; }
            set { _IsCreateImg = value; }
        }

        /// <summary>
        /// 是否加水印
        /// </summary>
        public bool IsDraw
        {
            get { return _IsDraw; }
            set { _IsDraw = value; }
        }

        /// <summary>
        /// 设置加水印的方式
        /// 0:文字水印模式
        /// 1:图片水印模式
        /// 2:不加
        /// </summary>
        public int DrawStyle
        {
            get { return _DrawStyle; }
            set { _DrawStyle = value; }
        }

        /// <summary>
        /// 绘制文本的X坐标(左上角)
        /// </summary>
        public int DrawString_x
        {
            get { return _DrawString_x; }
            set { _DrawString_x = value; }
        }

        /// <summary>
        /// 绘制文本的Y坐标(左上角)
        /// </summary>
        public int DrawString_y
        {
            get { return _DrawString_y; }
            set { _DrawString_y = value; }
        }

        /// <summary>
        /// 设置文字水印内容
        /// </summary>
        public string AddText
        {
            get { return _AddText; }
            set { _AddText = value; }
        }

        /// <summary>
        /// 设置文字水印字体
        /// </summary>
        public string Font
        {
            get { return _Font; }
            set { _Font = value; }
        }

        /// <summary>
        /// 设置文字水印字的大小
        /// </summary>
        public int FontSize
        {
            get { return _FontSize; }
            set { _FontSize = value; }
        }

        /// <summary>
        /// 文件大小
        /// </summary>
        public int FileSize
        {
            get { return _FileSize; }
            set { _FileSize = value; }
        }

        /// <summary>
        /// 图片水印模式下的覆盖图片的实际地址
        /// </summary>
        public string CopyIamgePath
        {
            set { _CopyIamgePath = System.Web.HttpContext.Current.Server.MapPath(value); }
        }

        #endregion

        #region 私有方法
        /// <summary>
        /// 获取文件的后缀名 
        /// </summary>
        private string GetExt(string path)
        {
            return Path.GetExtension(path);
        }

        /// <summary>
        /// 获取输出文件的文件名
        /// </summary>
        private string FileName(string Ext)
        {
            if (_SaveType == 0 || _InFileName.Trim() == "")
                return DateTime.Now.ToString("yyyyMMddHHmmssfff") + Ext;
            else
                return _InFileName;
        }

        /// <summary>
        /// 检查上传的文件的类型,是否允许上传。
        /// </summary>
        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()
        {
            HttpPostedFile hpFile = _FormFile.PostedFile;
            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 = "";
                if (_IsDraw)
                {
                    TempFile = FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString();
                }
                else
                {
                    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;
                if (_IsDraw)
                {
                    if (_DrawStyle == 0)
                    {
                        System.Drawing.Image Img1 = System.Drawing.Image.FromStream(newFile);
                        Graphics g = Graphics.FromImage(Img1);
                        g.DrawImage(Img1, 100, 100, Img1.Width, Img1.Height);
                        Font f = new Font(_Font, _FontSize);
                        Brush b = new SolidBrush(Color.Red);
                        string addtext = _AddText;
                        g.DrawString(addtext, f, b, _DrawString_x, _DrawString_y);
                        g.Dispose();
                        Img1.Save(ImageFilePath);
                        Img1.Dispose();
                    }
                    else
                    {
                        System.Drawing.Image image = System.Drawing.Image.FromStream(newFile);
                        System.Drawing.Image copyImage = System.Drawing.Image.FromFile(_CopyIamgePath);
                        Graphics g = Graphics.FromImage(image);
                        g.DrawImage(copyImage, new Rectangle(image.Width - copyImage.Width - 5, image.Height - copyImage.Height - 5, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
                        g.Dispose();
                        image.Save(ImageFilePath);
                        image.Dispose();
                    }
                }

                //获取图片的高度和宽度
                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;
                }

                if (_IsDraw)
                {
                    if (File.Exists(_SavePath + FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString()))
                    {
                        newFile.Dispose();
                        File.Delete(_SavePath + FName.Split('.').GetValue(0).ToString() + "_temp." + FName.Split('.').GetValue(1).ToString());
                    }
                }
                newFile.Close();
                newFile.Dispose();
                _OutFileName = FName;
                _FileSize = _FileSizeTemp;
                _Error = 0;
                return;
            }
            catch (Exception ex)
            {
                _Error = 4;
                return;
            }
        }
        #endregion
    }
}

14. gif 可变长度压缩算法类

using System.IO;

/// <summary>
/// Gif使用的可变长度的LZW压缩算法解码器
/// </summary>
public class LZWDecoder
{
    #region 变量
    /// <summary>
    /// GIF规定编码最大为12bit,最大值即为4096
    /// </summary>
    protected static readonly int MaxStackSize = 4096;
    protected Stream stream;
    #endregion

    #region 构造函数
    /// <summary>
    /// 构造函数
    /// </summary>
    public LZWDecoder(Stream stream)
    {
        this.stream = stream;
    }
    #endregion

    #region 私有方法
    /// <summary>
    /// 读取数据段
    /// </summary>
    byte[] ReadData()
    {
        int blockSize = Read();
        return ReadByte(blockSize);
    }

    /// <summary>
    /// 读取指定长度的字节字节
    /// </summary>
    byte[] ReadByte(int len)
    {
        byte[] buffer = new byte[len];
        stream.Read(buffer, 0, len);
        return buffer;
    }

    /// <summary>
    /// 读取一个字节
    /// </summary>
    int Read()
    {
        return stream.ReadByte();
    }
    #endregion

    #region 调用方法
    /// <summary>
    /// LZW压缩算法解码器
    /// </summary>
    /// <param name="width">长度</param>
    /// <param name="height">高度</param>
    /// <param name="stream">包含编码流的数据流</param>
    /// <returns>原始数据流</returns>
    public byte[] DecodeImageData(int width, int height, Stream stream)
    {
        int NullCode = -1;
        int pixelCount = width * height;//获取原图像的像素数,公式为 像素数 = 图像长度*图像高度
        byte[] pixels = new byte[pixelCount];
        int dataSize = Read();          //图像编码流的第一个字节(byte)存放的是数据位大小,在gif通常为1,4,8
        int codeSize = dataSize + 1;    //编码位大小,根据lzw算法的要求,编码位的大小 = 数据位大小+1 ,针对gif,有如下对应关系 1->3 4->5 ->9,而最大的codeSize为12
        int clearFlag = 1 << dataSize;  //在lzw算法有两个特殊标记,clearFlag为其中的清除标记,此后的编码将重头再来,这样做可以防止编码位无限增大
        int endFlag = clearFlag + 1;    //lzw算法两个特殊标记之一,endFlag为结束标记,表示一次编码的结束  endFlag=clearFlag+1
        int available = endFlag + 1;    //初始的可用编码大小,因为0-(clear-1)为元数据,所以均可用,不必研究,此处从能形成压缩的编码开始算起

        int code = NullCode;     //用于存储当前的编码值
        int old_code = NullCode; //用于存储上一次的编码值
        int code_mask = (1 << codeSize) - 1;//表示编码的最大值,如果codeSize=5,则code_mask=31
        int bits = 0;//在编码流中数据的保存形式为byte,而实际编码过程中是找实际编码位来存储的,比如当codeSize=5的时候,那么实际上5bit的数据就应该可以表示一个编码,这样取出来的1个字节就富余了3个bit,这3个bit用于和第二个字节的后两个bit进行组合,再次形成编码值,如此类推

        int[] prefix = new int[MaxStackSize];          //用于保存前缀的集合
        int[] suffix = new int[MaxStackSize];          //用于保存后缀
        int[] pixelStatck = new int[MaxStackSize + 1]; //用于临时保存数据流

        int top = 0;
        int count = 0; //在下面的循环中,每次会获取一定量的编码的字节数组,而处理这些数组的时候需要1个个字节来处理,count就是表示还要处理的字节数目
        int bi = 0;    //count表示还剩多少字节需要处理,而bi则表示本次已经处理的个数
        int i = 0;     //i代表当前处理得到像素数

        int data = 0;          //表示当前处理的数据的值
        int first = 0;         //一个字符串重的第一个字节
        int inCode = NullCode; //在lzw中,如果认识了一个编码所代表的数据entry,则将编码作为下一次的prefix,此处inCode代表传递给下一次作为前缀的编码值

        //先生成元数据的前缀集合和后缀集合,元数据的前缀均为0,而后缀与元数据相等,同时编码也与元数据相等
        for (code = 0; code < clearFlag; code++)
        {
            //前缀初始为0
            prefix[code] = 0;
            //后缀=元数据=编码
            suffix[code] = (byte)code;
        }

        byte[] buffer = null;
        while (i < pixelCount)
        {
            //最大像素数已经确定为pixelCount = width * width
            if (top == 0)
            {
                if (bits < codeSize)
                {
                    //如果当前的要处理的bit数小于编码位大小,则需要加载数据
                    if (count == 0)
                    {
                        //如果count为0,表示要从编码流中读一个数据段来进行分析
                        buffer = ReadData();
                        count = buffer.Length;
                        if (count == 0)
                        {
                            //再次想读取数据段,却没有读到数据,此时就表明已经处理完了
                            break;
                        }
                        //重新读取一个数据段后,应该将已经处理的个数置0
                        bi = 0;
                    }
                    //获取本次要处理的数据的值
                    data += buffer[bi] << bits;//此处为何要移位呢,比如第一次处理了1个字节为176,第一次只要处理5bit就够了,剩下3bit留给下个字节进行组合。也就是第二个字节的后两位+第一个字节的前三位组成第二次输出值
                    bits += 8; //本次又处理了一个字节,所以需要+8
                    bi++;      //将处理下一个字节
                    count--;   //已经处理过的字节数+1
                    continue;
                }

                //如果已经有足够的bit数可供处理,下面就是处理过程
                code = data & code_mask; //获取data数据的编码位大小bit的数据
                data >>= codeSize;       //将编码数据截取后,原来的数据就剩下几个bit了,此时将这些bit右移,为下次作准备
                bits -= codeSize;        //同时需要将当前数据的bit数减去编码位长,因为已经得到了处理。

                //下面根据获取的code值来进行处理
                if (code > available || code == endFlag)
                {
                    //当编码值大于最大编码值或者为结束标记的时候,停止处理
                    break;
                }
                if (code == clearFlag)
                {
                    //如果当前是清除标记,则重新初始化变量,好重新再来
                    codeSize = dataSize + 1;
                    //重新初始化最大编码值
                    code_mask = (1 << codeSize) - 1;
                    //初始化下一步应该处理得编码值
                    available = clearFlag + 2;
                    //将保存到old_code中的值清除,以便重头再来
                    old_code = NullCode;
                    continue;
                }

                //下面是code属于能压缩的编码范围内的的处理过程
                if (old_code == NullCode)
                {
                    //如果当前编码值为空,表示是第一次获取编码
                    pixelStatck[top++] = suffix[code];//获取到1个数据流的数据
                    //本次编码处理完成,将编码值保存到old_code中
                    old_code = code;
                    //第一个字符为当前编码
                    first = code;
                    continue;
                }
                inCode = code;
                if (code == available)
                {
                    //如果当前编码和本次应该生成的编码相同
                    pixelStatck[top++] = (byte)first;//那么下一个数据字节就等于当前处理字符串的第一个字节
                    code = old_code; //回溯到上一个编码
                }
                while (code > clearFlag)
                {
                    //如果当前编码大于清除标记,表示编码值是能压缩数据的
                    pixelStatck[top++] = suffix[code];
                    code = prefix[code];//回溯到上一个编码
                }
                first = suffix[code];
                if (available > MaxStackSize)
                {
                    //当编码最大值大于gif所允许的编码(4096)最大值的时候停止处理
                    break;
                }

                //获取下一个数据
                pixelStatck[top++] = suffix[code];
                //设置当前应该编码位置的前缀
                prefix[available] = old_code;
                //设置当前应该编码位置的后缀
                suffix[available] = first;
                //下次应该得到的编码值
                available++;
                if (available == code_mask + 1 && available < MaxStackSize)
                {
                    //增加编码位数
                    codeSize++;
                    //重设最大编码值
                    code_mask = (1 << codeSize) - 1;
                }
                //还原old_code
                old_code = inCode;
            }
            //回溯到上一个处理位置
            top--;
            //获取元数据
            pixels[i++] = (byte)pixelStatck[top];
        }
        return pixels;
    }
    #endregion
}

//LZW数据压缩算法的原理分析:http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html

猜你喜欢

转载自blog.csdn.net/u010919083/article/details/105401073