C# 截取缩略图

  前段时间在网上找到了一个网友提供的生成缩略图的类。最近因为工作需要需要进行修改。就自己写了些,放在这里做个备份。

 

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.UI.WebControls;

namespace Thumbnail
{
    public class CreateThumbnail
    {
        private int _TWidth = 100;
        private int _THeight = 100;
        private string _TPath = "UpdateImage";
        private int _limitwidth = 3072;
        private int _limitheight = 2304;
        private int _size = 3000000;
        private string _OPath = "UpdateImage";
        private bool _israte = true;

        /// <summary>
        /// 缩略图宽度。默认100px
        /// </summary>
        #region public int TWidth
        public int TWidth
        {
            get
            {
                return _TWidth;
            }
            set
            {
                _TWidth = value;
            }
        }
        #endregion

        /// <summary>
        /// 缩略图高度。默认100px
        /// </summary>
        #region public int THeight
        public int THeight
        {
            get
            {
                return _THeight;
            }
            set
            {
                _THeight = value;
            }
        }
        #endregion

        /// <summary>
        /// 缩略图存储文件夹。默认根目录UpdateImage文件夹。
        /// </summary>
        #region public string TPath
        public string TPath
        {
            get
            {
                return _TPath;
            }
            set
            {
                _TPath = value;
            }
        }
        #endregion

        /// <summary>
        /// 原图限定宽度。默认3072px
        /// </summary>
        #region public int LimitWidth
        public int LimitWidth
        {
            get
            {
                return _limitwidth;
            }
            set
            {
                _limitwidth = value;
            }
        }
        #endregion

        /// <summary>
        /// 原图限定高度。默认2304px
        /// </summary>
        #region public int LimitHeight
        public int LimitHeight
        {
            get
            {
                return _limitheight;
            }
            set
            {
                _limitheight = value;
            }
        }
        #endregion

        /// <summary>
        /// 原图限定大小。
        /// </summary>
        #region public int Size
        public int Size
        {
            get
            {
                return _size;
            }
            set
            {
                _size = value;
            }
        }
        #endregion

        /// <summary>
        /// 原图存储文件夹。默认根目录UpdateImage文件夹。
        /// </summary>
        #region public string OPath
        public string OPath
        {
            get
            {
                return _OPath;
            }
            set
            {
                _OPath = value;
            }
        }
        #endregion

        /// <summary>
        /// 是否成比例
        /// </summary>
        #region public bool IsRate
        public bool IsRate
        {
            get
            {
                return _israte;
            }
            set
            {
                _israte = value;
            }
        }
        #endregion

        /// <summary>
        /// 上传原图,产生缩略图。(默认:等比压缩,"限定上传尺寸2048*1536,缩略图尺寸100*100,限定上传大小1MB,存放在根目录UpdateImage中")
        /// </summary>
        /// <param name="fu">图片上传控件。</param>
        /// <returns>返回原图完整路径"OFullName",原图存储名"OFileName",缩略图完整路径"",缩略图存储名"",操作信息"",操作信息会提示对应错误信息。</returns>
        #region public Dictionary<string, string> GetThumbnail(FileUpload fu)
        public Dictionary<string, string> GetThumbnail(FileUpload fu)
        {
            Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "OFullName", "" }, { "OFileName", "" }, { "TFullName", "" }, { "TFileName", "" }, { "Msg", "" } };
            if (fu.HasFile)//检查是否已经选择文件
            {
                string filename = fu.FileName.ToLower();
                int i = filename.LastIndexOf(".");
                filename = filename.Substring(i, filename.Length - i);

                //检查上传文件的格式是否有效
                if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
                {
                    dicReturn["Msg"] = "不受支持的类型,请重新选择!";
                    return dicReturn;
                }

                //检查图片文件的大小
                if (fu.PostedFile.ContentLength == 0 || fu.PostedFile.ContentLength >= Size)
                {
                    dicReturn["Msg"] = "指定的文件大小不符合要求!";
                    return dicReturn;
                }

                //生成原图
                Stream oStream = fu.PostedFile.InputStream;
                System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);

                int owidth = oImage.Width; //原图宽度
                int oheight = oImage.Height; //原图高度

                //检查是否超出规定尺寸
                if (owidth > LimitWidth || oheight > LimitHeight)
                {
                    dicReturn["Msg"] = "超过允许的图片尺寸范围!";
                    return dicReturn;
                }

                if (IsRate)
                {
                    //按比例计算出缩略图的宽度和高度
                    if (owidth >= oheight)
                    {
                        THeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(TWidth) / Convert.ToDouble(owidth)));//等比设定高度
                    }
                    else
                    {
                        TWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(THeight) / Convert.ToDouble(oheight)));//等比设定宽度
                    }
                }

                //生成缩略原图
                Bitmap tImage = new Bitmap(TWidth, THeight);
                Graphics g = Graphics.FromImage(tImage);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
                g.Clear(Color.Transparent); //清空画布并以透明背景色填充
                g.DrawImage(oImage, new Rectangle(0, 0, TWidth, THeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);

                Random oRandom = new Random();
                string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字

                //格式化日期作为文件名
                DateTime oDateTime = new DateTime();
                oDateTime = DateTime.Now;
                string oStringTime = oDateTime.ToString();
                oStringTime = oStringTime.Replace("-", "");
                oStringTime = oStringTime.Replace(" ", "");
                oStringTime = oStringTime.Replace(":", "");

                dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;
                dicReturn["TFileName"] = "t" + oStringTime + oStringRandom + filename;

                string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
                string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";

                if (!Directory.Exists(OSavePath))
                {
                    Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
                }
                if (!Directory.Exists(TSavePath))
                {
                    Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
                }

                dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];
                dicReturn["TFullName"] = TSavePath + dicReturn["TFileName"];
                //开始保存图片至服务器
                try
                {
                    switch (filename)
                    {
                        case ".jpeg":
                        case ".jpg":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
                            }
                            break;
                        case ".gif":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Gif);
                            }
                            break;
                        case ".png":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Png);
                            }
                            break;
                        case ".bmp":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
                            }
                            break;
                    }

                    dicReturn["Msg"] = "图片上传成功!";
                    //保存路径+完整文件名
                    string _OSavePath = "/" + OPath + "/";
                    string _TSavePath = "/" + TPath + "/";
                    dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];
                    dicReturn["TFullName"] = _TSavePath + dicReturn["TFileName"];
                }
                catch (Exception ex)
                {
                    dicReturn["Msg"] = ex.Message;
                    return dicReturn;
                }
                finally
                {
                    //释放资源
                    oImage.Dispose();
                    g.Dispose();
                    tImage.Dispose();
                }
            }
            else
            {
                dicReturn["Msg"] = "请先选择需要上传的图片!";
                return dicReturn;
            }

            return dicReturn;
        }
        #endregion

        /// <summary>
        /// 上传原图,产生缩略图。
        /// </summary>
        /// <param name="fu">图片上传控件。</param>
        /// <param name="TWidth">缩略图宽度,单位px。</param>
        /// <param name="THeight">缩略图高度,单位px。</param>
        /// <param name="TPath">缩略图存储目录。</param>
        /// <param name="OPath">原图存储目录。</param>
        /// <param name="IsRate">是否等比。</param>
        /// <returns>返回原图完整路径"OFullName",原图存储名"OFileName",缩略图完整路径"",缩略图存储名"",操作信息"",操作信息会提示对应错误信息。</returns>
        #region public static Dictionary<string, string> GetThumbnail(FileUpload fu, int TWith, int iHeight, string TPath, string OPath, bool IsRate)
        public static Dictionary<string, string> GetThumbnail(FileUpload fu, int TWidth, int THeight, string TPath, string OPath, bool IsRate)
        {
            Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "OFullName", "" }, { "OFileName", "" }, { "TFullName", "" }, { "TFileName", "" }, { "Msg", "" } };
            if (fu.HasFile)//检查是否已经选择文件
            {
                string filename = fu.FileName.ToLower();
                int i = filename.LastIndexOf(".");
                filename = filename.Substring(i, filename.Length - i);

                //检查上传文件的格式是否有效
                if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
                {
                    dicReturn["Msg"] = "不受支持的类型,请重新选择!";
                    return dicReturn;
                }

                //生成原图
                Stream oStream = fu.PostedFile.InputStream;
                System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);

                int owidth = oImage.Width; //原图宽度
                int oheight = oImage.Height; //原图高度

                if (IsRate)
                {
                    //按比例计算出缩略图的宽度和高度
                    if (owidth >= oheight)
                    {
                        THeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(TWidth) / Convert.ToDouble(owidth)));//等比设定高度
                    }
                    else
                    {
                        TWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(THeight) / Convert.ToDouble(oheight)));//等比设定宽度
                    }
                }

                //生成缩略原图
                Bitmap tImage = new Bitmap(TWidth, THeight);
                Graphics g = Graphics.FromImage(tImage);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
                g.Clear(Color.Transparent); //清空画布并以透明背景色填充
                g.DrawImage(oImage, new Rectangle(0, 0, TWidth, THeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);

                Random oRandom = new Random();
                string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字

                //格式化日期作为文件名
                DateTime oDateTime = new DateTime();
                oDateTime = DateTime.Now;
                string oStringTime = oDateTime.ToString();
                oStringTime = oStringTime.Replace("-", "");
                oStringTime = oStringTime.Replace(" ", "");
                oStringTime = oStringTime.Replace(":", "");

                dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;
                dicReturn["TFileName"] = "t" + oStringTime + oStringRandom + filename;

                string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
                string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";

                if (!Directory.Exists(OSavePath))
                {
                    Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
                }
                if (!Directory.Exists(TSavePath))
                {
                    Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
                }

                dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];
                dicReturn["TFullName"] = TSavePath + dicReturn["TFileName"];
                //开始保存图片至服务器
                try
                {
                    switch (filename)
                    {
                        case ".jpeg":
                        case ".jpg":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
                            }
                            break;

                        case ".gif":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Gif);
                            }
                            break;

                        case ".png":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Png);
                            }
                            break;

                        case ".bmp":
                            {
                                oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
                                tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
                            }
                            break;
                    }

                    dicReturn["Msg"] = "图片上传成功!";
                    //保存路径+完整文件名
                    string _OSavePath = "/" + OPath + "/";
                    string _TSavePath = "/" + TPath + "/";
                    dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];
                    dicReturn["TFullName"] = _TSavePath + dicReturn["TFileName"];
                }
                catch (Exception ex)
                {
                    dicReturn["Msg"] = ex.Message;
                    return dicReturn;
                }
                finally
                {
                    //释放资源
                    oImage.Dispose();
                    g.Dispose();
                    tImage.Dispose();
                }
            }
            else
            {
                dicReturn["Msg"] = "请先选择需要上传的图片!";
                return dicReturn;
            }

            return dicReturn;
        }
        #endregion

        /// <summary>
        /// 上传原图,产生多个缩略图。
        /// </summary>
        /// <param name="fu">图片上传控件。</param>
        /// <param name="OPath">缩略图存储目录。</param>
        /// <param name="TPath">原图存储目录。</param>
        /// <param name="dicThum">缩略图尺寸,宽*高</param>
        /// <param name="IsRate">是否等比。</param>
        /// <returns></returns>
        #region public static Dictionary<string, string> GetThumbnails(FileUpload fu, string OPath, string TPath, Dictionary<int, int> dicThum, bool IsRate)
        public static Dictionary<string, string> GetThumbnails(FileUpload fu, string OPath, string TPath, Dictionary<int, int> dicThum, bool IsRate)
        {
            Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "Msg", "" } };
            if (fu.HasFile)//检查是否已经选择文件
            {
                string filename = fu.FileName.ToLower();
                int i = filename.LastIndexOf(".");
                filename = filename.Substring(i, filename.Length - i);

                //检查上传文件的格式是否有效
                if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
                {
                    dicReturn["Msg"] = "不受支持的类型,请重新选择!";
                    return dicReturn;
                }

                //生成原图
                Stream oStream = fu.PostedFile.InputStream;
                System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);

                int owidth = oImage.Width; //原图宽度
                int oheight = oImage.Height; //原图高度

                Random oRandom = new Random();
                string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字
                //格式化日期作为文件名
                DateTime oDateTime = new DateTime();
                oDateTime = DateTime.Now;
                string oStringTime = oDateTime.ToString();
                oStringTime = oStringTime.Replace("-", "");
                oStringTime = oStringTime.Replace(" ", "");
                oStringTime = oStringTime.Replace(":", "");

                dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;

                string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
                string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";

                if (!Directory.Exists(OSavePath))
                {
                    Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
                }
                if (!Directory.Exists(TSavePath))
                {
                    Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
                }

                dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];

                //开始保存图片至服务器
                try
                {
                    switch (filename)
                    {
                        case ".jpeg":
                        case ".jpg":
                            oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
                            break;
                        case ".gif":
                            oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
                            break;
                        case ".png":
                            oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
                            break;
                        case ".bmp":
                            oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
                            break;
                    }

                    dicReturn["Msg"] = "图片上传成功!";
                    //保存路径+完整文件名
                    string _OSavePath = "/" + OPath + "/";
                    dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];


                    int iIndex = 1;

                    foreach (KeyValuePair<int, int> kvp in dicThum)
                    {
                        dicReturn["TFileName_" + iIndex.ToString()] = "t" + iIndex.ToString() + "_" + oStringTime + oStringRandom + filename;
                        dicReturn["TFullName_" + iIndex.ToString()] = TSavePath + dicReturn["TFileName_" + iIndex.ToString()];

                        int tHeight = kvp.Value;
                        int tWidth = kvp.Key;

                        if (IsRate)
                        {
                            //按比例计算出缩略图的宽度和高度
                            if (owidth >= oheight)
                            {
                                tHeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(tWidth) / Convert.ToDouble(owidth)));//等比设定高度
                            }
                            else
                            {
                                tWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(tHeight) / Convert.ToDouble(oheight)));//等比设定宽度
                            }
                        }

                        //生成缩略原图
                        Bitmap tImage = new Bitmap(tWidth, tHeight);
                        Graphics g = Graphics.FromImage(tImage);
                        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
                        g.Clear(Color.Transparent); //清空画布并以透明背景色填充
                        g.DrawImage(oImage, new Rectangle(0, 0, tWidth, tHeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);

                        //开始保存图片至服务器
                        try
                        {
                            switch (filename)
                            {
                                case ".jpeg":
                                case ".jpg":
                                    tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Jpeg);
                                    break;
                                case ".gif":
                                    tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Gif);
                                    break;
                                case ".png":
                                    tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Png);
                                    break;
                                case ".bmp":
                                    tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Bmp);
                                    break;
                            }

                            //保存路径+完整文件名
                            string _TSavePath = "/" + TPath + "/";
                            dicReturn["TFullName_" + iIndex.ToString()] = _TSavePath + dicReturn["TFileName_" + iIndex.ToString()];
                        }
                        catch (Exception ex)
                        {
                            dicReturn["Msg"] = ex.Message;
                            break;
                        }
                        finally
                        {
                            //释放资源
                            g.Dispose();
                            tImage.Dispose();
                        }

                        iIndex++;
                    }
                }
                catch (Exception ex)
                {
                    dicReturn["Msg"] = ex.Message;
                    return dicReturn;
                }
                finally
                {
                    //释放资源
                    oImage.Dispose();
                }
            }
            else
            {
                dicReturn["Msg"] = "请先选择需要上传的图片!";
                return dicReturn;
            }

            return dicReturn;
        }
        #endregion
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值