丢弃Image类的GetThumbnailImage方法

GetThumbnailImage的确是构造一个缩略图最简单的方法但同样存在一些不足:

1、如当源图尺寸过大时,生成的缩略图质量会很低,而且同源图的尺寸是一种正比的关系

2、当源图是一个Gif图片且含有透明色时,生成的缩略图会将透明色填充成黑色。

今天在工作中就遇到这样的问题,基于上面二个原因,于是决定放弃GetThumbnailImage方法了。

最终采用Graphics类的DrawImage方法至于质量问题,适当的设定一下,可以达到很好的效果。


/// </summary>
   /// <param name="SourceFile">文件在服务器上的物理地址</param>
   /// <param name="strSavePathFile">保存在服务器上的路径</param>
   /// <param name="ThumbWidth">宽度</param>
   /// <param name="ThumbHeight">高度</param>
   /// <param name="BgColor">背景</param>
   public static void myGetThumbnailImage(string SourceFile, string strSavePathFile, int ThumbWidth, int ThumbHeight, string BgColor)
   {
       System.Drawing.Image oImg = System.Drawing.Image.FromFile(SourceFile);
       //小图
       int intwidth, intheight;
       if (oImg.Width > oImg.Height)
       {
           if (oImg.Width > ThumbWidth)
           {
               intwidth = ThumbWidth;
               intheight = (oImg.Height * ThumbWidth) / oImg.Width;
           }
           else
           {
               intwidth = oImg.Width;
               intheight = oImg.Height;
           }
       }
       else
       {
           if (oImg.Height > ThumbHeight)
           {
               intwidth = (oImg.Width * ThumbHeight) / oImg.Height; intheight = ThumbHeight;
           }
           else
           {
               intwidth = oImg.Width; intheight = oImg.Height;
           }
       }
       //构造一个指定宽高的Bitmap
       Bitmap bitmay = new Bitmap(intwidth, intheight);
       Graphics g = Graphics.FromImage(bitmay);
       Color myColor;
       if (BgColor == null) myColor = Color.FromName("white");
       else
           myColor = Color.FromName(BgColor);
       //用指定的颜色填充Bitmap
       g.Clear(myColor);
       g.InterpolationMode = InterpolationMode.HighQualityBicubic;
       //开始画图
       g.DrawImage(oImg, new Rectangle(0, 0, intwidth, intheight), new Rectangle(0, 0, oImg.Width, oImg.Height), GraphicsUnit.Pixel);
       bitmay.Save(strSavePathFile, System.Drawing.Imaging.ImageFormat.Jpeg);
       g.Dispose();
       bitmay.Dispose();
       oImg.Dispose();
       //删除源图
       try
       {
           File.Delete(SourceFile);
       }
       catch { }
   }

2 Responses

  1. hubro November 17 2006 , 23:52
    g.InterpolationMode=InterpolationMode.High;
    g.CompositingQuality=CompositingQuality.HighQuality;
    g.SmoothingMode=SmoothingMode.HighQuality;
    还有两,全加上
    不过还是清晰度不高
    #1
  2. 幻想曲 November 18 2006 , 08:41
    幻想曲
    En
    不过在处理透明色的Gif时还是没有找到好的方法。
    #2

Write a comment:



(Will show your Gravatar icon)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

申请链接请看这里