首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于上传图片生成缩略图的程序解决思路

2012-01-26 
关于上传图片生成缩略图的程序我在网上找到这么一个生成缩略图的程序,生成的缩略图很清晰,容量也很小,但就

关于上传图片生成缩略图的程序
我在网上找到这么一个生成缩略图的程序,生成的缩略图很清晰,容量也很小,但就是宽、高比例失调,代码如下:
///   <summary>
                ///   生成缩略图
                ///   </summary>
                ///   <param   name= "originalImagePath "> 源图路径(物理路径) </param>
                ///   <param   name= "thumbnailPath "> 缩略图路径(物理路径) </param>
                ///   <param   name= "width "> 缩略图宽度 </param>
                ///   <param   name= "height "> 缩略图高度 </param>
                ///   <param   name= "mode "> 生成缩略图的方式 </param>        
                public   static   void   MakeThumbnail(string   originalImagePath,   string   thumbnailPath,   int   width,   int   height,   string   mode)
                {
                        Image   originalImage   =   Image.FromFile(originalImagePath);
                       
                        int   towidth   =   width;
                        int   toheight   =   height;
               
                        int   x   =   0;
                        int   y   =   0;
                        int   ow   =   originalImage.Width;
                        int   oh   =   originalImage.Height;                

                        switch   (mode)
                        {                
                                case   "HW "://指定高宽缩放(可能变形)                                
                                        break;
                                case   "W "://指定宽,高按比例                                        
                                        toheight   =   originalImage.Height   *   width/originalImage.Width;


                                        break;
                                case   "H "://指定高,宽按比例
                                        towidth   =   originalImage.Width   *   height/originalImage.Height;                                        
                                        break;                
                                case   "Cut "://指定高宽裁减(不变形)                                
                                        if((double)originalImage.Width/(double)originalImage.Height   >   (double)towidth/(double)toheight)
                                        {
                                                oh   =   originalImage.Height;
                                                ow   =   originalImage.Height*towidth/toheight;
                                                y   =   0;
                                                x   =   (originalImage.Width   -   ow)/2;
                                        }
                                        else
                                        {
                                                ow   =   originalImage.Width;
                                                oh   =   originalImage.Width*height/towidth;
                                                x   =   0;
                                                y   =   (originalImage.Height   -   oh)/2;


                                        }
                                        break;                                        
                                default   :
                                        break;
                        }        
                       
                        //新建一个bmp图片
                        Image   bitmap   =   new   System.Drawing.Bitmap(towidth,toheight);

                        //新建一个画板
                        Graphics   g   =   System.Drawing.Graphics.FromImage(bitmap);

                        //设置高质量插值法
                        g.InterpolationMode   =   System.Drawing.Drawing2D.InterpolationMode.High;

                        //设置高质量,低速度呈现平滑程度
                        g.SmoothingMode   =   System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                        //清空画布并以透明背景色填充
                        g.Clear(Color.Transparent);                

                        //在指定位置并且按指定大小绘制原图片的指定部分
                        g.DrawImage(originalImage,   new   Rectangle(0,   0,   towidth,   toheight),  
                                new   Rectangle(x,   y,   ow,oh),
                                GraphicsUnit.Pixel);

                        try
                        {                        
                                //以jpg格式保存缩略图
                                bitmap.Save(thumbnailPath,   System.Drawing.Imaging.ImageFormat.Jpeg);
                        }
                        catch(System.Exception   e)


                        {
                                throw   e;
                        }
                        finally
                        {
                                originalImage.Dispose();
                                bitmap.Dispose();                                                
                                g.Dispose();
                        }
                }

当生成缩略图的方式mode选择 "cut "时,所生成的图片不完整,下面有的都截掉了
选H或者W时所生成缩略图的大小不改变似的,不知大家有没有碰到这样的问题

如果有更好的程序拿出来的的话,非常感谢!


[解决办法]
给你一个我自用的简洁点的

/// <summary>
/// by vengair
/// </summary>
/// <param name= "image "> </param>
/// <param name= "percentage "> </param>
/// <returns> </returns>
private static Image GenerateThumbnailImage(Image image, int percentage)
{
Bitmap myBitmap = new Bitmap((int)(image.Width * percentage / 100), (int)(image.Height * percentage / 100));
Graphics myGraphics = Graphics.FromImage(myBitmap);

// 绘制边框和背景
myGraphics.FillRectangle(Brushes.Gray, new Rectangle(0, 0, myBitmap.Width, myBitmap.Height));
myGraphics.FillRectangle(Brushes.White, new Rectangle(1, 1, myBitmap.Width - 2, myBitmap.Height - 2));

myGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
myGraphics.SmoothingMode = SmoothingMode.HighQuality;
myGraphics.DrawImage(image, new Rectangle(2, 2, myBitmap.Width - 4, myBitmap.Height - 4));
myGraphics.Dispose();

return (Image)myBitmap;
}
[解决办法]
wsImage3.5

热点排行