网站中的缩略图是如何生成的?(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#处理图像),如需转载请自行联系原博主。

目录
相关文章
|
8月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
96 0
|
8月前
|
存储 传感器 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK修改图像像素格式Mono8或者Mono10(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK修改图像像素格式Mono8或者Mono10(C#)
201 0
|
8月前
|
存储 数据处理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)
74 0
|
8月前
|
监控 算法 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C#)
77 1
|
8月前
|
存储 监控 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C#)
73 0
|
8月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)
74 0
|
8月前
|
存储 传感器 监控
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
111 0
|
4月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
8月前
|
存储 数据处理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C#)
92 0
|
8月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
80 0