設計游戲的朋友經常會遇到對圖片資源的操作。今天瀏覽web發現此貼不錯。所以抄過這邊來
原文:www.linuxmine.com/45911.html
無論在midp1.0還是在 midp2.0中,系統都沒有給我們提供對圖片進行伸縮操作的api.但是其實我們只要在程序代碼中略施小計,就能達到這個效果,只是效果要比美術做出來 的圖片,呵呵,差多啦,同時也會造成性能損失。伸縮圖片的構造原理就是簡單沿x,y軸按比例放縮,比如說我們需要把一張16*16的png圖片轉化成一張 32*32的圖片,那么我們可以先對該圖片做一個水平方向上的拉伸操作,然后再把水平拉伸后的圖片按垂直方向再做一次拉伸操作。做拉伸操作時,比如水平方 向上,我們需要構造一張32*16的mutable Image,獲取其Graphics,利用該Graphics,繪制該mutable Graphics的每一列像素,這一列像素就來自于原始圖片中的按比例對應的某一列像素。垂直方向上的拉伸操作也是如法炮制。因為是一種按比例的對應關 系,圖像的縮小操作也可按該辦法進行。
效果如下圖所示

原始圖片

圖片放大為全屏幕大小

圖片縮小為原來的1/4大小
好了,我們來看代碼
java 代碼
- import javax.microedition.lcdui.Graphics;
- import javax.microedition.lcdui.Image;
-
-
-
-
-
-
-
- public class ImageUtil {
-
-
-
-
-
-
-
-
-
- public static final Image scale (Image srcImage, int newW, int newH) {
- int srcW = srcImage.getWidth();
- int srcH = srcImage.getHeight();
-
- Image tmp = Image.createImage(newW, srcH);
- Graphics g = tmp.getGraphics();
-
- for (int x = 0; x < newW; x++) {
- g.setClip(x, 0, 1, srcH);
-
- g.drawImage(srcImage,x-x*srcWnewW,0,Graphics.LEFT | Graphics.TOP);
-
- }
-
-
- Image dst = Image.createImage(newW, newH);
- g = dst.getGraphics();
-
- for (int y = 0; y < newH; y++) {
- g.setClip(0, y, newW, 1);
-
- g.drawImage(tmp,0,y-y*srcHnewH,Graphics.LEFT | Graphics.TOP);
-
- }
-
- return dst;
- }
-
-
- }
-
- 也許有同學會提出疑問,既然是按x,y方向按等比例放縮,那我寫成這樣豈不是代碼更簡潔:
-
- public static final Image scale2(Image srcImage, int newW, int newH) {
- int srcW = srcImage.getWidth();
- int srcH = srcImage.getHeight();
-
- Image dst=Image.createImage(newW,newH);
- Graphics g=dst.getGraphics();
- for (int x = 0; x < newW; x++) {
- for (int y = 0; y < newH; y++) {
- g.setClip(x, y, 1, 1);
- g.drawImage(srcImage, x-x*srcWnewW, y - y * srcH / newH, Graphics.LEFT
- | Graphics.TOP);
-
- }
-
- }
-
- return dst;
- }
這種做法效果上和前者無異,但是并不可取,只要算算它的時間復雜度就知道,基本上是前者的平方。在我的機器上,做一次全屏幕的放縮操作,前者耗時60ms,而后者耗時7150ms。
其實上面的做法很簡單,以后有需求可以整理成一個控件,這樣就可以很方便的調用,與學習。 |