每次做相冊(cè)類(lèi)的flash的時(shí)候,圖片加載完畢之后都要寫(xiě)等比縮放的函數(shù)來(lái)處理加載圖片。
今天又遇到了,也不知道哪根筋不對(duì)了,弄了十幾分鐘老是算法有錯(cuò)誤。好好的一個(gè)美女圖片被搞的慘不忍睹。所以寫(xiě)了這個(gè)類(lèi) 直接放到我的as包里,以后不要再這么麻煩了。
貼一下,能用的朋友就用一用。看不上眼的也不要拍磚啊。
下邊是代碼及注釋說(shuō)明:
/* 等比縮放 as1984 - qq:38657783 20091221 請(qǐng)注意包路徑,我的as包都放在tools目錄下。所以包的路徑是 tools 如果你的路徑不一樣,請(qǐng)注意修改 */ 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;//高寬正常,執(zhí)行縮放處理 }else{ this.isZoom=false;//不正常,返回0 } conductimg();//執(zhí)行縮放算法 } public function width():Number{//返回處理后的寬度,精確到2個(gè)小數(shù)點(diǎn) return Number(this.newWidth.toFixed(2)); } public function height():Number{//返回處理后的高度,精確到2個(gè)小數(shù)點(diǎn) return Number(this.newHeight.toFixed(2)); } private function conductimg():void{ if(this.isZoom){//如果高寬正常,開(kāi)始計(jì)算 if(this.srcWidth/this.srcHeight>=this.maxWidth/this.maxHeight){ //比較高寬比例,確定以寬或者是高為基準(zhǔn)進(jìn)行計(jì)算。 if(this.srcWidth>this.maxWidth){//以寬為基準(zhǔn)開(kāi)始計(jì)算, //當(dāng)寬度大于限定寬度,開(kāi)始縮放 this.newWidth=this.maxWidth; this.newHeight=(this.srcHeight*this.maxWidth)/this.srcWidth }else{ //當(dāng)寬度小于限定寬度,直接返回原始數(shù)值。 this.newWidth=this.srcWidth; this.newHeight=this.srcHeight; } }else{ if(this.srcHeight>this.maxHeight){//以高為基準(zhǔn),進(jìn)行計(jì)算 //當(dāng)高度大于限定高度,開(kāi)始縮放。 this.newHeight=this.maxHeight; this.newWidth=(this.srcWidth*this.maxHeight)/this.srcHeight }else{ //當(dāng)高度小于限定高度,直接返回原始數(shù)值。 this.newWidth=this.srcWidth; this.newHeight=this.srcHeight; } } }else{//不正常,返回0 this.newWidth=0; this.newHeight=0; } } } }
應(yīng)用范例
import tools.imgzoom; 函數(shù) 當(dāng)加載完畢時(shí){ var t:Sprite=new Sprite(); var w:Number=685;//限定的寬度 var h:Number=450;//限定的高度 var t:Sprite=new Sprite();//造個(gè)東西準(zhǔn)備裝圖片 var myZoom:imgzoom=new imgzoom(e.target.content.width,e.target.content.height,w,h);//實(shí)例化算法 e.target.content.width=myZoom.width();//把加載過(guò)來(lái)的東西寬度弄了 e.target.content.height=myZoom.height();//把加載過(guò)來(lái)的東西高度弄了 t.addChild(e.target.content);//加入t的顯示列表 }
文件下載:imgzoom.rar
建議用bitmapdata結(jié)合matrix來(lái)處理這個(gè)問(wèn)題,直接得出需要顯示的那塊圖像數(shù)據(jù)(更節(jié)約資源),可以不用頻繁設(shè)置坐標(biāo)和縮放,代碼量也會(huì)少很多。
貼出關(guān)鍵代碼:
public static function getZoomDraw(targetisplayObject, tarW:int, tarH:int,full:Boolean=true):BitmapData { //獲取顯示對(duì)象矩形范圍 var rect:Rectangle = target.getBounds(target); //計(jì)算出應(yīng)當(dāng)縮放的比例 var perw = tarW / rect.width; var perh = tarH / rect.height; var scale = full?((perw <= perh)?perwerh)(perw <= perh)?perherw); //計(jì)算縮放后與規(guī)定尺寸之間的偏移量 var offerW = (tarW - rect.width * scale) / 2; var offerH = (tarH - rect.height * scale) / 2; //開(kāi)始繪制快照(這里透明參數(shù)是false,是方便觀察效果,實(shí)際應(yīng)用可改為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對(duì)象,釋放位圖資源 if (target is Bitmap) (target as Bitmap).bitmapData.dispose(); //返回截圖數(shù)據(jù) return bmd; }
源文件實(shí)例:zoom.rar
經(jīng)典論壇交流: http://bbs.blueidea.com/thread-2963140-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2009/7290.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|