使用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( 0 0 , bitmap.Width, bitmap.Height),
                    
new  Rectangle( 0 0 , 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;
        }
    }

}

 

 

 

 

你可能感兴趣的:(Stream)