网站中的缩略图是如何生成的?(C#处理图像)

简介:

 网站中的缩略图是如何生成的?(C#处理图像)

controller层代码:

/// <summary> 
        /// 生成缩略图 
        /// </summary> 
        /// <returns></returns> 
        public ActionResult ThumImg() 
        {

            Response.Clear(); 
            //string originalFileName = Server.MapPath(Request.QueryString["fn"]); //服务器上的目录名 
            string originalFileName = Request.QueryString["fn"];//本地目录名 
            int thumbnailWidth = Convert.ToInt16(Request.QueryString["tw"]); 
            int thumbnailHeight = Convert.ToInt16(Request.QueryString["th"]); 
            string bgColorString = Convert.ToString(Request.QueryString["bg"]); 
            new ThumImage(originalFileName, thumbnailWidth, thumbnailHeight, bgColorString).ThumImg(); 
            return View(); 
        }


    }

VIEW层代码:

   <%int j=0; 
        foreach (var i in ViewData["ImgList"] as List<string>) 
      { 
          j++; 
          if (j > 20) break; 
             %> 
    <img src='/product/ThumImg?fn=<%=i %>&tw=50&th=50&bg=000000' border="0"> 
    <%} %>

Coder层代码:

 public class ThumImage 
    { 
        string originalFileName; 
        int thumbnailWidth; 
        int thumbnailHeight; 
        string bgColorString; 
        public ThumImage(string _originalFileName, int _thumbnailWidth, int _thumbnailHeight, string _bgColorString) 
        { 
            this.originalFileName = _originalFileName; 
            this.thumbnailWidth = _thumbnailWidth; 
            this.thumbnailHeight = _thumbnailHeight; 
            this.bgColorString = _bgColorString; 
        } 
        /// <summary> 
        /// 生成缩略图 
        /// </summary> 
        /// <returns></returns> 
        public void ThumImg() 
        {

            HttpContext.Current.Response.Clear(); 
            #region 建立图像主体对象 
            ColorConverter cv = new ColorConverter(); 
            Color bgColor = (Color)cv.ConvertFromString("#" + bgColorString);//通过string,生成一个color对象,ColorConverter是颜色转换方法 
            System.Drawing.Image img = System.Drawing.Image.FromFile(originalFileName);//通过url得到image对象 
            System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat;//指定文件的文件格式,它是ImageFormat类型,不可承继 
            System.Drawing.Size newSize = this.GetNewSize(thumbnailWidth, thumbnailHeight, img.Width, img.Height);//图像尺寸,GetNewSize实现等比例缩放 
            System.Drawing.Bitmap outBmp = new Bitmap(thumbnailWidth, thumbnailHeight);//建立一个封闭GDI+ 位图对象 
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(outBmp);//建立一个GDI+ 位图画面,从指定的Image对象中 
            #endregion

            #region 设置画布的描绘质量 
            g.CompositingQuality = CompositingQuality.Default; 
            g.SmoothingMode = SmoothingMode.Default; 
            g.InterpolationMode = InterpolationMode.Default; 
            g.Clear(bgColor); 
            Rectangle r = new Rectangle((thumbnailWidth - newSize.Width) / 2, 
                                           (thumbnailHeight - newSize.Height) / 2, 
                                           newSize.Width, newSize.Height); 
            g.DrawImage(img, r, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel); 
            g.Dispose(); 
            #endregion

            #region 设置服务器响应文件头类型 
            if (thisFormat.Equals(System.Drawing.Imaging.ImageFormat.Gif)) 
            { 
                HttpContext.Current.Response.ContentType = "image/gif";//网页内容类型为图像的MIME 
            } 
            else 
            { 
                HttpContext.Current.Response.ContentType = "image/jpeg"; 
            } 
            #endregion

 

            //设置压缩质量 
            System.Drawing.Imaging.EncoderParameters encoderParams = new EncoderParameters(); 
            System.Drawing.Imaging.EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, new long[] { 100 }); 
            encoderParams.Param[0] = encoderParam;

            //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。 
            System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); 
            System.Drawing.Imaging.ImageCodecInfo jpegICI = null;

            for (int fwd = 0; fwd < arrayICI.Length; fwd++) 
            { 
                if (arrayICI[fwd].FormatDescription.Equals("JPEG")) 
                { 
                    jpegICI = arrayICI[fwd]; 
                    break; 
                } 
            }

            if (jpegICI == null) 
            { 
                outBmp.Save(HttpContext.Current.Response.OutputStream, jpegICI, encoderParams); 
            } 
            else 
            { 
                outBmp.Save(HttpContext.Current.Response.OutputStream, thisFormat); //保存的页面的输出流中 
            } 
        }

        /// <summary> 
        /// 图像根据相应尺寸实现等比例缩放 
        /// </summary> 
        /// <param name="maxWidth"></param> 
        /// <param name="maxHeight"></param> 
        /// <param name="width"></param> 
        /// <param name="height"></param> 
        /// <returns></returns> 
        System.Drawing.Size GetNewSize(int maxWidth, int maxHeight, int width, int height) 
        { 
            Double w = 0.0; 
            Double h = 0.0; 
            Double sw = Convert.ToDouble(width); 
            Double sh = Convert.ToDouble(height); 
            Double mw = Convert.ToDouble(maxWidth); 
            Double mh = Convert.ToDouble(maxHeight);

            if (sw < mw && sh < mh) 
            { 
                w = sw; 
                h = sh; 
            } 
            else if ((sw / sh) > (mw / mh)) 
            { 
                w = maxWidth; 
                h = (w * sh) / sw; 
            } 
            else 
            { 
                h = maxHeight; 
                w = (h * sw) / sh; 
            } 
            return new System.Drawing.Size(Convert.ToInt32(w), Convert.ToInt32(h)); 
        }

    }

