前段时间在网上找到了一个网友提供的生成缩略图的类。最近因为工作需要需要进行修改。就自己写了些,放在这里做个备份。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.UI.WebControls;
namespace Thumbnail
{
public class CreateThumbnail
{
private int _TWidth = 100;
private int _THeight = 100;
private string _TPath = "UpdateImage";
private int _limitwidth = 3072;
private int _limitheight = 2304;
private int _size = 3000000;
private string _OPath = "UpdateImage";
private bool _israte = true;
/// <summary>
/// 缩略图宽度。默认100px
/// </summary>
#region public int TWidth
public int TWidth
{
get
{
return _TWidth;
}
set
{
_TWidth = value;
}
}
#endregion
/// <summary>
/// 缩略图高度。默认100px
/// </summary>
#region public int THeight
public int THeight
{
get
{
return _THeight;
}
set
{
_THeight = value;
}
}
#endregion
/// <summary>
/// 缩略图存储文件夹。默认根目录UpdateImage文件夹。
/// </summary>
#region public string TPath
public string TPath
{
get
{
return _TPath;
}
set
{
_TPath = value;
}
}
#endregion
/// <summary>
/// 原图限定宽度。默认3072px
/// </summary>
#region public int LimitWidth
public int LimitWidth
{
get
{
return _limitwidth;
}
set
{
_limitwidth = value;
}
}
#endregion
/// <summary>
/// 原图限定高度。默认2304px
/// </summary>
#region public int LimitHeight
public int LimitHeight
{
get
{
return _limitheight;
}
set
{
_limitheight = value;
}
}
#endregion
/// <summary>
/// 原图限定大小。
/// </summary>
#region public int Size
public int Size
{
get
{
return _size;
}
set
{
_size = value;
}
}
#endregion
/// <summary>
/// 原图存储文件夹。默认根目录UpdateImage文件夹。
/// </summary>
#region public string OPath
public string OPath
{
get
{
return _OPath;
}
set
{
_OPath = value;
}
}
#endregion
/// <summary>
/// 是否成比例
/// </summary>
#region public bool IsRate
public bool IsRate
{
get
{
return _israte;
}
set
{
_israte = value;
}
}
#endregion
/// <summary>
/// 上传原图,产生缩略图。(默认:等比压缩,"限定上传尺寸2048*1536,缩略图尺寸100*100,限定上传大小1MB,存放在根目录UpdateImage中")
/// </summary>
/// <param name="fu">图片上传控件。</param>
/// <returns>返回原图完整路径"OFullName",原图存储名"OFileName",缩略图完整路径"",缩略图存储名"",操作信息"",操作信息会提示对应错误信息。</returns>
#region public Dictionary<string, string> GetThumbnail(FileUpload fu)
public Dictionary<string, string> GetThumbnail(FileUpload fu)
{
Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "OFullName", "" }, { "OFileName", "" }, { "TFullName", "" }, { "TFileName", "" }, { "Msg", "" } };
if (fu.HasFile)//检查是否已经选择文件
{
string filename = fu.FileName.ToLower();
int i = filename.LastIndexOf(".");
filename = filename.Substring(i, filename.Length - i);
//检查上传文件的格式是否有效
if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
{
dicReturn["Msg"] = "不受支持的类型,请重新选择!";
return dicReturn;
}
//检查图片文件的大小
if (fu.PostedFile.ContentLength == 0 || fu.PostedFile.ContentLength >= Size)
{
dicReturn["Msg"] = "指定的文件大小不符合要求!";
return dicReturn;
}
//生成原图
Stream oStream = fu.PostedFile.InputStream;
System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
int owidth = oImage.Width; //原图宽度
int oheight = oImage.Height; //原图高度
//检查是否超出规定尺寸
if (owidth > LimitWidth || oheight > LimitHeight)
{
dicReturn["Msg"] = "超过允许的图片尺寸范围!";
return dicReturn;
}
if (IsRate)
{
//按比例计算出缩略图的宽度和高度
if (owidth >= oheight)
{
THeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(TWidth) / Convert.ToDouble(owidth)));//等比设定高度
}
else
{
TWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(THeight) / Convert.ToDouble(oheight)));//等比设定宽度
}
}
//生成缩略原图
Bitmap tImage = new Bitmap(TWidth, THeight);
Graphics g = Graphics.FromImage(tImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
g.Clear(Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(oImage, new Rectangle(0, 0, TWidth, THeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);
Random oRandom = new Random();
string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字
//格式化日期作为文件名
DateTime oDateTime = new DateTime();
oDateTime = DateTime.Now;
string oStringTime = oDateTime.ToString();
oStringTime = oStringTime.Replace("-", "");
oStringTime = oStringTime.Replace(" ", "");
oStringTime = oStringTime.Replace(":", "");
dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;
dicReturn["TFileName"] = "t" + oStringTime + oStringRandom + filename;
string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";
if (!Directory.Exists(OSavePath))
{
Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
}
if (!Directory.Exists(TSavePath))
{
Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
}
dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];
dicReturn["TFullName"] = TSavePath + dicReturn["TFileName"];
//开始保存图片至服务器
try
{
switch (filename)
{
case ".jpeg":
case ".jpg":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
}
break;
case ".gif":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Gif);
}
break;
case ".png":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Png);
}
break;
case ".bmp":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
}
break;
}
dicReturn["Msg"] = "图片上传成功!";
//保存路径+完整文件名
string _OSavePath = "/" + OPath + "/";
string _TSavePath = "/" + TPath + "/";
dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];
dicReturn["TFullName"] = _TSavePath + dicReturn["TFileName"];
}
catch (Exception ex)
{
dicReturn["Msg"] = ex.Message;
return dicReturn;
}
finally
{
//释放资源
oImage.Dispose();
g.Dispose();
tImage.Dispose();
}
}
else
{
dicReturn["Msg"] = "请先选择需要上传的图片!";
return dicReturn;
}
return dicReturn;
}
#endregion
/// <summary>
/// 上传原图,产生缩略图。
/// </summary>
/// <param name="fu">图片上传控件。</param>
/// <param name="TWidth">缩略图宽度,单位px。</param>
/// <param name="THeight">缩略图高度,单位px。</param>
/// <param name="TPath">缩略图存储目录。</param>
/// <param name="OPath">原图存储目录。</param>
/// <param name="IsRate">是否等比。</param>
/// <returns>返回原图完整路径"OFullName",原图存储名"OFileName",缩略图完整路径"",缩略图存储名"",操作信息"",操作信息会提示对应错误信息。</returns>
#region public static Dictionary<string, string> GetThumbnail(FileUpload fu, int TWith, int iHeight, string TPath, string OPath, bool IsRate)
public static Dictionary<string, string> GetThumbnail(FileUpload fu, int TWidth, int THeight, string TPath, string OPath, bool IsRate)
{
Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "OFullName", "" }, { "OFileName", "" }, { "TFullName", "" }, { "TFileName", "" }, { "Msg", "" } };
if (fu.HasFile)//检查是否已经选择文件
{
string filename = fu.FileName.ToLower();
int i = filename.LastIndexOf(".");
filename = filename.Substring(i, filename.Length - i);
//检查上传文件的格式是否有效
if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
{
dicReturn["Msg"] = "不受支持的类型,请重新选择!";
return dicReturn;
}
//生成原图
Stream oStream = fu.PostedFile.InputStream;
System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
int owidth = oImage.Width; //原图宽度
int oheight = oImage.Height; //原图高度
if (IsRate)
{
//按比例计算出缩略图的宽度和高度
if (owidth >= oheight)
{
THeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(TWidth) / Convert.ToDouble(owidth)));//等比设定高度
}
else
{
TWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(THeight) / Convert.ToDouble(oheight)));//等比设定宽度
}
}
//生成缩略原图
Bitmap tImage = new Bitmap(TWidth, THeight);
Graphics g = Graphics.FromImage(tImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
g.Clear(Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(oImage, new Rectangle(0, 0, TWidth, THeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);
Random oRandom = new Random();
string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字
//格式化日期作为文件名
DateTime oDateTime = new DateTime();
oDateTime = DateTime.Now;
string oStringTime = oDateTime.ToString();
oStringTime = oStringTime.Replace("-", "");
oStringTime = oStringTime.Replace(" ", "");
oStringTime = oStringTime.Replace(":", "");
dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;
dicReturn["TFileName"] = "t" + oStringTime + oStringRandom + filename;
string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";
if (!Directory.Exists(OSavePath))
{
Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
}
if (!Directory.Exists(TSavePath))
{
Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
}
dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];
dicReturn["TFullName"] = TSavePath + dicReturn["TFileName"];
//开始保存图片至服务器
try
{
switch (filename)
{
case ".jpeg":
case ".jpg":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
}
break;
case ".gif":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Gif);
}
break;
case ".png":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Png);
}
break;
case ".bmp":
{
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
tImage.Save(dicReturn["TFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
}
break;
}
dicReturn["Msg"] = "图片上传成功!";
//保存路径+完整文件名
string _OSavePath = "/" + OPath + "/";
string _TSavePath = "/" + TPath + "/";
dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];
dicReturn["TFullName"] = _TSavePath + dicReturn["TFileName"];
}
catch (Exception ex)
{
dicReturn["Msg"] = ex.Message;
return dicReturn;
}
finally
{
//释放资源
oImage.Dispose();
g.Dispose();
tImage.Dispose();
}
}
else
{
dicReturn["Msg"] = "请先选择需要上传的图片!";
return dicReturn;
}
return dicReturn;
}
#endregion
/// <summary>
/// 上传原图,产生多个缩略图。
/// </summary>
/// <param name="fu">图片上传控件。</param>
/// <param name="OPath">缩略图存储目录。</param>
/// <param name="TPath">原图存储目录。</param>
/// <param name="dicThum">缩略图尺寸,宽*高</param>
/// <param name="IsRate">是否等比。</param>
/// <returns></returns>
#region public static Dictionary<string, string> GetThumbnails(FileUpload fu, string OPath, string TPath, Dictionary<int, int> dicThum, bool IsRate)
public static Dictionary<string, string> GetThumbnails(FileUpload fu, string OPath, string TPath, Dictionary<int, int> dicThum, bool IsRate)
{
Dictionary<string, string> dicReturn = new Dictionary<string, string>() { { "Msg", "" } };
if (fu.HasFile)//检查是否已经选择文件
{
string filename = fu.FileName.ToLower();
int i = filename.LastIndexOf(".");
filename = filename.Substring(i, filename.Length - i);
//检查上传文件的格式是否有效
if (!(filename == ".jpg" || filename == ".jpeg" || filename == ".gif" || filename == ".png" || filename == ".bmp"))
{
dicReturn["Msg"] = "不受支持的类型,请重新选择!";
return dicReturn;
}
//生成原图
Stream oStream = fu.PostedFile.InputStream;
System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
int owidth = oImage.Width; //原图宽度
int oheight = oImage.Height; //原图高度
Random oRandom = new Random();
string oStringRandom = oRandom.Next(9999).ToString();//生成4位随机数字
//格式化日期作为文件名
DateTime oDateTime = new DateTime();
oDateTime = DateTime.Now;
string oStringTime = oDateTime.ToString();
oStringTime = oStringTime.Replace("-", "");
oStringTime = oStringTime.Replace(" ", "");
oStringTime = oStringTime.Replace(":", "");
dicReturn["OFileName"] = "o" + oStringTime + oStringRandom + filename;
string OSavePath = HttpContext.Current.Server.MapPath("~") + "//" + OPath + "//";
string TSavePath = HttpContext.Current.Server.MapPath("~") + "//" + TPath + "//";
if (!Directory.Exists(OSavePath))
{
Directory.CreateDirectory(OSavePath);//在根目录下建立文件夹
}
if (!Directory.Exists(TSavePath))
{
Directory.CreateDirectory(TSavePath);//在根目录下建立文件夹
}
dicReturn["OFullName"] = OSavePath + dicReturn["OFileName"];
//开始保存图片至服务器
try
{
switch (filename)
{
case ".jpeg":
case ".jpg":
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case ".gif":
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Gif);
break;
case ".png":
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Png);
break;
case ".bmp":
oImage.Save(dicReturn["OFullName"], System.Drawing.Imaging.ImageFormat.Bmp);
break;
}
dicReturn["Msg"] = "图片上传成功!";
//保存路径+完整文件名
string _OSavePath = "/" + OPath + "/";
dicReturn["OFullName"] = _OSavePath + dicReturn["OFileName"];
int iIndex = 1;
foreach (KeyValuePair<int, int> kvp in dicThum)
{
dicReturn["TFileName_" + iIndex.ToString()] = "t" + iIndex.ToString() + "_" + oStringTime + oStringRandom + filename;
dicReturn["TFullName_" + iIndex.ToString()] = TSavePath + dicReturn["TFileName_" + iIndex.ToString()];
int tHeight = kvp.Value;
int tWidth = kvp.Key;
if (IsRate)
{
//按比例计算出缩略图的宽度和高度
if (owidth >= oheight)
{
tHeight = (int)Math.Floor(Convert.ToDouble(oheight) * (Convert.ToDouble(tWidth) / Convert.ToDouble(owidth)));//等比设定高度
}
else
{
tWidth = (int)Math.Floor(Convert.ToDouble(owidth) * (Convert.ToDouble(tHeight) / Convert.ToDouble(oheight)));//等比设定宽度
}
}
//生成缩略原图
Bitmap tImage = new Bitmap(tWidth, tHeight);
Graphics g = Graphics.FromImage(tImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
g.Clear(Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(oImage, new Rectangle(0, 0, tWidth, tHeight), new Rectangle(0, 0, owidth, oheight), GraphicsUnit.Pixel);
//开始保存图片至服务器
try
{
switch (filename)
{
case ".jpeg":
case ".jpg":
tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case ".gif":
tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Gif);
break;
case ".png":
tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Png);
break;
case ".bmp":
tImage.Save(dicReturn["TFullName_" + iIndex.ToString()], System.Drawing.Imaging.ImageFormat.Bmp);
break;
}
//保存路径+完整文件名
string _TSavePath = "/" + TPath + "/";
dicReturn["TFullName_" + iIndex.ToString()] = _TSavePath + dicReturn["TFileName_" + iIndex.ToString()];
}
catch (Exception ex)
{
dicReturn["Msg"] = ex.Message;
break;
}
finally
{
//释放资源
g.Dispose();
tImage.Dispose();
}
iIndex++;
}
}
catch (Exception ex)
{
dicReturn["Msg"] = ex.Message;
return dicReturn;
}
finally
{
//释放资源
oImage.Dispose();
}
}
else
{
dicReturn["Msg"] = "请先选择需要上传的图片!";
return dicReturn;
}
return dicReturn;
}
#endregion
}
}