程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 如何在MIDP中實現圖片放縮

如何在MIDP中實現圖片放縮

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved