.net 生成原图和多张缩略图

        /// <summary>
        /// 按日期生成文件夹名
        /// </summary>
        /// <returns>返回文件夹名</returns>
        private static String DateDir()
        {
            return DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString().PadLeft(2, '0') +
                DateTime.Now.Day.ToString().PadLeft(2, '0');
        }

        /// <summary>
        /// 按GUID生成图片名
        /// </summary>
        /// <returns>返回文件名</returns>
        private static String AutoFileName()
        {
            return KeyUtils.GetNewId().Replace("-", "");
        }

        /// <summary>
        /// 相对文件夹路径
        /// </summary>
        private static String sReturnPath = ConfigurationManager.AppSettings["PicPath"].ToString() + "/" + DateDir();

        /// <summary>
        /// 保存原图
        /// </summary>
        /// <param name="bAfs">图片Byte字节数</param>
        /// <param name="sExtend">图片后缀名</param>
        /// <param name="sPath">原图绝对路径</param>
        /// <returns>返回原图绝对路径</returns>
        public static String SaveOriginalImage(Byte[] bAfs, String sExtend, String sPath)
        {
            sPath = sPath + DateDir();

            try
            {
                if (!Directory.Exists(sPath))
                    Directory.CreateDirectory(sPath);
                //定义并实例化一个内存流,以存放提交上来的字节数组。
                MemoryStream m = new MemoryStream(bAfs);
                //原图绝对路径
                string sPathPicName = sPath + "\" + AutoFileName() + sExtend;
                //原始图片写入到文件夹中
                FileStream f = new FileStream(sPathPicName, FileMode.Create);
                ///把内内存里的数据写入物理文件
                m.WriteTo(f);
                m.Close();
                f.Close();
                f = null;
                m = null;

                return sPathPicName;
            }
            catch (Exception)
            {
                return "";
            }
        }

        /// <summary>
        /// 生成缩略图
     /// 宽高为0则返回处理后的原图,宽高不为0则返回相应的缩略图
/// </summary> /// <param name="_Model">图片处理模型</param> /// <param name="sPathPic">输出缩略图相对路径</param> /// <returns>返回缩略图相对路径</returns> public static String ReturnThumbnailsImage(ImageModel _Model) { if (String.IsNullOrEmpty(_Model.OriginalImageUrl)) { return ""; } if (!File.Exists(_Model.OriginalImageUrl)) { return ""; } try { String sFileName = AutoFileName(); String sLastPath = _Model.Path + DateDir() + "\" + sFileName + _Model.Extend; //从文件取得图片对象 System.Drawing.Image image = System.Drawing.Image.FromFile(_Model.OriginalImageUrl); _Model.Width = _Model.Width == 0 ? image.Width : _Model.Width; _Model.Height = _Model.Height == 0 ? image.Height : _Model.Height; //取得图片大小 Size size = new Size(_Model.Width, _Model.Height); //新建一个bmp图片 Image bitmap = new Bitmap(size.Width, size.Height); //新建一个画板 Graphics g = Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = SmoothingMode.HighQuality; //清空一下画布 g.Clear(Color.Transparent); //在指定位置画图 g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), GetImageBeginXAndY(_Model.Width,_Model.Height,image.Width,image.Height), GraphicsUnit.Pixel); //保存高清晰度的缩略图 bitmap.Save(sLastPath, System.Drawing.Imaging.ImageFormat.Jpeg); g.Dispose(); return sReturnPath + "/" + sFileName + _Model.Extend; } catch (Exception) { return ""; } } /// <summary> /// 功能:根据位置计算出绘图的开始点 /// </summary> /// <param name="Towidth">需要生成图片的宽度</param> /// <param name="ToHeight">需要生成图片的高度</param> /// <param name="Owidth">原图宽度</param> /// <param name="OHeight">原图高度</param> /// <param name="x">绘图的开始x 点坐标</param> /// <param name="y">绘图的开始 y 点坐标</param> private static Rectangle GetImageBeginXAndY(int Towidth, int ToHeight, int Owidth, int OHeight) { int towidth = Towidth; int toheight = ToHeight; int x = 0; int y = 0; int ow = Owidth; int oh = OHeight; if ((double)Owidth / (double)OHeight > (double)Towidth / (double)ToHeight) { oh = OHeight; ow = OHeight * towidth / toheight; y = 0; x = (Owidth - ow) / 2; } else { ow = Owidth; oh = Owidth * ToHeight / towidth; x = 0; y = (OHeight - oh) / 2; } return new Rectangle(x, y, ow, oh); } /// <summary> /// 生成多张缩略图 /// </summary> /// <param name="sPath">原图绝对路径</param> /// <param name="sOriginalImageUrl">原图绝对路径</param> /// <param name="sExtend">图片后缀名</param> /// <param name="lst_PicPath">图片宽高规则列表</param> /// <returns>返回多个缩略图列表</returns> public static List<PicThumbnailRuleModel> GetMultiThumbnails(String sPath, String sOriginalImageUrl, String sExtend, List<PicThumbnailRuleModel> lst_PicPath) { List<PicThumbnailRuleModel> lst_Model = new List<PicThumbnailRuleModel>(); ImageModel _ImageModel = new ImageModel(); //绝对文件夹路径 _ImageModel.Path = sPath; _ImageModel.OriginalImageUrl = sOriginalImageUrl; _ImageModel.Extend = sExtend; for (int i = 0; i < lst_PicPath.Count; i++) { _ImageModel.Width = lst_PicPath[i].Width; _ImageModel.Height = lst_PicPath[i].Height; PicThumbnailRuleModel Model = new PicThumbnailRuleModel(); Model.Width = _ImageModel.Width; Model.Height = _ImageModel.Height; Model.PicThumbnailsInfo = UploadImageComm.ReturnThumbnailsImage(_ImageModel); lst_Model.Add(Model); } return lst_Model; }

     
    /// <summary>
    /// 图片缩略图规则模型
    /// </summary>
    public class PicThumbnailRuleModel
    {
        /// <summary>
        /// 设置生成图片宽度
        /// </summary>
        public Int32 Width { get; set; }

        /// <summary>
        /// 设置生成图片高度
        /// </summary>
        public Int32 Height { get; set; }

        /// <summary>
        /// 生成之后的图片名称
        /// </summary>
        public String PicThumbnailsInfo { get; set; }
    }






原文地址:https://www.cnblogs.com/YanKeJun/p/3848632.html