您的位置:首页 > 其它

.net生成缩略图,支持等比例缩放,加水印

2012-08-06 11:00 288 查看
using System;
using System.IO;
using System.Drawing;
public partial class study_test : System.Web.UI.Page
{
#region 变量
private int MaxSize = 2097152; //2M 1024*1024*2
#endregion
protected void Page_Load(object sender, EventArgs e)
{
//CreateThumbnail(175, 175, "upfile/1.jpg");
MakeThumbnail(Server.MapPath("upfile/1.jpg"), Server.MapPath("upfile/3.jpg"), 175, 1000, "EQU");
}

#region 按照最大高宽来生成等比例缩略图,并以图片的形式输出
/// <summary>
/// 按照最大高宽来生成等比例缩略图,并以图片的形式输出
/// </summary>
/// <param name="NewWidth">缩略图最大宽度</param>
/// <param name="NewHeight">缩略图最大高度</param>
/// <param name="OldPath">原始图像地址,可以是绝度地址也可以是相对地址</param>
/// <returns></returns>
//public bool CreateThumbnail(int NewWidth, int NewHeight, string OldPath, string NewPath)
public void CreateThumbnail(int NewWidth, int NewHeight, string OldPath)
{
try
{
int oldwidth, oldheight, neww, newh;
System.Drawing.Image image;
System.Drawing.Image.GetThumbnailImageAbort callb = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
image = GetImage(OldPath);
oldwidth = image.Width;
oldheight = image.Height;

if (NewWidth > oldwidth && NewHeight > oldheight)//如果缩略图宽高都大于原始图宽高,则按原始图尺寸输出
{
neww = oldwidth;
newh = oldheight;
}
else if (oldwidth*NewHeight >NewWidth* oldheight)
{
neww = NewWidth;
newh = oldheight * NewWidth / oldwidth;
}
else
{
newh = NewHeight;
neww = oldwidth * NewHeight / oldheight;
}
//newimage = image.GetThumbnailImage(neww, newh, callb, IntPtr.Zero);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(neww, newh);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//设置高质量,低速度呈现平滑程度
g.Clear(Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(image, 0, 0, bmp.Width, bmp.Height);

//输出到页面
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

Response.ClearContent(); //需要输出图象信息 要修改HTTP头
byte[] buffer = ms.ToArray();

Response.AddHeader("Content-type", "image/jpeg");
Response.BinaryWrite(buffer);

image.Dispose();
Response.End();
}
catch (Exception e)
{
// return false;
Response.Write("图片处理错误");
// Response.Write(e.Message);
}
}
private bool ThumbnailCallback()
{
return false;
}
public System.Drawing.Image GetImage(string path)
{
if (path.StartsWith("http"))//获取远程图片
{
System.Net.WebRequest request = System.Net.WebRequest.Create(path);
request.Timeout = 10000;
System.Net.HttpWebResponse httpresponse = (System.Net.HttpWebResponse)request.GetResponse();
Stream s = httpresponse.GetResponseStream();
return System.Drawing.Image.FromStream(s);
}
else//获取本地图片
{
return System.Drawing.Image.FromFile(Server.MapPath(path));
}
}
#endregion

#region 图片缩放,多种指定方式生成图片
/// <summary>
/// 图片缩放
/// </summary>
/// <param name="originalImagePath">原始图片路径,如:c:\\images\\1.gif</param>
/// <param name="thumbnailPath">生成缩略图图片路径,如:c:\\images\\2.gif</param>
/// <param name="width">宽</param>
/// <param name="height">高</param>
/// <param name="mode">EQU:指定最大高宽等比例缩放;HW://指定高宽缩放(可能变形);W:指定宽,高按比例;H:指定高,宽按比例;Cut:指定高宽裁减(不变形)</param>
public static 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;

if (mode == "EQU")//指定最大高宽,等比例缩放
{
//if(height/oh>width/ow),如果高比例多,按照宽来缩放;如果宽的比例多,按照高来缩放
if (height * ow > width * oh)
{
mode = "W";
}
else
{
mode = "H";
}
}
switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / 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);

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

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

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

//清空画布并以透明背景色填充
g.Clear(System.Drawing.Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
new System.Drawing.Rectangle(x, y, ow, oh),
System.Drawing.GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
#endregion

#region 图片相关的其他方法
/**/
/// <summary>
/// 在图片上增加文字水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_sy">生成的带文字水印的图片路径</param>
protected void AddShuiYinWord(string Path, string Path_sy)
{
string addText = "Mega Elte";
System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
g.DrawImage(image, 0, 0, image.Width, image.Height);
System.Drawing.Font f = new System.Drawing.Font("Verdana", 16);
System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Gray);
g.DrawString(addText, f, b, 15, 15);
g.Dispose();
image.Save(Path_sy);
image.Dispose();
}

/**/
/// <summary>
/// 在图片上生成图片水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_syp">生成的带图片水印的图片路径</param>
/// <param name="Path_sypf">水印图片路径</param>
protected void AddShuiYinPic(string Path, string Path_syp, string Path_sypf)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Path_sypf);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
g.Dispose();
image.Save(Path_syp);
image.Dispose();
}
#endregion
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: