關鍵字: J2ME ?
????
????? 設計游戲的朋友經常會遇到對圖片資源的操作。今天瀏覽web發現此貼不錯。所以抄過這邊來
原文: www.linuxmine.com/45911.html
無論在midp1.0還是在
midp2.0中,系統都沒有給我們提供對圖片進行伸縮操作的api.但是其實我們只要在程序代碼中略施小計,就能達到這個效果,只是效果要比美術做出來
的圖片,呵呵,差多啦,同時也會造成性能損失。伸縮圖片的構造原理就是簡單沿x,y軸按比例放縮,比如說我們需要把一張16*16的png圖片轉化成一張
32*32的圖片,那么我們可以先對該圖片做一個水平方向上的拉伸操作,然后再把水平拉伸后的圖片按垂直方向再做一次拉伸操作。做拉伸操作時,比如水平方
向上,我們需要構造一張32*16的mutable Image,獲取其Graphics,利用該Graphics,繪制該mutable
Graphics的每一列像素,這一列像素就來自于原始圖片中的按比例對應的某一列像素。垂直方向上的拉伸操作也是如法炮制。因為是一種按比例的對應關
系,圖像的縮小操作也可按該辦法進行。
效果如下圖所示  原始圖片  圖片放大為全屏幕大小
 圖片縮小為原來的1/4大小
好了,我們來看代碼
java 代碼 ? ???1.??import?javax.microedition.lcdui.Graphics;?? ???2.?import?javax.microedition.lcdui.Image;?? ???3.??? ???4.?/**? ???5.?*?圖像工具類? ???6.?*?@author?Jagie? ???7.?*? ???8.?*/?? ???9.??? ??10.?public?class?ImageUtil?{?? ??11.??? ??12.?/**? ??13.?*?圖像放縮方法? ??14.?*?@param?srcImage?原始的Image對象? ??15.?*?@param?newW?放縮后的Image的寬度? ??16.?*?@param?newH?放縮后的Image的高度? ??17.?*?@return?放縮后的Image對象? ??18.?*/?? ??19.??? ??20.?public?static?final?Image?scale?(Image?srcImage,?int?newW,?int?newH)?{?? ??21.?int?srcW?=?srcImage.getWidth();?? ??22.?int?srcH?=?srcImage.getHeight();?? ??23.?//先做水平方向上的伸縮變換?? ??24.?Image?tmp?=?Image.createImage(newW,?srcH);?? ??25.?Graphics?g?=?tmp.getGraphics();?? ??26.??? ??27.?for?(int?x?=?0;?x?<?newW;?x++)?{?? ??28.?g.setClip(x,?0,?1,?srcH);?? ??29.?//按比例放縮?? ??30.?g.drawImage(srcImage,x-x*srcWnewW,0,Graphics.LEFT?|?Graphics.TOP);?? ??31.??? ??32.?}?? ??33.??? ??34.?//再做垂直方向上的伸縮變換?? ??35.?Image?dst?=?Image.createImage(newW,?newH);?? ??36.?g?=?dst.getGraphics();?? ??37.??? ??38.?for?(int?y?=?0;?y?<?newH;?y++)?{?? ??39.?g.setClip(0,?y,?newW,?1);?? ??40.?//按比例放縮?? ??41.?g.drawImage(tmp,0,y-y*srcHnewH,Graphics.LEFT?|?Graphics.TOP);?? ??42.??? ??43.?}?? ??44.??? ??45.?return?dst;?? ??46.?}?? ??47.??? ??48.??? ??49.?}?? ??50.??? ??51.?也許有同學會提出疑問,既然是按x,y方向按等比例放縮,那我寫成這樣豈不是代碼更簡潔:?? ??52.??? ??53.?public?static?final?Image?scale2(Image?srcImage,?int?newW,?int?newH)?{?? ??54.?int?srcW?=?srcImage.getWidth();?? ??55.?int?srcH?=?srcImage.getHeight();?? ??56.??? ??57.?Image?dst=Image.createImage(newW,newH);?? ??58.?Graphics?g=dst.getGraphics();?? ??59.?for?(int?x?=?0;?x?<?newW;?x++)?{?? ??60.?for?(int?y?=?0;?y?<?newH;?y++)?{?? ??61.?g.setClip(x,?y,?1,?1);?? ??62.?g.drawImage(srcImage,?x-x*srcWnewW,?y?-?y?*?srcH?/?newH,?Graphics.LEFT?? ??63.?|?Graphics.TOP);?? ??64.??? ??65.?}?? ??66.??? ??67.?}?? ??68.??? ??69.?return?dst;?? ??70.?}??
這種做法效果上和前者無異,但是并不可取,只要算算它的時間復雜度就知道,基本上是前者的平方。在我的機器上,做一次全屏幕的放縮操作,前者耗時60ms,而后者耗時7150ms。
其實上面的做法很簡單,以后有需求可以整理成一個控件,這樣就可以很方便的調用,與學習。
|