生成整齐,美观的缩略图

需求:电子商务中有大量的图片要丰前台显示,而这些图片大部分由客户自己上传,图片的规格也是多种多样(主要择时纵横比例)。怎样让这些图片在前台整齐且美观的显示呢?

目的:整齐:固定纵横比例;美观:图片不变型,也就是按比例缩放。

假设:假如我们要在前台的一个Div(别名:相框)中放一张图(别名:图A),相框的宽度为120px,高度为:90px。而图A的原图的宽度为为1414px,高度为:886px.
显然相框与图A的原图的比例不一致。为了整齐且美观,我们希望将图A处理成56*96.然后把她居中的放在相框(120*90)中。

方案:我们采用.net技术,通过GDI操作图片:

实施:不想多说(相信博友们都应该看得懂)先贴出我的图像处理类(注释还算清楚):

using System;
using System.Drawing;
using System.IO;

namespace Ants.Tools
{
    
public class Image
    
{
        
属性

        
private bool ThumbnailCallBack()//GDI+委托
        {
            
return false;
        }

        
/// <summary>
        
/// 缩略图片的函数
        
/// </summary>
        
/// <param name="OK">用来判断转换是否成功</param>
        
/// <returns>处理好的图片缩略图放入内存中</returns>

        public MemoryStream getThumb(out bool OK)
        
{
            OK
=false;
            
int X, Y;
            System.Drawing.Image myThumbnail 
= null;
            
try
            
{
                Bitmap myBitmap 
= new Bitmap(Path);
                X 
= myBitmap.Width;
                Y 
= myBitmap.Height;
                
decimal a = (decimal)X / (decimal)Y;//原图片的比例
                decimal b = (decimal)Width / (decimal)Height;//相框的比例
                System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallBack);
                
                
int newheight, newwidth;
                
if (b > a)
                
{
                    newheight 
= Height;
                    newwidth 
=(intdecimal.Round(newheight * a,0,MidpointRounding.AwayFromZero);
                }

                
else
                
{
                    newwidth 
= Width;
                    newheight 
= (int)decimal.Round(Width / a, 0, MidpointRounding.AwayFromZero);

                }

                myThumbnail 
= myBitmap.GetThumbnailImage(newwidth, newheight, myCallBack, IntPtr.Zero);//生成缩略图
               OK=true;
               myBitmap.Dispose();               
            }

            
catch
            
{
                OK
= false;
            }

            System.IO.MemoryStream ms 
= new System.IO.MemoryStream();
            myThumbnail.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
          
            
return ms;
        }

    }

}


如何应用此类呢?还是贴代码:
1.新建一个aspx页面,放一个<img>标签
代码如下:

Code


2.再建一个ashx文件
代码如下:

Code


生成的效果如下

那张图和比例也太过分啦。呵呵...,欢迎


原创文字只代表本人某一时间内的观点或结论,本人不对涉及到的任何代码担保。转载请标明出处!

支持我请点击上方广告,谢谢^0^
Tag标签: asp.net,GDI+,Image
posted @ 2008-06-27 12:06 Ants 阅读(3740) 评论(34)  编辑 收藏 网摘 所属分类: asp.net

  回复  引用  查看    
#1楼2008-06-27 12:10 | dudu      
节省首页空间,人人有责。
摘要中建议使用一张图片。

  回复  引用  查看    
#2楼[楼主]2008-06-27 12:12 | Ants      
@dudu
好的。。我马上处理。不好意思。

  回复  引用  查看    
#3楼2008-06-27 12:39 | BZZ      
路过
  回复  引用  查看    
#4楼2008-06-27 13:01 | 石牌村夫      
能不能达到那样的效果啊,就是图片可能让用户自己来操作比如裁图片,而这张图片还可以点击按纽可变大变小
  回复  引用  查看    
#5楼[楼主]2008-06-27 14:06 | Ants      
@石牌村夫
可以, 大小可以用属性来控件,裁图片的话,要通过GDI+进一步编程。
太复杂的功能,还不如用图片处理软件啦

  回复  引用  查看    
#6楼2008-06-27 14:09 | 探索之鸟      
怎么我编译类文件时会出现

编译器错误信息: CS0501: “Ants.Tools.Image.Width.get”必须声明主体,因为它未标记为 abstract 或 extern

源错误:



行 11: /// 相框的宽度
行 12: /// </summary>
行 13: public int Width { get; set; }
行 14: /**//// <summary>
行 15: /// 相框的高度


  回复  引用  查看    
#7楼[楼主]2008-06-27 14:14 | Ants      
@探索之鸟
自动属性要.net3.5的支持,如果你用的是2.0的话
你改成这样吧:private int _width ;
public int Width
{
get{return _width};
set{_width = value};
}
下面Height属性也一样。

  回复  引用  查看    
#8楼2008-06-27 14:20 | 探索之鸟      
你的是3.0的写法 自动实现的属性 我的2.0环境所以报错了
  回复  引用    
#9楼2008-06-27 14:25 | allies[未注册用户]
我想问下现在的有些 数码图都10M左右的~ 你这样读图片 如果有大量的图这样似乎不妥吧...
  回复  引用  查看    
#10楼[楼主]2008-06-27 14:29 | Ants      
@allies
那我们可以在上传的时候用这个类将缩略的图保存下来,意思就是相当于保存一个原图的缩略副本。
在这个例子中,图像被保存在内存中,,当然 我们也可以保存为文件的形式。

  回复  引用  查看    
#11楼[楼主]2008-06-27 14:37 | Ants      
完全正确。
  回复  引用  查看    
#12楼2008-06-27 14:41 | 探索之鸟      
本人不才 再问lz个问题
System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallBack);

这个回调 意欲何为?

  回复  引用  查看    
#13楼[楼主]2008-06-27 14:45 | Ants      
@探索之鸟
这个是GDI+编程用到的,实际意义不大,但是又不能缺少。具体有什么作用,我也不太清楚,不好意思。

  回复  引用  查看    
#14楼2008-06-27 15:24 | 石牌村夫      
@Ants
问题就是客户想在网页上实现这个功能啊,可总感觉自己的能力还达不到这一步,所以这个项目就有这样一个难点在这里了

  回复  引用    
#15楼2008-06-27 15:30 | leleroyn[未注册用户]
@石牌村夫
点击按纽可变大变小 可以用JS来做,
到于裁图应该不好处理。

  回复  引用  查看    
#16楼2008-06-27 15:35 | 石牌村夫      
@leleroyn
裁图的话我就找到一个控件可以搞定了,问题是这个点击按纽变大变小,这个按纽是放在图片上的,如何去变呢?不太懂

  回复  引用    
#17楼2008-06-27 15:37 | 我是笨小子[未注册用户]
请问一般网站要显示图片也这样吗?

是上传时 这样 处理然后保存

还是像 楼主这样 访问时这样操作呢?

  回复  引用    
#18楼2008-06-27 15:41 | 我是笨小子[未注册用户]
还有请问

为什么Handler1 继承与 IHttpHandler 后实例是就会默认调用ProcessRequest方法呢

  回复  引用  查看    
#19楼[楼主]2008-06-27 15:47 | Ants      
--引用--------------------------------------------------
我是笨小子: 请问一般网站要显示图片也这样吗?

是上传时 这样 处理然后保存

还是像 楼主这样 访问时这样操作呢?
--------------------------------------------------------
这得看你网站的需求,如果一个网站图片很多,并且又要在前台显示很多,那最好是上传时处理,生成副本,
如果前台显示的图片不多,可考虑显示时处理。
当然也可以综合考虑这两种方式 。

  回复  引用  查看    
#20楼[楼主]2008-06-27 15:49 | Ants      
--引用--------------------------------------------------
我是笨小子: 还有请问

为什么Handler1 继承与 IHttpHandler 后实例是就会默认调用ProcessRequest方法呢
--------------------------------------------------------
这就是一般应用程序的特点啦,它不会像aspx页面一样,走完整个生命周期。
因此他的性能比page页面好。

  回复  引用  查看    
#21楼[楼主]2008-06-27 15:51 | Ants      
@石牌村夫
用javascript动态改变图像显示的大小。

  回复  引用    
