生成缩略图

1. 关键函数

/// <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,ImageTransformMode 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;

    #region Auto模式计算
    if (mode == ImageTransformMode.AutoBig || mode == ImageTransformMode.AutoSmall)
    {
        if ((double)originalImage.Width > (double)originalImage.Height)
        {
            if (mode == ImageTransformMode.AutoBig)
            {
                mode = ImageTransformMode.FixedHeight;
            }
            else
            {
                mode = ImageTransformMode.FixedWidth;
            }
        }
        else
        {
            if (mode == ImageTransformMode.AutoBig)
            {
                mode = ImageTransformMode.FixedWidth;
            }
            else
            {
                mode = ImageTransformMode.FixedHeight;
            }
        }
    }
    #endregion

    switch (mode)
    {
        case ImageTransformMode.FixedBoth://指定高宽缩放(可能变形)                
            break;
        case ImageTransformMode.FixedWidth://指定宽,高按比例                    
            toheight = originalImage.Height * width / originalImage.Width;
            break;
        case ImageTransformMode.FixedHeight://指定高,宽按比例
            towidth = originalImage.Width * height / originalImage.Height;
            break;
        case ImageTransformMode.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();
    }
}
public enum ImageTransformMode
{
    /// <summary>
    /// //指定宽,高按比例 
    /// </summary>
    FixedWidth,
    /// <summary>
    /// 指定高,宽按比例
    /// </summary>
    FixedHeight,
    /// <summary>
    /// 指定高宽缩放(可能变形)
    /// </summary>
    FixedBoth,
    /// <summary>
    /// 指定高宽裁减(不变形)
    /// </summary>
    Cut,
    /// <summary>
    /// 按比例,生成较大的缩略图
    /// W>H ==> FixedWith
    /// W<H ==> FixedHeight
    /// </summary>
    AutoBig,
    /// <summary>
    /// 按比例,生成较小的缩略图
    /// W>H ==> FixedHeight
    /// W<H ==> FixedWith
    /// </summary>
    AutoSmall
}

 

posted @ 2013-09-29 17:02  玛雅人  阅读(225)  评论(0编辑  收藏  举报