路是爬出來的

          [導(dǎo)入]如何在MIDP中實現(xiàn)圖片放縮(轉(zhuǎn)自linuxmine)

                設(shè)計游戲的朋友經(jīng)常會遇到對圖片資源的操作。今天瀏覽web發(fā)現(xiàn)此貼不錯。所以抄過這邊來

          原文:www.linuxmine.com/45911.html







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

          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, 01, 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é)會提出疑問,既然是按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, 11);  

          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. }  







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







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


          文章來源: http://wuhua.javaeye.com/blog/35780

          posted on 2006-12-30 08:42 路是爬出來的 閱讀(91) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 通州区| 三明市| 莱阳市| 万荣县| 巴彦淖尔市| 临桂县| 哈尔滨市| 策勒县| 广丰县| 定日县| 噶尔县| 瑞丽市| 民和| 大名县| 通辽市| 库尔勒市| 邯郸县| 盱眙县| 卢氏县| 咸宁市| 牡丹江市| 台东县| 嵊泗县| 汪清县| 洛宁县| 泊头市| 中卫市| 兴安县| 丰镇市| 乐至县| 长乐市| 崇信县| 习水县| 景德镇市| 神木县| 公主岭市| 玉溪市| 藁城市| 分宜县| 唐河县| 兴仁县|