首页 新闻 会员 周边

Asp.Net 如何按需生成缩略图,并不是预先生成一堆固定尺寸的缩略图。

0
悬赏园豆:5 [已解决问题] 解决于 2011-08-16 11:15

ImageMagick 或者 GraphicsMagick 

利用ImageMagick,你可以根据web应用程序的需要动态生成图片。

GraphicsMagick能够动态的生成图片。

它们的简单介绍。

但是如何运用到asp.net呢?

我只想保留原图,在页面上面用到一个尺寸才去生成对应的缩略图。

大佬辉的主页 大佬辉 | 菜鸟二级 | 园豆:261
提问于:2011-07-27 17:53
< >
分享
最佳答案
0
#region 图片切割
/// <summary>
/// 图片切割(用来做缩略图)
/// </summary>
/// <param name="fileImg">要切割的图片(源图)</param>
/// <param name="qieWidth">切割宽度</param>
/// <param name="qieHeight">切割高度</param>
/// <param name="Suffix">图片后缀名,默认为jpg(一般不改)</param>
/// <param name="CunFile">图片保存路径,默认为image(一般不改)</param>
/// <returns></returns>
public static string NewsPic(string fileImg, int qieWidth, int qieHeight, string Suffix,string CunFile)
{
if (CunFile == "")
{
CunFile
= "\\image\\";
}
else
{
CunFile
+= "\\";
}
if (!Directory.Exists(HttpContext.Current.Server.MapPath(CunFile)))
{
Directory.CreateDirectory(HttpContext.Current.Server.MapPath(CunFile));
}
System.Drawing.Image image
= System.Drawing.Image.FromFile(fileImg);
//判断切割的宽或高是否为空和大于源图宽高
if (qieWidth == 0 || qieWidth > image.Width)
{
qieWidth
= image.Width / 2;
}
if (qieHeight == 0 || qieHeight > image.Height)
{
qieHeight
= image.Height / 2;
}
//Format24bppRgb指定像素每个为24位,清晰效果好
Bitmap bitmap = new Bitmap(qieWidth, qieHeight, PixelFormat.Format24bppRgb);
//设置图片的分辩率
bitmap.SetResolution(80, 80);
//从指定的图片创建新的图片(画图)
Graphics g = Graphics.FromImage(bitmap);
/*---------------------------------------------------------*/
/*
* 消除齿巨的呈现
* AntiAlias 指定消除锯齿的呈现。
* Default 指定默认模式。
* HighQuality 指定高质量、低速度呈现。
* HighSpeed 指定高速度、低质量呈现。
* Invalid 指定一个无效模式。
* None 指定不消除锯齿。
*/
g.SmoothingMode
= SmoothingMode.AntiAlias;
/*---------------------------------------------------------*/
//插补模式确定如何计算两个终结点之间的中间值
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//取得或設定值,指定在這個 Graphics 的呈現期間如何位移像素,高
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
/*---------------------------------------------------------*/
/*
* 开始绘图,使用Rectangle函数绘图
* 在指定位置并且按指定大小绘制指定的 Image 的指定部分
* image.Width取源图宽,在源图整体上缩小图
* image.Height取源图高,在源图整体上缩小图
*/
g.DrawImage(image,
new Rectangle(0, 0, qieWidth, qieHeight), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
/*---------------------------------------------------------*/
string fName = string.Empty;//路径
string picName = string.Empty;//图片名
if (Suffix != "")
{
picName
= Guid.NewGuid().ToString() + "." + Suffix;
fName
= HttpContext.Current.Server.MapPath(CunFile + "\\") + picName;
}
else
{
picName
= Guid.NewGuid().ToString() + ".jpg";
fName
= HttpContext.Current.Server.MapPath(CunFile + "\\") + picName;
}
try
{
switch (Suffix)
{
case "jpg":
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case "png":
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Png);
break;
case "jpeg":
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case "gif":
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Gif);
break;
case "bmp":
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Bmp);
break;
default:
bitmap.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
}
//绘完之后清除
image.Dispose();
g.Dispose();
bitmap.Dispose();
return picName;
}
catch
{
return "";
}
}

#endregion

用这个就行了,可以根据WEB的需求来切割自己所想要的缩小略图,

收获园豆:3
咆哮的野猪 | 初学一级 |园豆:60 | 2011-07-29 09:59
由于我的项目是用ftp协议上传图片的。那如果一个页面上面有好多图片要重新生成缩略图的话效率会慢吧?而且生成后还要ftp上服务器。大型网站都这样做的吗?
大佬辉 | 园豆:261 (菜鸟二级) | 2011-07-29 10:13
如果是那样的话得可以写成一个应用程序来批量切割,大型网站我不清楚,不过我知道一些网站的图片多而且只能通过FTP来上传,这些一般都是些一个专门切割图片的应用程序来弄的
咆哮的野猪 | 园豆:60 (初学一级) | 2011-07-29 10:49
淘宝的图片还是用到才生成的。。如果我也用到才生成那不是要先从ftp下载图片再生成缩略图再上传到对于的图片服务器吗?效率就慢好多了。
大佬辉 | 园豆:261 (菜鸟二级) | 2011-07-29 17:45
其他回答(2)
0

程序写好了就行了啊

慧☆星 | 园豆:5640 (大侠五级) | 2011-07-28 09:06
可是我想知道更多!
支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2011-07-28 10:05
0

以前看过一些国外的PHP网站都是 直接传地址和图片大小到一个动态的 .PHP文件处理

 

ASP.NET ,也是一样弄一个 .ashx 的处理,接受传递过来的 图片路径和图片大小格式 如  GetImg..ashx?imgurl=kkk.jpg&imgsize=120*120

GetImg..ashx 接受,

先判断是否存在:kk.jpg,

然后判断缩略图 文件 如: kkk-120-120.jpg   -  存在,即输出 kkk-120-120.jpg

没有就生成  kkk-120-120.jpg 的 缩略图 

收获园豆:2
阿K&LiveCai | 园豆:514 (小虾三级) | 2011-07-28 16:37
这只是个参考思路。
支持(0) 反对(0) 阿K&LiveCai | 园豆:514 (小虾三级) | 2011-07-28 16:38
这样做的话很耗CPU和IO操作吧?对于性能不好哦。
支持(0) 反对(0) 大佬辉 | 园豆:261 (菜鸟二级) | 2011-07-28 16:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册