博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[共享]定大小自动填充空白的缩略图生成代码

Posted on 2007-10-19 12:30  losingrose  阅读(376)  评论(0)    收藏  举报

using System;
using System.IO;
using System.Web;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;

/// <summary>
/// Summary description for Fileop
/// 搜集编写者losingrose
/// QQ:303864496
/// MSN:losingrose@21cn.com
/// http://losingrose.cnblogs.com
/// </summary>
public static class MyFileOp
{

    //生成 (年,月,日,时,分,秒)+随机数的文件名
    private static string names()
    {
        Random rm = new Random(System.Environment.TickCount);
        return System.DateTime.Now.ToString("yyyyMMddhhmmss") + rm.Next(1000, 9999).ToString();
    }

    private static bool ThumbnailCallback()
    {
        return false;
    }

    /// <summary>
    /// 生成缩略图,返回图片的虚拟地址
    /// </summary>
    /// <param name="file">生成缩略图片</param>
    /// <param name="visualpath">设置的服务器文件上传虚拟路径用于替换掉无用的物理路径头</param>
    /// <param name="mappath">要上传到的服务器虚拟路径,请使用相对路径</param>
    /// <param name="newwidth">缩略图宽度</param>
    /// <param name="newheight">缩略图高度</param>

    public static string MinimageFixSize(string file, string visualpath, string mappath, int newwidth, int newheight)
    {
        //try
        //{
        //定义Image对象变量
        Image image = Image.FromFile(HttpContext.Current.Server.MapPath(file));
        //下面根据原有的图片尺寸计算要生成的图片尺寸
        int width = image.Width;
        int height = image.Height;
        int nwidth = newwidth;
        int nheight = newheight;
        if (width > height)
        {
            nheight = nwidth * height / width;
        }
        else
        {
            nwidth = nheight * width / height;
        }
        Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        Image newimage = image.GetThumbnailImage(nwidth, nheight, callb, new System.IntPtr());

        Bitmap bmWatermark = new Bitmap(newwidth, newheight);
        bmWatermark.SetResolution(bmWatermark.HorizontalResolution, bmWatermark.VerticalResolution);
        Graphics gw = Graphics.FromImage(bmWatermark);
        gw.Clear(Color.White);

        int xPosOfWm = ((bmWatermark.Width - newimage.Width) / 2);
        int yPosOfWm = ((bmWatermark.Height - newimage.Height) / 2);
        gw.DrawImage(newimage,new Rectangle(xPosOfWm, yPosOfWm, newimage.Width, newimage.Height),0,0,newimage.Width,newimage.Height, GraphicsUnit.Pixel);

        string name = Path.GetFileName(file);
        string newfile = HttpContext.Current.Server.MapPath(mappath);
        if (!Directory.Exists(newfile))
            Directory.CreateDirectory(newfile);
        newfile += Path.DirectorySeparatorChar + name;
        bmWatermark.Save(newfile);
        image.Dispose();
        newimage.Dispose();
        gw.Dispose();
        bmWatermark.Dispose();
       
        return HttpContext.Current.Server.MapPath(mappath).Replace(HttpContext.Current.Server.MapPath(visualpath), "") + Path.DirectorySeparatorChar + name;
        //}
        //catch (Exception e)
        //{
        //    throw e;
        //}
    }
}


实际效果如图(比例为200*210,边框是为了体现大小,非图片所带):