使用MemoryStream动态生成清晰度高的缩略图

一般都是用自带的那个类实现图片的缩略图,但小图还行,生成大点的图就很模糊了。

生成图片的ImageUtil.cs类

 

 

using System;
using System.Collections.Generic;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Net;
using System.IO;

/// <summary>
/// ImageUtil 的摘要说明
/// </summary>
public class ImageUtil
{
    
/// <summary>
    
/// 创建缩略图
    
/// </summary>
    
/// <param name="src">来源页面
    
/// 可以是相对地址或者绝对地址
    
/// </param>
    
/// <param name="width">缩略图宽度</param>
    
/// <param name="height">缩略图高度</param>
    
/// <returns>字节数组</returns>
    public static byte[] MakeThumbnail(string src, double width, double height)
    {
        Image image;

        
// 相对路径从本机直接读取
        if (src.ToLower().IndexOf("http://"== -1)
        {
            src 
= HttpContext.Current.Server.MapPath(src);
            image 
= Image.FromFile(src, true);
        }
        
else // 绝对路径从 Http 读取
        {
            HttpWebRequest req 
= (HttpWebRequest)WebRequest.Create(src);
            req.Method 
= "GET";
            HttpWebResponse resp 
= (HttpWebResponse)req.GetResponse();
            Stream receiveStream 
= resp.GetResponseStream();
            image 
= Image.FromStream(receiveStream);
            resp.Close();
            receiveStream.Close();
        }
        
double newWidth, newHeight;
        
if (image.Width > image.Height)
        {
            newWidth 
= width;
            newHeight 
= image.Height * (newWidth / image.Width);
        }
        
else
        {
            newHeight 
= height;
            newWidth 
= (newHeight / image.Height) * image.Width;
        }
        
if (newWidth > width)
        {
            newWidth 
= width;
        }
        
if (newHeight > height)
        {
            newHeight 
= height;
            newWidth 
= image.Width * (newHeight / image.Height);
        }
        
//取得图片大小
        Size size = new Size((int)newWidth, (int)newHeight);
        
//新建一个bmp图片
        Image bitmap = new Bitmap(size.Width, size.Height);
        
//新建一个画板
        Graphics g = Graphics.FromImage(bitmap);
        
//设置高质量插值法
        g.InterpolationMode = InterpolationMode.High;
        
//设置高质量,低速度呈现平滑程度
        g.SmoothingMode = SmoothingMode.HighQuality;
        
//清空一下画布
        g.Clear(Color.White);
        
//在指定位置画图
        g.DrawImage(image, new Rectangle(00, bitmap.Width, bitmap.Height),
                    
new Rectangle(00, image.Width, image.Height),
                    GraphicsUnit.Pixel);
        
//保存高清晰度的缩略图
        MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, ImageFormat.Jpeg);
        
byte[] buffer = stream.GetBuffer();
        g.Dispose();
        image.Dispose();
        bitmap.Dispose();
        
return buffer;
    }
}

 

 

 

使用Thumbnail.ashx做为调用的文件地址(ashx处理的比aspx的速度快)

 

 

Code
<%@ WebHandler Language="C#" Class="Thumbnail" %>

using System;
using System.Web;
/// <summary>
/// 生产缩略图 调用方式<img src="Thumbnail.ashx?width=200&height=150&src=2.JPG" />
/// </summary>
public class Thumbnail : IHttpHandler
{

    
public void ProcessRequest(HttpContext context)
    {
        
string src = GetQueryStringSrc(context);
        
double width = GetQueryStringWidth(context);
        
double height = GetQueryStringHeight(context);
        context.Response.ContentType 
= "image/jpeg";
        context.Response.Clear();
        
if (src.Length > 0 && width > 0 && height > 0)
        {
            
try
            {
                
byte[] buffer = ImageUtil.MakeThumbnail(src, width, height);
                context.Response.BinaryWrite(buffer);
                context.Response.Flush();
            }
            
catch (Exception exce)
            {
                
string errstr = exce.Message;
            }
        }
    }

    
#region handle query string

    
private string GetQueryStringSrc(HttpContext context)
    {
        
string src = context.Request.QueryString["src"];
        src 
= (src == null? "" : src;
        
return src;
    }

    
private double GetQueryStringWidth(HttpContext context)
    {
        
string sWidth = context.Request.QueryString["width"];
        sWidth 
= (sWidth == null? "" : sWidth;
        
double width = 0;
        
try
        {
            width 
= double.Parse(sWidth);
        }
        
catch
        {
        }
        
return width;
    }

    
private double GetQueryStringHeight(HttpContext context)
    {
        
string sHeight = context.Request.QueryString["height"];
        sHeight 
= (sHeight == null? "" : sHeight;
        
double height = 0;
        
try
        {
            height 
= double.Parse(sHeight);
        }
        
catch
        {
        }
        
return height;
    }

    
#endregion
    
public bool IsReusable
    {
        
get
        {
            
return false;
        }
    }

}

 

 

 

 

posted @ 2009-08-24 15:17  zmxmiss  阅读(2940)  评论(2编辑  收藏  举报