關(guān)鍵字: J2ME ?
????
????? 設(shè)計(jì)游戲的朋友經(jīng)常會(huì)遇到對(duì)圖片資源的操作。今天瀏覽web發(fā)現(xiàn)此貼不錯(cuò)。所以抄過這邊來原文:www.linuxmine.com/45911.html
無論在midp1.0還是在 midp2.0中,系統(tǒng)都沒有給我們提供對(duì)圖片進(jìn)行伸縮操作的api.但是其實(shí)我們只要在程序代碼中略施小計(jì),就能達(dá)到這個(gè)效果,只是效果要比美術(shù)做出來 的圖片,呵呵,差多啦,同時(shí)也會(huì)造成性能損失。伸縮圖片的構(gòu)造原理就是簡(jiǎn)單沿x,y軸按比例放縮,比如說我們需要把一張16*16的png圖片轉(zhuǎn)化成一張 32*32的圖片,那么我們可以先對(duì)該圖片做一個(gè)水平方向上的拉伸操作,然后再把水平拉伸后的圖片按垂直方向再做一次拉伸操作。做拉伸操作時(shí),比如水平方 向上,我們需要構(gòu)造一張32*16的mutable Image,獲取其Graphics,利用該Graphics,繪制該mutable Graphics的每一列像素,這一列像素就來自于原始圖片中的按比例對(duì)應(yīng)的某一列像素。垂直方向上的拉伸操作也是如法炮制。因?yàn)槭且环N按比例的對(duì)應(yīng)關(guān) 系,圖像的縮小操作也可按該辦法進(jìn)行。
效果如下圖所示



好了,我們來看代碼
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對(duì)象?
??15.?*?@param?newW?放縮后的Image的寬度?
??16.?*?@param?newH?放縮后的Image的高度?
??17.?*?@return?放縮后的Image對(duì)象?
??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.?也許有同學(xué)會(huì)提出疑問,既然是按x,y方向按等比例放縮,那我寫成這樣豈不是代碼更簡(jiǎn)潔:??
??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.?}??
???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對(duì)象?
??15.?*?@param?newW?放縮后的Image的寬度?
??16.?*?@param?newH?放縮后的Image的高度?
??17.?*?@return?放縮后的Image對(duì)象?
??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.?也許有同學(xué)會(huì)提出疑問,既然是按x,y方向按等比例放縮,那我寫成這樣豈不是代碼更簡(jiǎn)潔:??
??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.?}??
這種做法效果上和前者無異,但是并不可取,只要算算它的時(shí)間復(fù)雜度就知道,基本上是前者的平方。在我的機(jī)器上,做一次全屏幕的放縮操作,前者耗時(shí)60ms,而后者耗時(shí)7150ms。
其實(shí)上面的做法很簡(jiǎn)單,以后有需求可以整理成一個(gè)控件,這樣就可以很方便的調(diào)用,與學(xué)習(xí)。