CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

如何提高.net生成的缩略图质量??求教高手

楼主chongachong(虫虫)2005-08-14 18:30:42 在 .NET技术 / ASP.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

相关问题

  • JAVA生成高质量缩略图问题,(百分问题)
  • 如何上传照片生成高质量的缩略图
  • 高分求救生成高质量缩略图!
  • 请问.net有没有生成缩略图的方法
  • 生成缩略图程序
  • 如何自动生成缩略图?(事先没有缩略图)
  • 如何自动生成缩略图?(事先没有缩略图)
  • 如何自动生成缩略图?(事先没有缩略图)
  • 生成缩略图出现问题,缩略图无法显示
  • ASP怎样生成缩略图

关键词

  • .net
  • gdi+
  • 函数
  • directx
  • 质量
  • 略图
  • myp
  • drawing
  • 生成
  • encoderparameter

得分解答快速导航

  • 帖主:chongachong
  • cat_hsfz
  • gxboy
  • luck0235
  • zeusvenus
  • frank737
  • pwqzc
  • haolaiwu
  • camelials
  • smile9961
  • smile9961
  • wufeng0524
  • wufeng0524
  • jijl2001
  • haolaiwu
  • claus2001
  • codeangel
  • xlfrd
  • flyboy20
  • jijl2001
  • ckubinan
  • cat_hsfz
  • octopus1
  • share1011
  • lostfrog
  • cat_hsfz
  • cat_hsfz

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo