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

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

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



          無論在midp1.0還是在 midp2.0中,系統(tǒng)都沒有給我們提供對圖片進行伸縮操作的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。



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


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

          Feedback

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

          主站蜘蛛池模板: 平昌县| 方山县| 海阳市| 福鼎市| 江城| 保亭| 咸丰县| 永胜县| 元阳县| 荣昌县| 阳新县| 喀喇沁旗| 朝阳县| 微博| 云安县| 勃利县| 高雄市| 武宣县| 丰镇市| 姚安县| 河间市| 双峰县| 永宁县| 集贤县| 蒙自县| 武强县| 依兰县| 高青县| 鹤庆县| 梓潼县| 镇雄县| 西藏| 手游| 崇礼县| 礼泉县| 临颍县| 长汀县| 油尖旺区| 双江| 柳江县| 金溪县|