找回密码

碧海潮声大学生网

查看: 936|回复: 2
打印 上一主题 下一主题

〖原创〗ASP.NET中高质量缩略图的生成

[复制链接]
跳转到指定楼层
1#
发表于 2005-11-18 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做一摄影作品管理程序,用到自动生成缩略图的方法。开始方法较简单,用GDI+中默认方法,但生成图片质量不佳,并且压缩质量为中等。
潜心研究了一下,找到以下方法,主要分二布,第一步为画布描绘时的质量设置,第二步为保存图片时JPEG压缩的设置。

代码如下:


      private Size NewSize(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 Size(Convert.ToInt32(w), Convert.ToInt32(h));
      }

      private void SendSmallImage(string fileName, int maxWidth, int maxHeight)
      {
        System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(fileName));
        System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat;

        Size newSize = NewSize(maxWidth, maxHeight, img.Width, img.Height);
        Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);
        Graphics g = Graphics.FromImage(outBmp);

        // 设置画布的描绘质量
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height),
           0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
        g.Dispose();

        if (thisFormat.Equals(ImageFormat.Gif))
        {
           Response.ContentType = "image/gif";
        }
        else
        {
           Response.ContentType = "image/jpeg";
        }

        // 以下代码为保存图片时,设置压缩质量
        EncoderParameters encoderParams = new EncoderParameters();
        long[] quality = new long[1];
        quality[0] = 100;

        EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
        encoderParams.Param[0] = encoderParam;

        //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象。
        ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
        ImageCodecInfo jpegICI = null;
        for (int x = 0; x < arrayICI.Length; x++)
        {
           if (arrayICI[x].FormatDescription.Equals("JPEG"))
           {
              jpegICI = arrayICI[x];//设置JPEG编码
              break;
           }
        }

        if (jpegICI != null)
        {
           outBmp.Save(Response.OutputStream, jpegICI, encoderParams);
        }
        else
        {
           outBmp.Save(Response.OutputStream, thisFormat);
        }
        
        img.Dispose();
        outBmp.Dispose();
      }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩
2#
 楼主| 发表于 2005-11-18 22:59 | 只看该作者
图像质量对比

没有优化的:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
 楼主| 发表于 2005-11-18 23:00 | 只看该作者
优化后的图片:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋| 碧海潮声大学生网  

Copyright © 2001-2013 Comsenz Inc.   All Rights Reserved.

Powered by Discuz! X3.2( 浙ICP备11026473号 )

快速回复 返回顶部 返回列表