(转)C#生成指定长宽不变形的缩略图

 

以下方法可根据给定长宽,生成最适合的不变形的缩略图,并保存成.jpg格式。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

         ///   <summary>
        
///   生成缩略图 静态方法   
        
///   </summary>
        
///   <param name="pathImageFrom">  源图的路径(含文件名及扩展名)  </param>
        
///   <param name="pathImageTo">  生成的缩略图所保存的路径(含文件名及扩展名)
        
///                             注意:扩展名一定要与生成的缩略图格式相对应   </param>
        
///   <param name="width">  欲生成的缩略图 "画布" 的宽度(像素值)  </param>
        
///   <param name="height">  欲生成的缩略图 "画布" 的高度(像素值)  </param>
         public   static   void  GenThumbnail( string  pathImageFrom,  string  pathImageTo,  int  width,  int  height)
        {
            Image imageFrom 
=   null ;

            
try
            {
                imageFrom 
=  Image.FromFile(pathImageFrom);
            }
            
catch
            {
                
// throw;
            }

            
if  (imageFrom  ==   null )
            {
                
return ;
            }

            
//  源图宽度及高度
             int  imageFromWidth  =  imageFrom.Width;
            
int  imageFromHeight  =  imageFrom.Height;

            
//  生成的缩略图实际宽度及高度
             int  bitmapWidth  =  width;
            
int  bitmapHeight  =  height;

            
//  生成的缩略图在上述"画布"上的位置
             int  X  =   0 ;
            
int  Y  =   0 ;

            
//  根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置
             if  (bitmapHeight  *  imageFromWidth  >  bitmapWidth  *  imageFromHeight)
            {
                bitmapHeight 
=  imageFromHeight  *  width  /  imageFromWidth;
                Y 
=  (height  -  bitmapHeight)  /   2 ;
            }
            
else
            {
                bitmapWidth 
=  imageFromWidth  *  height  /  imageFromHeight;
                X 
=  (width  -  bitmapWidth)  /   2 ;
            }

            
//   创建画布
            Bitmap bmp  =   new  Bitmap(width, height);
            Graphics g 
=  Graphics.FromImage(bmp);

            
//  清除整个绘图面并以透明背景色填充
            g.Clear(Color.Transparent);

            
//  指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
            g.InterpolationMode  =  InterpolationMode.HighQualityBicubic;

            
//  指定高质量、低速度呈现。
            g.SmoothingMode  =  SmoothingMode.HighQuality;

            
//  在指定位置并且按指定大小绘制指定的 Image 的指定部分。
            g.DrawImage(imageFrom,  new  Rectangle(X, Y, bitmapWidth, bitmapHeight),  new  Rectangle( 0 0 , imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);

            
try
            {
                
// 经测试 .jpg 格式缩略图大小与质量等最优
                bmp.Save(pathImageTo, ImageFormat.Jpeg);
            }
            
catch
            {
            }
            
finally
            {
                
// 显式释放资源
                imageFrom.Dispose();
                bmp.Dispose();
                g.Dispose();
            }
        }

 本文来自: http://www.6suv.com/20071117/17474/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值