如何提高.net生成的缩略图质量??求教高手
ASP.Net生成缩略图后,质量失真太严重了,也许这是.Net的一个遗憾。
大家都是如何保证生成缩略图后的图片质量呢?
请教高手,也恳请大家讨论一下
顶者有分~~
问题点数:100、回复次数:31Top
1 楼adandelion(水源是CSDN最黑的地方,但这个最黑是CSDN一手制造的!)回复于 2005-08-14 18:34:44 得分 0
GZTop
2 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-08-14 23:46:10 得分 10
这个应该是GDI+的问题啦,或许自己封装一个组件调用非托管的GDI+接口能够解决,再不行就调用DirectX咯,DirectX保证没问题!(用DirectX的话,图片缩放能够达到类似3D贴图那种质量)Top
3 楼gxboy(Blin 小学生学.NET)回复于 2005-08-14 23:55:36 得分 10
Sub UploadFile(sender As Object, e As EventArgs)
'--------------------------------------------------------------------------------------
Dim MyFileColl As HttpFileCollection = Request.Files
Dim MyPostedFile As HttpPostedFile = MyFileColl.Item(0)
Dim image,anewimage As System.Drawing.Image
Dim myp As New System.Drawing.Imaging.EncoderParameters(1)
Dim callb As System.Drawing.Image.GetThumbnailImageAbort
'--------------------------------------------------------------------------------------
If LCase(MyPostedFile.ContentType.ToString()).IndexOf("image") < 0 Then
Response.Write("无效的图形格式")
Exit Sub
ElseIf MyPostedFile.ContentLength > 200000 Then
Response.Write("图片数据不能超过2M")
Exit Sub
End If
FileUp.PostedFile.SaveAs(Server.MapPath("/images/shopimages/big/") & filename)
'---------------------------------------------------------------------------------------
image=System.Drawing.Image.FromFile(Server.MapPath("/images/shopimages/big/") & filename)
aNewImage=image.GetThumbnailImage(80,80,callb,new System.IntPtr())
myp.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90)
Dim encoder, encoders() As System.Drawing.Imaging.ImageCodecInfo
encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
For Each encoder In encoders
If encoder.MimeType = "image/jpeg" Then
anewimage.Save(Server.MapPath("/images/shopimages/small/") & filename, encoder, myp)
Exit For
End If
Next
myp.Dispose()
myp = Nothing
image.Dispose()
anewimage.Dispose()
adminuser.shop_addimage(id,filename)
Response.Redirect("shop_addimagewin.aspx?filename=" & filename)
Response.End
End SubTop
4 楼luck0235(风平浪静时人人都能掌舵)回复于 2005-08-15 02:55:20 得分 1
这个不太明白楼主说的是生成怎样的缩略图,如果一张图片原始大小是30 x 30 px的,但你缩略后要让它显示为300 x 300 px,那它肯定不会清析,即使用Photoshop、CorelDraw这类强大的图形处理软件也做不到让它不失真,除非它是矢量图。
而把大图缩小只要按原始比例,一般它就不会严重失真,缩放时利用.net里的类对它的长宽作一定控制不就行了。
不知楼主是怎样的情况?愿闻其详。Top
5 楼zeusvenus()回复于 2005-08-15 07:31:47 得分 1
矢量图。Top
6 楼frank737(陈员外-管理软件开发-http://landian.cq.cn)回复于 2005-08-15 07:40:37 得分 1
对这个问题我是感同身受,想了若干办法,最终没有实现。Top
7 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-08-15 08:40:19 得分 1
汗
希望有高手帮忙解决Top
8 楼haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴)回复于 2005-08-15 08:42:25 得分 1
看来这个需要用非托管下的指针对图象内部信息进行像素的计算Top
9 楼camelials(星期五)回复于 2005-08-15 08:45:56 得分 10
Graphics g2 = Graphics.FromImage( MyOrBitmap );
g2.InterpolationMode=System.Drawing.Drawing2D.InterpolationMode.High;
g2.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;Top
10 楼smile9961(good life)回复于 2005-08-15 09:06:40 得分 1
这个问题有意思,关注!Top
11 楼smile9961(good life)回复于 2005-08-15 09:07:52 得分 1
cat_hsfz可否具体说说如何调用DirectX实现?
Top
12 楼wufeng0524(高处不胜寒)回复于 2005-08-15 09:27:10 得分 10
没有找到特别好的方法,只能说,尽可能清晰。前段写了一份源码,转换jpg效果不错,但gif就不尽人意。可能对你有所帮助,到DotNet中华网:www.aspxcn.org源代码栏目下载吧!Top
13 楼wufeng0524(高处不胜寒)回复于 2005-08-15 09:27:56 得分 1
对了,那份代码附带缩小,裁减功能。。。Top
14 楼jijl2001(jijl2001)回复于 2005-08-15 09:29:35 得分 1
我觉得还行啦,没有什么失真啊Top
15 楼haolaiwu(宁愿相信世界上有鬼,也不相信女人那张嘴)回复于 2005-08-15 09:35:12 得分 1
你在B/S下调用DirectX??
感觉不是很现实!!Top
16 楼claus2001(古风)回复于 2005-08-15 09:46:55 得分 1
gzTop
17 楼codeangel(http://www.wSoft.Net)回复于 2005-08-15 09:55:11 得分 1
关注Top
18 楼connection999()回复于 2005-08-15 10:19:37 得分 0
eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,
能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm
方成eform自定义表单平台,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.
Top
19 楼xlfrd(显亮.net)回复于 2005-08-15 10:29:59 得分 1
我用gxboy(Blin 小学生学.NET) 的方法为什么提示“无效参数”?
System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image oImg2=oImg.GetThumbnailImage(Width,Height,myCallback,new System.IntPtr());
EncoderParameters myp=new EncoderParameters(1);
myp.Param[0]=new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90);
ImageCodecInfo[] encoders=ImageCodecInfo.GetImageEncoders();
foreach(ImageCodecInfo encoder in encoders)
{
if(encoder.MimeType=="image/jpeg")
{
oImg2.Save(MapPath("")+"/"+strpath,encoder,myp);
break;
}
}Top
20 楼flyboy20(往事如烟)回复于 2005-08-15 11:03:00 得分 1
不错,继续关注Top
21 楼jijl2001(jijl2001)回复于 2005-08-15 11:11:04 得分 10
按比例缩小如何
Bitmap bmp = new Bitmap(文件名);
float scale = 150.0f / System.Math.Max(bmp.Height, bmp.Width);
System.Drawing.Image thumb = bmp.GetThumbnailImage((int)(bmp.Width * scale), (int)(bmp.Height * scale), null, System.IntPtr.Zero);
thumb.Save(Context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose();
thumb.Dispose();Top
22 楼ckubinan(蓝天)回复于 2005-08-15 11:36:46 得分 10
真是不好意思,获取源图片的缩略图时的宽高是有限制的.否则,就会出现失真现象. 另外,缩略图嘛,不就是那么个大小吗? 干嘛要把它放那么大呢? 如果你想要那么大的图片还不如用源图呢! 其实,上面有几段代码是完全没有问题的!
System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
注意:ThumbnailCallback 是个永远返回false的函数啦,内部不用写任何代码, 搞个 return false; 就OK啦, 但这个函数不能少哟!Top
23 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-08-15 11:52:22 得分 10
.NET下如果在保存时能够好像photoshop那样选择jpeg压缩率多少、gif采样颜色多少压缩率等参数的话,事情就会好很多。
我仅仅知道非托管GDI+和DirectX都有一些包含"blt"字样的函数(我以前用DirectDraw7贴图时用的是BltFast()函数),其实就是贴图函数,能够把一个Surface(DirectDraw7里面叫做Surface,不知道现在DirectDraw和Direct3D合并为DirectGraphic后叫做什么,相当于GDI+的Graphics)中一个Rectangle剪裁出来贴到目标Surface的另一个Rectangle区域,如果你做缩略图的话那么这两个Rectangle就当然是指整个Surface大小啦。然后DirectX会自动为你处理缩放过程,例如很多颜色的平滑处理,它这个颜色处理不仅仅是线性插值这么简单的,例如你做一张2*1的bmp左边是蓝色像素右边是绿色像素,然后把它渲染到全屏(也就是把一个2*1的Surface整个BltFast到1028*768的屏幕Surface上),那么你看到屏幕中间并非蓝色到绿色的过渡色,而是可能会插入第三种颜色(好像是黄色吧)作为蓝色和绿色的平滑过渡。
非托管GDI+好像也有一个Blt()函数,功能也是Rectangle到Rectangle的点到点复制,但是对于缩放效果如何我就不知道了。Top
24 楼octopus1(章鱼)回复于 2005-08-15 12:00:48 得分 1
这个不太明白楼主说的是生成怎样的缩略图,如果一张图片原始大小是30 x 30 px的,但你缩略后要让它显示为300 x 300 px,那它肯定不会清析,即使用Photoshop、CorelDraw这类强大的图形处理软件也做不到让它不失真,除非它是矢量图。Top
25 楼share1011(不知道)回复于 2005-08-15 12:04:32 得分 1
hehe,看看Top
26 楼lostfrog(青蛙非王子)回复于 2005-08-15 13:18:04 得分 1
按比例缩图Top
27 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-08-16 14:46:47 得分 3
楼主又没有说要放大,我举例放大仅仅是为了说明DirectX在这方面的能力,说明它在缩放方面是按照3D贴图的标准来做的,无论是何种变形它都尽量让图片保持高度真实感。Top
28 楼chongachong(虫虫)回复于 2005-08-16 20:16:26 得分 0
感谢大家的发言,我的意思当然是缩小的意思,缩略嘛,就是把原图保存的同时,生成小图,用于显示,可是我试了好多方法,还是不够理想。
很多图片是gif格式的,有没有不转化成JPG的方法呢?Top
29 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2005-08-17 15:21:51 得分 10
问题应该是在GDI+的保存引擎上,因为它不是专业的绘图库,所以选择保存为压缩格式时就好像用Windows自带的“画图”保存一样丑陋。或许以后会有人做专门的.NET绘图库,让保存功能能够达到Photoshop级别的。Top
30 楼coley(唉~眼镜又厚了~)回复于 2006-03-27 15:19:14 得分 0
呵呵。总有第一次的~~Top
31 楼Fooo(四月·来也勿勿·去也冲冲)回复于 2006-04-25 02:04:22 得分 0
学习Top