#22楼2008-06-27 15:54 | 我是笨小子[未注册用户]
哦 原来是这样 谢谢楼主!
  回复  引用  查看    
#23楼2008-06-27 16:24 | 王孟军!      
呵呵,感觉不错
弄张美女照片更好

  回复  引用  查看    
#24楼2008-06-27 17:10 | nicye      
不喜欢请求时处理文件大小
  回复  引用  查看    
#25楼2008-06-27 17:31 | 石牌村夫      
@Ants
楼主,能加下我的MSN吗?我还要些疑问想线上请教
msn:gaozhong98#hotmail.com

多谢

  回复  引用  查看    
#26楼2008-06-27 17:38 | S.Sams      


其实算法应该再改进一下, 看第一张图两边是空的,  在做比例缩放时应该按适应的比例, 如这张可以取其宽度达到预置值即可, 再根据 120*90 做截取, 这样图片在视觉效果上比较完美.



  回复  引用    
#27楼2008-06-27 17:39 | leleroyn[未注册用户]
--引用--------------------------------------------------
石牌村夫: @Ants
楼主,能加下我的MSN吗?我还要些疑问想线上请教
msn:gaozhong98#hotmail.com

多谢
--------------------------------------------------------
你加我QQ:260717774
我平时一般不上MSN
或者你用G-talk和我联系
Email:leleroyn#gmail.com

  回复  引用    
#28楼2008-06-27 17:41 | leleroyn[未注册用户]
--引用--------------------------------------------------
S.Sams:
其实算法应该再改进一下, 看第一张图两边是空的,&nbsp; 在做比例缩放时应该按适应的比例, 如这张可以取其宽度达到预置值即可, 再根据 120*90 做截取, 这样图片在视觉效果上比较完美.<br />
</font>

--------------------------------------------------------
截取客户可能并不愿意。

  回复  引用    
#29楼2008-06-27 17:45 | 小于儿[未注册用户]
@石牌村夫
您可以试试,用js获取图片属性
然后用可拖动层来确定图片区域,

后台代码用gdi+对图片进行剪裁

  回复  引用  查看    
#30楼2008-06-28 09:01 | 石牌村夫      
@leleroyn
已加,多谢

  回复  引用    
#31楼2008-06-28 10:20 | 磊哥[未注册用户]
尺寸调到400时
生成的缩略图略显模糊
......

  回复  引用  查看    
#32楼2008-06-29 10:11 | Superstone      
这个似乎有点简单。。。
  回复  引用  查看    
#33楼[楼主]2008-06-29 12:44 | Ants      
@Superstone
不做评价,简单与复杂是相对的~兄弟。

  回复  引用  查看    
#34楼2009-01-20 14:12 | zmxmiss      
还不错 我用的就是这个 用着有点问题 生成的图片的清晰度不行, 但是我对GDI+ 不熟练 不知道如何下手 ,请楼主指点哈



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1231039




相关文章:

相关链接:

公告

本blog原创文字(标题中不含[转])只代表本人某一时间内的观点或结论,与本人所在公司没有任何关系。第三方若用于商业用途的转载,须取得本人授权。一般的引用、转载请标明出处!

自2008年6月11日起

free hit counter

网络电台:


联系方式:

QQ:260717774
Email:leleroyn#gmail.com(#换成@)
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

我参加的小组

最新评论

You cannot do that in LINQ. Serialization will have problem to serialize references, so when later i... (Hi)
哈哈,第二次来了 (yay)
@胜客财经在.net 3.5中有一个方法string[] str= new string[]{"lele","royn","Ants"};L... (leleroyn)
怎么没有 string[] --》 List<string> (胜客财经)
哈哈,支持!
我点我点我点点点! (·风信子·)
@ffsdf
无语,你这人。 (Ants)
垃圾代码 (ffsdf)
还不错 我用的就是这个 用着有点问题 生成的图片的清晰度不行, 但是我对GDI+ 不熟练 不知道如何下手 ,请楼主指点哈 (zmxmiss)
当然可以,360buy.com购物车是通过cookie实现的 (Ants)
能防止?搜索框右侧,鼠标移动上去自动显示购物车商品 (sendfen)