关于生成缩略图的做法,网上搜了一下,大多数都是采用如下的做法:
publicvoidGenerateThumbnailImage(System.Drawing.Imageimg,intwi,inthi,stringimgDir,stringimgName,System.Drawing.Image.GetThumbnailImageAbortcallb,stringsaveDir)
...{
intwidth,height,newwidth,newheight;
System.Drawing.ImagenewImg;
img=System.Drawing.Image.FromFile(Server.MapPath(imgDir+imgName));
width=img.Width;
height=img.Height;
if(width>height)
...{
newwidth=wi;
newheight=(int)(wi*height/width);
}
else
...{
newheight=hi;
newwidth=(int)(hi*width/height);
}
newImg=img.GetThumbnailImage(newwidth,newheight,callb,newSystem.IntPtr());
newImg.Save(Server.MapPath(saveDir));
}
上面代码很容易就生成了缩略图,但是效果很不理想,图片很模糊.于是又搜了一遍,结果搜到如下代码,到底出自哪位仁兄就忘了:
publicstaticvoidMakeThumbnail(stringoriginalImagePath,stringthumbnailPath,intwidth,intheight,stringmode)
...{
System.Drawing.ImageoriginalImage=System.Drawing.Image.FromFile(originalImagePath);
inttowidth=width;
inttoheight=height;
intx=0;
inty=0;
intow=originalImage.Width;
intoh=originalImage.Height;
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.Imagebitmap=newSystem.Drawing.Bitmap(towidth,toheight);
//新建一个画板
System.Drawing.Graphicsg=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,newSystem.Drawing.Rectangle(0,0,towidth,toheight),
newSystem.Drawing.Rectangle(x,y,ow,oh),
System.Drawing.GraphicsUnit.Pixel);
try
...{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath,System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch(System.Exceptione)
...{
throwe;
}
finally
...{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
照搬下去试了一下,结果执行到保存文件这一步总出现"GDI+ 中发生一般性错误",google了一下,都是说要么没权限,要么image没有Dispose,该加的都加进去,权限也得到保证,可依然没什么改观,重复了N次,就是没发现哪里出现问题,就在要放弃的时候,才发现原来出现不可原谅的错误:文件保存的路径不对!当场狂凑了自己一顿!把路径改过来之后果然那鬼门关顺利的通过,生成渴望已久的缩略图.(^_^)
以下是几种方法得到的不同效果,当然最模糊的就是第一种啦!
分享到:
相关推荐
pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图pdf生成缩略图
本资源是基于Springmvc的图片上传案例,并对上传的图片添加了生成缩略图的功能。
生成网页缩略图,输入网址,宽度,高度生成缩略图 不过,我生成的是bmp,又需要自行修改。我也是拿别人的用的
一个批量生成缩略图工具的源代码,winform源代码,可以参考它的做法。
java 上传图片时生成对应的缩略图,缩略图的大小可手动更改,代码中有详细注释
java 生成缩略图类 源代码 (已经封装好)
jsp上传图片并生成缩略图example upload pictures and zoom it
原类生成的缩略图的问题在于:高或者宽可能会大于需求值。比如,我需要的图片宽为150,高为120,当原图 * 高为150,宽为150或差距不大时,生成的图片不会有变化,即也是高150,宽150,这样,当把这些图片显示到网页...
html5图片上传本地生成缩略图预览
相关知识struts2,fileupload等,实现图片上传并生成缩略图。单文件上传,图片展示直接使用jQuery FancyBox,效果不错,值得初学者研究学习。
在asp.net中,上传图片功能或者是常用的,生成缩略图也是常用的。baidu或者google,c#的方法也是很多的,但是一用却发现缩略图不清晰啊,缩略图片太大之类的事情,下面是我在处理图片上的代码,效果不错,所以拿出来...
C#把Word和Excel生成缩略图示例代码-附带Aspose.Cells和Aspose.Words插件 使用 Aspose.Cells 生成Excel缩略图 使用 Aspose.Words 生成Word缩略图 项目中 bin目录下的 Aspose.Cells.dll 和 Aspose.Words.dll 是可...
java程序开发中,将图片以缩略图形式展示,不错的资料,欢迎下载,共同学习
批量生成缩略图工具,可以限定最大宽度和最大高度,以最大的为准,可以自定义生成缩略图的后缀,方便实用
图片裁剪自动生成缩略图
一个php 使用ffmpeg 视频转换,截图,生成缩略图的类,附带使用例子。
功能:按照指定图片生成缩略图 包括函数和调用例子,很适用!
本文详细介绍在ASP.NET中上传图片并生成缩略图 在ASP.NET中上传图片并生成缩略图!
多图片上传-判断图片像素-生成缩略图 多图片上传-判断图片像素-生成缩略图
php生成缩略图多张不同缩略图例子,很好用