ASP.NET 生成缩略图(防失真)。

本文介绍如何使用ASP.NET上传图片并生成相应缩略图,包括原图上传和缩略图生成的关键步骤及代码实现。

BuildSourImage(),避免了使用传统的 SaveAs()方法保存文件。

BuildThumbImage()方法,是生成缩略图的,这个生成缩略图的步骤是,首先读取原图。根据原图的大小,按照比例缩放原图。像下面的代码: 


            //问题1  
            //这个判断就是判断,哪一个除数大(即高度大),那长度不变,高度乘以比例。反之,类推。  
            if (((decimal)width) / height <= ((decimal)intThumbWidth) / intThumbHeight)
            {
                smallWidth = intThumbWidth;
                smallHeight = intThumbWidth * height / width;
                //问题2 <br>  
                //其实可以写成下面这样子,不知道对不对?我的理解就是,拿缩略图的和原图的宽的比例,然后乘以高度。就是两者比例下的高度了。 
                //smallHeight = intThumbWidth / width * height;   
            }
            else {                    
                   smallWidth = intThumbHeight / height * width; 
                   smallHeight = intThumbHeight; 
            } 

全部代码如下
        
        protected void Button1_Click(object sender, EventArgs e)
        {
             UpLoadImage(File1, "~/UPLOAD/", "X.JPG", 20, 15);
        }

        /// <summary>   
        /// asp.net上传图片并生成缩略图   
        /// </summary>   
        /// <param name="upImage">HtmlInputFile控件</param>   
        /// <param name="sSavePath">保存的路径,些为相对服务器路径的下的文件夹</param>   
        /// <param name="sThumbExtension">缩略图的thumb</param>   
        /// <param name="intThumbWidth">生成缩略图的宽度</param>   
        /// <param name="intThumbHeight">生成缩略图的高度</param>   
        /// <returns>缩略图名称</returns>   
        public string UpLoadImage(HtmlInputFile upImage, string sSavePath, string sThumbExtension, int intThumbWidth, int intThumbHeight)
        {
            string sThumbFile = "";
            string sFilename = "";
            if (upImage.PostedFile != null)
            {
                sFilename = BuildSourImage(upImage, sSavePath);//上传原图  
                sThumbFile = BuildThumbImage(sSavePath + sFilename, sFilename, sSavePath + "small/", 300, 200); //上传缩略图  
                return sThumbFile;
            }
            return "没有选择图片";
        }

        /// <summary>  
        /// 上传大图  
        /// </summary>  
        /// <param name="upImage"></param>  
        /// <param name="sSavePath"></param>  
        /// <returns></returns>  
        public string BuildSourImage(HtmlInputFile upImage, string sSavePath)
        {
            string sFilename = "";
            HttpPostedFile myFile = upImage.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
                return "没有选择上传图片";
            //获取upImage选择文件的扩展名   
            string extendName = System.IO.Path.GetExtension(myFile.FileName).ToLower();
            //判断是否为图片格式   
            if (extendName != ".jpg" && extendName != ".jpge" && extendName != ".gif" && extendName != ".bmp" && extendName != ".png")
                return "图片格式不正确";

            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);
            sFilename = DateTime.Now.ToString("yyyyMMddHHmmssfff") + extendName;

            //检查当前文件夹下是否有同名图片,有则在文件名+1   

            System.IO.FileStream newFile
                = new System.IO.FileStream(System.Web.HttpContext.Current.Server.MapPath(sSavePath) + sFilename,
                System.IO.FileMode.Create, System.IO.FileAccess.Write);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();

            return sFilename;
        }

        /// <summary>  
        /// 生成缩略图  
        /// </summary>  
        /// <param name="sSourceFile">原图地址</param>  
        /// <param name="thumbName">缩略图名称</param>  
        /// <param name="sSavePath">保存地址</param>  
        /// <param name="intThumbWidth">缩略图宽度</param>  
        /// <param name="intThumbHeight">缩略图高度</param>  
        /// <returns></returns>  
        public string BuildThumbImage(string sSourceFile, string thumbName, string sSavePath, int intThumbWidth, int intThumbHeight)
        {

            try
            {
                //原图加载   
                using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath(sSourceFile)))
                {
                    //原图宽度和高度   
                    int width = sourceImage.Width;
                    int height = sourceImage.Height;

                    int smallWidth;
                    int smallHeight;
                    //获取第一张绘制图的大小,(比较 原图的宽/缩略图的宽 和 原图的高/缩略图的高)   
                    if (((decimal)width) / height <= ((decimal)intThumbWidth) / intThumbHeight)
                    {
                        smallWidth = intThumbWidth;
                        smallHeight = intThumbWidth * height / width;
                    }
                    else
                    {
                        smallWidth = intThumbHeight * width / height;
                        smallHeight = intThumbHeight;
                    }

                    //缩略图保存的绝对路径   
                    string smallImagePath = System.Web.HttpContext.Current.Server.MapPath(sSavePath) + thumbName;
                    //新建一个图板,以最小等比例压缩大小绘制原图   
                    using (System.Drawing.Image bitmap = new System.Drawing.Bitmap(smallWidth, smallHeight))
                    {
                        //绘制中间图  
                        using (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(Color.Black);
                            g.DrawImage(
                            sourceImage,
                            new System.Drawing.Rectangle(0, 0, smallWidth, smallHeight),
                            new System.Drawing.Rectangle(0, 0, width, height),
                            System.Drawing.GraphicsUnit.Pixel
                            );

                        }
                        //新建一个图板,以缩略图大小绘制中间图   
                        using (System.Drawing.Image bitmap1 = new System.Drawing.Bitmap(intThumbWidth, intThumbHeight))
                        {
                            //绘制缩略图   
                            using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap1))
                            {
                                //高清,平滑   
                                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                                g.Clear(Color.Black);
                                int lwidth = (smallWidth - intThumbWidth) / 2;
                                int bheight = (smallHeight - intThumbHeight) / 2;
                                g.DrawImage(bitmap,
                                    new Rectangle(0, 0, intThumbWidth, intThumbHeight),
                                    lwidth, bheight, intThumbWidth, intThumbHeight,
                                    GraphicsUnit.Pixel);
                                g.Dispose();
                                bitmap1.Save(smallImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
                            }
                        }
                    }
                }
            }
            catch
            {
                //出错则删除   
                System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(sSavePath + thumbName));
                return "图片格式不正确";
            }

            return thumbName;
        }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值