`
sony-soft
  • 浏览: 1021797 次
文章分类
社区版块
存档分类
最新评论

生成缩略图

 
阅读更多
关于生成缩略图的做法,网上搜了一下,大多数都是采用如下的做法:
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次,就是没发现哪里出现问题,就在要放弃的时候,才发现原来出现不可原谅的错误:文件保存的路径不对!当场狂凑了自己一顿!把路径改过来之后果然那鬼门关顺利的通过,生成渴望已久的缩略图.(^_^)

以下是几种方法得到的不同效果,当然最模糊的就是第一种啦!test

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics