使用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;
}
}
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;
}
}
}
<%@ 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;
}
}
}