Flash相册加载图片完毕等比缩放的类

每次做相册类的flash的时候,图片加载完毕之后都要写等比缩放的函数来处理加载图片。

今天又遇到了,也不知道哪根筋不对了,弄了十几分钟老是算法有错误。好好的一个美女图片被搞的惨不忍睹。所以写了这个类 直接放到我的as包里,以后不要再这么麻烦了。

贴一下,能用的朋友就用一用。看不上眼的也不要拍砖啊。

下边是代码及注释说明:

/*
  等比缩放
  as1984 - qq:38657783
  20091221
  请注意包路径,我的as包都放在tools目录下。所以包的路径是 tools
  如果你的路径不一样,请注意修改
*/
package tools
{
    public class imgzoom {
        
        // 变量声明
        private var isZoom:Boolean;//是否缩放
        private var srcWidth:Number;//原始宽
        private var srcHeight:Number;//原始高
        private var maxWidth:Number;//限制宽
        private var maxHeight:Number;//限制高
        private var newWidth:Number;//新宽
        private var newHeight:Number;//新高
        
        public function imgzoom(srcWidth:Number,srcHeight:Number,maxWidth:Number,maxHeight:Number):
void
        {
            this.srcWidth=srcWidth;//获得原始宽度
            this.srcHeight=srcHeight;//获得原始高度
            this.maxWidth=maxWidth;//获得限定宽度
            this.maxHeight=maxHeight;//获得限定高度
            if(this.srcWidth>0 && this.srcWidth>0){//检查图片高度是否正常
                this.isZoom=true;//高宽正常,执行缩放处理
            }else{
                this.isZoom=false;//不正常,返回0
            }
            conductimg();//执行缩放算法
        }
        public function width():Number{//返回处理后的宽度,精确到2个小数点
            return Number(this.newWidth.toFixed(2));
        }
        public function height():Number{//返回处理后的高度,精确到2个小数点
            return Number(this.newHeight.toFixed(2));
        }
        private function conductimg():void{
            if(this.isZoom){//如果高宽正常,开始计算
                if(this.srcWidth/this.srcHeight>=this.maxWidth/this.maxHeight){
                                       //比较高宽比例,确定以宽或者是高为基准进行计算。
                    if(this.srcWidth>this.maxWidth){//以宽为基准开始计算,
                                                //当宽度大于限定宽度,开始缩放
                        this.newWidth=this.maxWidth;
                        this.newHeight=(this.srcHeight*this.maxWidth)/this.srcWidth
                    }else{
                                                //当宽度小于限定宽度,直接返回原始数值。
                        this.newWidth=this.srcWidth;
                        this.newHeight=this.srcHeight;
                    }
                }else{
                    if(this.srcHeight>this.maxHeight){//以高为基准,进行计算
                                                //当高度大于限定高度,开始缩放。
                        this.newHeight=this.maxHeight;
                        this.newWidth=(this.srcWidth*this.maxHeight)/this.srcHeight
                    }else{
                                                //当高度小于限定高度,直接返回原始数值。
                        this.newWidth=this.srcWidth;
                        this.newHeight=this.srcHeight;
                    }
                }
            }else{//不正常,返回0
                this.newWidth=0;
                this.newHeight=0;
            }
        }
    }
}

应用范例:

import tools.imgzoom;
函数 当加载完毕时{
                        var t:Sprite=new Sprite();
            var w:Number=685;//限定的宽度
            var h:Number=450;//限定的高度
                        var t:Sprite=new Sprite();//造个东西准备装图片
            var myZoom:imgzoom=new imgzoom(e.target.content.width,e.target.content.height,w,h);//实例化算法
            e.target.content.width=myZoom.width();//把加载过来的东西宽度弄了
            e.target.content.height=myZoom.height();//把加载过来的东西高度弄了
            t.addChild(e.target.content);//加入t的显示列表
            
}

文件下载:imgzoom.rar

建议用bitmapdata结合matrix来处理这个问题,直接得出需要显示的那块图像数据(更节约资源),可以不用频繁设置坐标和缩放,代码量也会少很多。

贴出关键代码:

              public static function getZoomDraw(targetisplayObject, tarW:int, tarH:int,full:Boolean=true):BitmapData {
                     //获取显示对象矩形范围
                     var rect:Rectangle = target.getBounds(target);
                     //计算出应当缩放的比例
                     var perw = tarW / rect.width;
                     var perh = tarH / rect.height;
                     var scale = full?((perw <= perh)?perwerh)(perw <= perh)?perherw);
                     //计算缩放后与规定尺寸之间的偏移量
                     var offerW = (tarW - rect.width * scale) / 2;
                     var offerH = (tarH - rect.height * scale) / 2;
                     //开始绘制快照(这里透明参数是false,是方便观察效果,实际应用可改为true)
                     var bmd:BitmapData = new BitmapData(tarW, tarH, false, 0);
                     var matrix:Matrix = new Matrix();
                     matrix.scale(scale, scale);
                     matrix.translate( offerW, offerH);
                     bmd.draw(target, matrix);
                     //如果是bitmap对象,释放位图资源
                     if (target is Bitmap)   (target as Bitmap).bitmapData.dispose();
                     //返回截图数据
                     return bmd;
              }