本文转自博客园张占岭(仓储大叔)的博客,原文链接:网站中的缩略图是如何生成的?(C#处理图像),如需转载请自行联系原博主。

目录
相关文章
|
异构计算 Python
|
移动开发 前端开发 JavaScript
【移动端】实现相册的上传和缩放裁剪
做项目时,在移动端,需要实现用户相册图片的上传,并对图片进行缩放裁剪的功能。下面说一下实现流程。
160 1
【移动端】实现相册的上传和缩放裁剪
【图片操作】给图片添加滤镜
现在我们都喜欢给图片添加滤镜,现在很多相机也自带了许多滤镜。我们可以在拍照的时候选择需要的滤镜。但是有时候我们需要给大量图片添加同样的滤镜,这个时候手动添加就非常麻烦了。为了方便,我们可以使用程序来帮我们完成添加滤镜的操作。
192 0
|
存储 编解码 关系型数据库
图像隐写,如何在图像中隐藏二维码
在某个App中有一个加密水印的功能,当帖子的主人开启了之后。如果有人截图,那么这张截图中就是添加截图用户、帖子ID、截图时间等信息,而且我们无法用肉眼看出这些水印。 这可以通过今天要介绍的隐写技术来实现,我们会通过这种技术,借助Python语言和OpenCV模块来实现在图像中隐藏二维码的操作。而且这个二维码无法通过肉眼看出。
487 0
|
前端开发 算法
制作了一个马赛克图片转换器 - 实现篇
上文有讲到我制作了一个马赛克图片转换器,可以将图片转换成马赛克风格,并可转换为 css box-shadow 进行输出。
|
前端开发
制作了一个马赛克图片转换器
制作了一个马赛克图片转换器,可以将图片转换成马赛克风格,并可转换为 css box-shadow 进行输出。
|
Java API Maven
一行代码搞定图片缩略图处理
不知道大家现在工作中还有没有使用过Java处理图片的。强哥在大学毕业后,从事服务端WEB开发,就很少接触图片处理。有接触图片的,大多也就是图片的上传下载。所以,对Java处理图片相关的技术也都没怎么接触。
一行代码搞定图片缩略图处理
|
数据安全/隐私保护
Photoshop软件之图片去水印
生活就好像是一望无际的大海,人便就是那大海上的一叶小舟。守住一颗宁静的心,那么你就可以不断的挑战自己,超越自己。其实在Photoshop软件中给图片去除水印也是这么个理,去除水印的方法很多,也许是这样的,也许是那样的。刚接触去水印的时候会一直沿用同一个办法,但是当你用的熟练之后,你就会发现:原来还有另外简单的办法。
416 0
Photoshop软件之图片去水印
|
Windows
利用Adorner制作用于图像裁切的选择框
原文:利用Adorner制作用于图像裁切的选择框 前天,我写了一篇“使用Adorner显示WPF控件的边界点”的文章。这次,使用从Adorner继承来写一个用于图像裁切的选择框。
747 0