饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機(jī)開發(fā)網(wǎng)

             :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          關(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)行。

          效果如下圖所示
           

          原始圖片

           

          圖片放大為全屏幕大小


          圖片縮小為原來的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對(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í)。


          爬蟲工作室 -- 專業(yè)的手機(jī)軟件開發(fā)工作室
          3G視線 -- 專注手機(jī)軟件開發(fā)
          posted on 2007-03-31 19:49 3G工作室 閱讀(1159) 評(píng)論(1)  編輯  收藏 所屬分類: j2me

          Feedback

          # re: 如何在MIDP中實(shí)現(xiàn)圖片放縮(轉(zhuǎn)自linuxmine) 2007-04-23 08:21
          謝謝了,我需要這個(gè)知識(shí)  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 和政县| 虎林市| 恩施市| 龙口市| 彩票| 深水埗区| 甘德县| 于田县| 年辖:市辖区| 新闻| 阳城县| 平乡县| 临夏县| 安阳县| 静安区| 巍山| 湖北省| 东阿县| 集安市| 西林县| 平谷区| 越西县| 黔南| 淳安县| 手机| 辽宁省| 微山县| 台江县| 奇台县| 彭泽县| 卢氏县| 香格里拉县| 铁岭市| 黑龙江省| 周口市| 永兴县| 吴川市| 清丰县| 铁岭市| 柏乡县| 格尔木市|