ASP.NET下实现图片等比例缩放和裁剪

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="File1" runat="server" type="file" />
        <asp:Button ID="BtnSend" runat="server" OnClick="BtnSend_Click" Text="生成" /></div>
    </form>
</body>
</html>


----------------------------------------------------------------------------------------------------------

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void BtnSend_Click(object sender, EventArgs e)
    {
        //int towidth = width;
        //int toheight = height;

        //int x = 0;
        //int y = 0;
        //int ow = originalImage.Width;
        //int oh = originalImage.Height;

        //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;
        //}

        //Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        //Bitmap myBitmap = new Bitmap(this.File1.PostedFile.FileName);
        //Image myThumbnail = myBitmap.GetThumbnailImage(120, 120, myCallback, IntPtr.Zero);

        //myThumbnail.Save(Server.MapPath("file/" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".gif"));
        //myThumbnail.Dispose();

        MakeThumbnail(this.File1.PostedFile.FileName, Server.MapPath("file"), 100, 100, "A");
    }

    public bool ThumbnailCallback()
    {
        return false;
    }

  ///<summary>
  /// 生成缩略图
  /// </summary>
  /// <param name="originalImagePath">源图路径(物理路径)</param>
  /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
  /// <param name="width">缩略图宽度</param>
  /// <param name="height">缩略图高度</param>
  /// <param name="mode">生成缩略图的方式</param>   
  public  void MakeThumbnail(string originalImagePath,string thumbnailPath, int width, int height, string mode)
  {
       System.Drawing.Image originalImage =System.Drawing.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 "A":
                if (originalImage.Width / originalImage.Height >= width / height)
                {
                    if (originalImage.Width > width)
                    {
                        towidth = width;
                        toheight = (originalImage.Height * width) / originalImage.Width;
                    }
                    else
                    {
                        towidth = originalImage.Width;
                        toheight = originalImage.Height;
                    }
                }
                else
                {
                    if (originalImage.Height > height)
                    {
                        toheight = height;
                        towidth = (originalImage.Width * height) / originalImage.Height;
                    }
                    else
                    {
                        towidth = originalImage.Width;
                        toheight = 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图片
       System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth,toheight);

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

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

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

       //清空画布并以透明背景色填充
       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(Server.MapPath("file/" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
        //outthumbnailPath=thumbnailPath;
       }
       catch(System.Exception e)
       {
        throw e;
       }
       finally
       {
        originalImage.Dispose();
        bitmap.Dispose();                       
        g.Dispose();
       }
  }
}

posted @ 2008-05-21 19:13  supers  阅读(1867)  评论(0)    收藏  举报