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

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

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          關(guān)鍵字: J2ME ? ????
          ????? 設(shè)計(jì)游戲的朋友經(jīng)常會(huì)遇到對(duì)圖片資源的操作。今天瀏覽web發(fā)現(xiàn)此貼不錯(cuò)。所以抄過(guò)這邊來(lái)
          原文:www.linuxmine.com/45911.html



          無(wú)論在midp1.0還是在 midp2.0中,系統(tǒng)都沒(méi)有給我們提供對(duì)圖片進(jìn)行伸縮操作的api.但是其實(shí)我們只要在程序代碼中略施小計(jì),就能達(dá)到這個(gè)效果,只是效果要比美術(shù)做出來(lái) 的圖片,呵呵,差多啦,同時(shí)也會(huì)造成性能損失。伸縮圖片的構(gòu)造原理就是簡(jiǎn)單沿x,y軸按比例放縮,比如說(shuō)我們需要把一張16*16的png圖片轉(zhuǎn)化成一張 32*32的圖片,那么我們可以先對(duì)該圖片做一個(gè)水平方向上的拉伸操作,然后再把水平拉伸后的圖片按垂直方向再做一次拉伸操作。做拉伸操作時(shí),比如水平方 向上,我們需要構(gòu)造一張32*16的mutable Image,獲取其Graphics,利用該Graphics,繪制該mutable Graphics的每一列像素,這一列像素就來(lái)自于原始圖片中的按比例對(duì)應(yīng)的某一列像素。垂直方向上的拉伸操作也是如法炮制。因?yàn)槭且环N按比例的對(duì)應(yīng)關(guān) 系,圖像的縮小操作也可按該辦法進(jìn)行。

          效果如下圖所示
           

          原始圖片

           

          圖片放大為全屏幕大小


          圖片縮小為原來(lái)的1/4大小


          好了,我們來(lái)看代碼
          java 代碼
          ?
          ???1.??import?javax.microedition.lcdui.Graphics;??
          ???
          2.?import?javax.microedition.lcdui.Image;??
          ???
          3.???
          ???
          4.?/**?
          ???5.?*?圖像工具類(lèi)?
          ???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ì)提出疑問(wèn),既然是按x,y方向按等比例放縮,那我寫(xiě)成這樣豈不是代碼更簡(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.?}??



          這種做法效果上和前者無(wú)異,但是并不可取,只要算算它的時(shí)間復(fù)雜度就知道,基本上是前者的平方。在我的機(jī)器上,做一次全屏幕的放縮操作,前者耗時(shí)60ms,而后者耗時(shí)7150ms。



          其實(shí)上面的做法很簡(jiǎn)單,以后有需求可以整理成一個(gè)控件,這樣就可以很方便的調(diào)用,與學(xué)習(xí)。


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

          Feedback

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

          主站蜘蛛池模板: 秦皇岛市| 家居| 民和| 定州市| 宁海县| 湖口县| 东乡族自治县| 桓仁| 桂林市| 东乌珠穆沁旗| 靖边县| 虞城县| 民乐县| 新竹市| 固安县| 怀来县| 上杭县| 乌拉特中旗| 梁河县| 嘉义市| 永济市| 怀仁县| 新竹县| 那曲县| 荥经县| 秭归县| 岳阳县| 仙游县| 山阴县| 兴安县| 博客| 潮州市| 北川| 定南县| 治多县| 棋牌| 博白县| 通州区| 虎林市| 鄄城县| 麻栗坡县|