源文件实例:zoom.rar

时间: 2024-11-03 21:17:38

Flash相册加载图片完毕等比缩放的类的相关文章

Flash相册加载图片完毕等比缩放的类代码

代码及注释说明: /*   等比缩放   as1984 - qq:38657783   20091221   请注意包路径,我的as包都放在tools目录下.所以包的路径是 tools   如果你的路径不一样,请注意修改 */ package tools {     public class imgzoom {                  // 变量声明         private var isZoom:Boolean;//是否缩放         private var srcWid

flash用加载图片来填充mc实现代码

 代码如下 复制代码 填充某个mc ------------*/ import flash.display.BitmapData; import flash.geom.*; //画矩形 function createRectangle(x:Number, y:Number, w:Number, h:Number, mc:MovieClip) {  mc.moveTo(x, y);  mc.lineTo(x+w, y);  mc.lineTo(x+w, y+h);  mc.lineTo(x, y+

CSS3轻松实现瀑布流布局与无限加载图片相册的教程

目录 一.pic1.html页面代码如下: 二.模拟数据库数据的实体类Photoes.cs代码如下: 三.服务器返回数据给客户端的一般处理程序Handler1.ashx代码如下: 四.示例下载: 五.了解更多瀑布流布局的的知识 首先给大家看一下瀑布流布局与无限加载图片相册效果图: 一.pic1.html页面代码如下: <!DOCTYPE html> <html> <head>     <metacharset="UTF-8">     &

iOS开发中用imageIO渐进加载图片及获取exif的方法_IOS

imageIO完成渐进加载图片 一.常见渐进加载图片模式   目前我们看到的渐进加载主要有以下三种实现方式:   1)  依次从web上加载不同尺寸的图片,从小到大.最开始先拉取一个小缩略图做拉伸显示,然后拉取中等规格的图,拉取完毕直接覆盖显示,最后拉取原图,拉取完成后显示原图.   2)直接从web上拉取最大的图片,每接受一点儿数据就显示一点儿图片,这样就会实现从上到下一点点刷新出来的效果.   3)结合第1种和第2种,先拉取一个缩略图做拉伸显示,然后采用第二种方法直接拉取原图,这样即可以实现

Flash中加载影片时,Loading的位置对影片的影响

loading|加载 在论坛经常看到Loading加载方式的探讨,不过大多都是讨论用何种加载方法及代码,今天我想对Flash中加载影片时,Loading的位置对影片的影响.Flash Loading有多种制作及加载方式,本文研究的重点是讨论主影片中加载外部swf文件时Loading的位置对影片的影响.也就是将Loading写在主影片内部还是被加载影片中.     首先从缓存进行考虑,由于浏览器可以缓存Flash文件,因此Loading放在主影片内部,或者被加载影片中都没有影响,浏览器第一次会自动

网页前端优化之滚动延时加载图片示例

做web开发的朋友都应该掌握前端优化这个技巧,其中一个就是滚动延时加载.这个技巧应用在了很多地方,比如新浪微博网页版.以下就为大家详细介绍,需要的朋友可以参考下   为什么要延时加载呢?页面加载的时候就显示全部的图片不就得了?有必要多此一举吗?答案是肯定的.当要加载的图片或者内容很多时,如果一次性加载完 毕,那么整个页面将会加载很久,意味着要用户等待很久,这是对用户不友好的.或许你还会问,那不就做个分页不就得了?其实这种滚动延时加载的技巧正是用来 代替手动点击下一页的分页技术.每换一页都要用户点

jQuery滚动加载图片实现原理_jquery

本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载? 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来.这就是图片懒加载. 二.为什要使用这个技术? 比如一个页面中有很多图片,如淘宝.京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的

flash 同步加载多个外部swf的方法

flash 同步加载多个外部swf的方法 //参数分别是文件数量,起点x,起点y,宽度比例,高度比例,排列间距.   //注意外部文件分别为0.swf,1.swf,2.swf.........递增的,其实稍微改下,加载图片也一样 function manyloadmovie(num, x, y, xscal, yscal, dis) {   for (var i = 0; i<num; i++) {   var temp = createemptymovieclip("temp"

javascript顺序加载图片的方法_javascript技巧

本文实例讲述了javascript顺序加载图片的方法.分享给大家供大家参考.具体如下: javascript监听一个图片是否加载完毕 如果加载完成再加载下一张,不是一次性从服务器加载 减少服务器压力, 可用到的地方:比如制作类似google地图的应用,可以使小图一张一张的加载 function Load_pic(arr){ this.loop_f=function(i,o_file,len,f,obj){ if(i<len-1){ i=i+1; f(i,o_file,len,obj); } };