web网页按比例显示图片实现原理及js代码


Posted in Javascript onAugust 09, 2013

在动态站点上经常需要上传自己的图片,而这些图片的大小是未知的,在显示成缩略图的时候必须进行按比例的缩放才能美观地显示。以最近做的golf网站(http://www.changligolfsales.com)做例子。

该网站需要上传高尔夫产品图片,并以缩略图显示在列表上,站点服务器支持Asp,但不支持aspjpeg之类的生成缩略图组件,所以将上传的图片直接显示成缩略图,就需要按比例缩放了,前提是要获取图片的长宽,第一个想到的方法是在上传的时候通过ADODB.STREAM对象读取图片的长宽信息保存在数据库并在页面生成的时候读取出来计算比例。这个方法明显的缺点是显示每张图片都要在服务器读取数据并计算,消耗资源多了也加上了页面打开时延。
而第二个方法使用Javascript是将计算量转移到了客户端。

原理是在页面载入完成后(onload触发)在客户端使用Javascript读取每张图片的大小并进行缩放。

//将imageDest图片的大小按比例缩放,适合显示在宽W和高H的区域内 
function ResizeImage(imageDest, W, H) 
{ 
//显示框宽度W,高度H 
var image = new Image(); 
image.src = imageDest.src; 
if(image.width>0 && image.height>0) 
{ 
//比较纵横比 
if(image.width/image.height >= W/H)//相对显示框:宽>高 
{ 
if(image.width > W) //宽度大于显示框宽度W,应压缩高度 
{ 
imageDest.width = W; 
imageDest.height = (image.height*W)/image.width; 
} 
else //宽度少于或等于显示框宽度W,图片完全显示 
{ 
imageDest.width = image.width; 
imageDest.height = image.height; 
} 
} 
else//同理 
{ 
if(image.height > H) 
{ 
imageDest.height = H; 
imageDest.width = (image.width*H)/image.height; 
} 
else 
{ 
imageDest.width = image.width; 
imageDest.height = image.height; 
} 
} 
} 
}

以上函数对图片进行缩放。
golf网站的每张缩略图的id都设为imgProductItem,如:<img src="<%= imgPath %>" name="imgProductItem" width="150" height="113" border="0" id="imgProductItem" />,里面的150x113就是显示框的最大尺寸,因为处理函数必须在onload完成时运行,所以这里必须设置一定的大小,要不整个页面在载入图片过程中出现排版错乱,到运行了RsizeAllImageById才恢复正常。
添加一个批量操作的函数:
//将页面内所有指定id的图片按比例缩放 
function RsizeAllImageById(id, W, H) 
{ 
var imgs = document.getElementsByTagName("img"); 
for(var i=0; i<imgs.length; i++) 
{ 
if(imgs[i].id == id) 
{ 
ResizeImage(imgs[i], W, H); 
} 
} 
}

这样在页面的body添加
<body onload="javascript:init();">;在head区添加: <mce:script language="javascript"><!-- 
function init() 
{ 
RsizeAllImageById("imgProductItem", 150, 113); 
} 
// --></mce:script>

就可以将所有图片显示成缩略图了。
Javascript 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
js网页右下角提示框实例
Oct 14 Javascript
requireJS使用指南
Apr 27 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
Feb 03 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 Javascript
基于form-data请求格式详解
Oct 29 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 Javascript
微信小程序保存图片到相册权限设置
Apr 09 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
May 11 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 Javascript
html向js方法传递参数具体实现
Aug 08 #Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 #Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 #Javascript
Jquery chosen动态设置值实例介绍
Aug 08 #Javascript
extjs两个tbar问题探讨
Aug 08 #Javascript
JS实现随机数生成算法示例代码
Aug 08 #Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 #Javascript
You might like
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP里的单例类写法实例
2015/06/25 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
Knockout自定义绑定创建方法
2015/12/26 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
Python实现简单的代理服务器
2015/07/25 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
英国女性时尚品牌:Apricot
2018/12/04 全球购物
外企C语言笔试题
2013/11/10 面试题
电子商务专业个人的自我评价
2013/12/19 职场文书
书香家庭事迹材料
2014/05/09 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
尊师重教主题班会
2015/08/14 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
Redis高并发缓存架构性能优化
2022/05/15 Redis