菜鸟分享,大小可随意调节缩略图代码。希望对有需要的朋友有帮助

爱_逆光 2013-12-25 03:59:14
在这个.net论坛上许久了,一直都是一个菜鸟。忽然的,想陆续的分享一些功能上的代码,供和我一样正在奋斗的朋友们学习。我是自学的,没有在软件公司干过,所以,呵呵,高手朋友们可以潇洒的飘过,若是您感兴趣,欢迎批评指正。

以下是一段上传图片,并同时生成一张大小可以随意调节且不失真的缩略图代码。

前台:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link href="NewsCss.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<div class="sc_chanpin">
<asp:Label ID="Label1" runat="server" Text="选择上传的图片:"></asp:Label>
<asp:FileUpload ID="FileUpload1" runat="server" />
</div>
<div class="sc_chanpin">
<asp:Label ID="Label2" runat="server" Text="写入图片介绍:"></asp:Label>
<asp:TextBox ID="shuoming" runat="server" TextMode="MultiLine"></asp:TextBox>
</div>
<asp:Label ID="lbMessage" runat="server" Text="Label"></asp:Label>
<asp:ImageButton ID="ImageButton1" runat="server" OnClick="imgBtnLoad_Click" />
</div>
</form>
</body>
</html>


提交按钮的CS文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model;

public partial class houtai_chanpinManager : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void imgBtnLoad_Click(object sender, ImageClickEventArgs e)
{
if (!FileUpload1.HasFile)
{
lbMessage.Text = "请选择上传图片!";
return;
}
else
{
try
{
//获取上传文件路径
string filePath = FileUpload1.PostedFile.FileName;
//获取上传文件后缀
string fileExt = filePath.Substring(filePath.LastIndexOf(".") + 1);
//限定上传格式
if (fileExt.ToLower() == "gif" || fileExt.ToLower() == "jpg" || fileExt.ToLower() == "bmp" || fileExt.ToLower() == "png")
{
if (FileUpload1.PostedFile.ContentLength > 5120000)
{
lbMessage.Text = "限定上传图片的大小不能超出5M!";
return;
}
else
{
//取文件名
string nowTime = filePath.Substring(filePath.LastIndexOf("//") + 1);
string fileName = nowTime + "." + fileExt;
//源文件保存路径
string savePath = Server.MapPath("../image/");
//缩略图保存路径
string imgPath = Server.MapPath("../images/");
//上传图片
FileUpload1.PostedFile.SaveAs(savePath + fileName);
//创建自定义Album类对象实例
Album am = new Album();
//根据图片的宽、高比例生成缩略图
System.Drawing.Image img = System.Drawing.Image.FromFile(savePath + fileName);
if (img.Width >= img.Height)
{
am.GetThumbnail(savePath + fileName, imgPath + fileName, 280, 110, "Cut");
}
else
{
am.GetThumbnail(savePath + fileName, imgPath + fileName, 280, 110, "Cut");
}
//文件类型
string p_type = FileUpload1.PostedFile.ContentType;
//文件大小
int p_size = FileUpload1.PostedFile.ContentLength;

//调用类方法将数据插入到数据库
int result = am.AddPhoto(shuoming.Text.Trim(), fileName);

}
}
else
{
lbMessage.Text = "只允许上传gif,jpg,bmp,png格式的图片文件!";
return;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}
}

}



以上代码调用的Model层中的缩略图生成类


using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//引入命名空间
using System.Data.SqlClient;
using System.IO;

namespace Model
{


/// <summary>
///数据连接
/// </summary>
public class Album
{
//私有变量,数据库连接
protected SqlConnection conn;
protected string ConnectionString;
public Album()//构造函数
{
ConnectionString = ConfigurationManager.AppSettings["connstr"];
}
/// <summary>
/// 添加图片信息
/// </summary>
/// <returns></returns>
public int AddPhoto(string shuoming, string url)
{
//创建Connection对象
string sql = "server=XXXXXX;Database=XXXXXX;User ID=XXXXXX;Password=XXXXXX";
SqlConnection conn = new SqlConnection(sql);
//定义SQL语句
string sqlstr = "insert into XX(shuoming,Url) "
+ "values(@shuoming,@url)";//定义两个变量将图片说明和图片名称插入数据库
//创建Command对象
SqlCommand cmd = new SqlCommand(sqlstr, conn);
//设置参数并赋值
cmd.Parameters.Add("@shuoming", SqlDbType.Text).Value = shuoming;
cmd.Parameters.Add("@url", SqlDbType.NVarChar).Value = url;

int result = -1;
try
{
//打开数据库连接
conn.Open();
//执行命令
result = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
//抛出异常
throw new Exception(ex.Message, ex);
}
finally
{
//关闭连接
conn.Close();
}
return result;
}
/// <summary>
/// 生成缩略图//
/// </summary>
public void GetThumbnail(string serverImagePath, string thumbnailImagePath, int width, int height, string p)
{
System.Drawing.Image serverImage = System.Drawing.Image.FromFile(serverImagePath);

//画板大小
int towidth = width;
int toheight = height;
//缩略图矩形框的像素点
int x = 0;
int y = 0;
int ow = serverImage.Width;
int oh = serverImage.Height;

switch (p)
{
case "WH"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = serverImage.Height * width / serverImage.Width;
break;
case "H"://指定高,宽按比例
towidth = serverImage.Width * height / serverImage.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)serverImage.Width / (double)serverImage.Height > (double)towidth / (double)toheight)
{
oh = serverImage.Height;
ow = serverImage.Height * towidth / toheight;
y = 0;
x = (serverImage.Width - ow) / 2;
}
else
{
ow = serverImage.Width;
oh = serverImage.Width * height / towidth;
x = 0;
y = (serverImage.Height - oh) / 2;
}
break;
default:
break;
}

//新建一个bmp图片
System.Drawing.Image bm = new System.Drawing.Bitmap(towidth, toheight);

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

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

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

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

//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(serverImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
new System.Drawing.Rectangle(x, y, ow, oh),
System.Drawing.GraphicsUnit.Pixel);

try
{
//以jpg格式保存缩略图
bm.Save(thumbnailImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
serverImage.Dispose();
bm.Dispose();
g.Dispose();
}
}
}

}


生成缩略图和源图片都已经上传服务器相应路径,数据库的图片路径中只放图片的名称,在具体图片显示页上,就可以用直接用字符串替换方式将图片路径写在<img> src属性上。




...全文
156 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱_逆光 2013-12-26
  • 打赏
  • 举报
回复
引用 7 楼 uinatlex 的回复:
GetThumbnail 算法错的
您说哪里,我用的没问题啊。。。
爱_逆光 2013-12-26
  • 打赏
  • 举报
回复
引用 10 楼 uinatlex 的回复:
[quote=引用 9 楼 love_love_yyou 的回复:] [quote=引用 7 楼 uinatlex 的回复:] GetThumbnail 算法错的
您说哪里,我用的没问题啊。。。[/quote] 你除了第一个case 后面都是错的 你后面的case所有的计算都有下面这个问题 --------------------------------------------------------- 你这样计算只能保证你某些大小的缩放正确,不信你多试几种大小的图,其他专业软件缩放后和你做的大小就不同,简单点的就是 你在Windows文件夹里单点 原图和你这个生成的缩放图看看右下角Windows提示的缩略图,有的大小明显会不一样, 事实上值计算的时候应该先转化为浮点类型计算,最后再通过Math.Round 设定其MidpointRounding.AwayFromZero来得到最后的整型。 你定高宽的等比除了上面说的还有问题, ------------------------------------------------------------- 1.你判断的时候用的除法来判断整型,但你为了精确用了浮点类型,但是你为什么不等式转化用乘法。 2.你只判断出2种结果,事实上根据,给出的外围高宽比例是否大于1,和图片高宽是否大于1,一共会出现4种不同的情况。 你最后保存的时候有问题 ------------------------------------------------------------- 你最后保存的是JPG文件,但你没有指定它的ImageCodecInfo算法,这回导致在图像质量上会和其他专业软件上有比较明显的偏差。 最后 -------------------------------- 这个不能缩放动态的gif文件 [/quote] 果然高手,先谢了,我再研究下
uinatlex 2013-12-26
  • 打赏
  • 举报
回复
引用 9 楼 love_love_yyou 的回复:
[quote=引用 7 楼 uinatlex 的回复:] GetThumbnail 算法错的
您说哪里,我用的没问题啊。。。[/quote] 你除了第一个case 后面都是错的 你后面的case所有的计算都有下面这个问题 --------------------------------------------------------- 你这样计算只能保证你某些大小的缩放正确,不信你多试几种大小的图,其他专业软件缩放后和你做的大小就不同,简单点的就是 你在Windows文件夹里单点 原图和你这个生成的缩放图看看右下角Windows提示的缩略图,有的大小明显会不一样, 事实上值计算的时候应该先转化为浮点类型计算,最后再通过Math.Round 设定其MidpointRounding.AwayFromZero来得到最后的整型。 你定高宽的等比除了上面说的还有问题, ------------------------------------------------------------- 1.你判断的时候用的除法来判断整型,但你为了精确用了浮点类型,但是你为什么不等式转化用乘法。 2.你只判断出2种结果,事实上根据,给出的外围高宽比例是否大于1,和图片高宽是否大于1,一共会出现4种不同的情况。 你最后保存的时候有问题 ------------------------------------------------------------- 你最后保存的是JPG文件,但你没有指定它的ImageCodecInfo算法,这回导致在图像质量上会和其他专业软件上有比较明显的偏差。 最后 -------------------------------- 这个不能缩放动态的gif文件
  • 打赏
  • 举报
回复
同道必须顶一个
uinatlex 2013-12-25
  • 打赏
  • 举报
回复
GetThumbnail 算法错的
  • 打赏
  • 举报
回复
引用 5 楼 love_love_yyou 的回复:
[quote=引用 3 楼 sammy_luo 的回复:] 提供完整的解决方案,可供下载更好! 顶一个
上传资源提供下载?[/quote] yes
爱_逆光 2013-12-25
  • 打赏
  • 举报
回复
引用 3 楼 sammy_luo 的回复:
提供完整的解决方案,可供下载更好! 顶一个
上传资源提供下载?
Im_Sorry 2013-12-25
  • 打赏
  • 举报
回复
赞!!!!!!!!!!
  • 打赏
  • 举报
回复
提供完整的解决方案,可供下载更好! 顶一个
手抓宝 2013-12-25
  • 打赏
  • 举报
回复
赞一个。 话说,你的ID和参数名起的好逗,shuoming, 加油
Dotar 2013-12-25
  • 打赏
  • 举报
回复
有分享必顶.

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