在MIDP1.0中開發者自己實現翻轉,在MIDP2.0中系統已經提供了翻轉方法,但有些機型翻轉效果不正確(廠商實現問題),所以自己實現翻轉方法。本想一次將圖讀到一個大INT數據,但如果圖片過大,會內存溢出,所以通過對圖片的每行進行變換來達到高速翻轉。如果你有更高效的方法歡迎討論。
import Javax.microedition.lcdui.Graphics;
import Javax.microedition.lcdui.Image;
/** *//**
* @功能:實現圖片的高效翻轉
* @作者: imuse
* @MAIL:
[email protected] *
*/
public class ImageUtil ...{
/** *//**
* 無變化
* */
public final static int TRANS_NONE = 0;
/** *//**
* 順時針翻轉90度
* */
public final static int TRANS_ROT90 = 5;
/** *//**
* 順時針翻轉180度
* */
public final static int TRANS_ROT180 = 3;
/** *//**
* 順時針翻轉270度
* */
public final static int TRANS_ROT270 = 6;
/** *//**
* 水平鏡像翻轉
* */
public final static int TRANS_MIRROR = 2;
/** *//**
* 水平鏡像翻轉並順時針翻轉90度
* */
public final static int TRANS_MIRROR_ROT90 = 7;
/** *//**
* 水平鏡像翻轉並順時針翻轉180度
* */
public final static int TRANS_MIRROR_ROT180 = 1;
/** *//**
* 水平鏡像翻轉並順時針翻轉270度
* */
public final static int TRANS_MIRROR_ROT270 = 4;
/** *//**
* @功能 實現圖片的翻轉
* @參數 Image srcImage 原圖<br>int transform 翻轉方向<br>
* @返回值 轉換後的圖片
* */
public static Image transformImage(Image srcImage, int transform) ...{
int srcW = srcImage.getWidth();
int srcH = srcImage.getHeight();
Image imgRet = null;
switch (transform) ...{
case TRANS_NONE:
imgRet = srcImage;
break;
case TRANS_ROT90:
...{
/** *//**
* 原: 目標:
* 1234 951
* 5678 062
* 90ab a73
* b84
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcH, srcW);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
g.drawRGB(srcRGB, 0, 1, srcH - i - 1, 0, 1, srcW, true);
}
}
break;
case TRANS_ROT180:
...{
/** *//**
* 原: 目標:
* 1234 ba09
* 5678 8765
* 90ab 4321
*
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcW, srcH);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
arrayExchange(srcRGB);
g.drawRGB(srcRGB, 0, srcW, 0, srcH-1-i, srcW, 1, true);
}
}
break;
case TRANS_ROT270:
...{
/** *//**
* 原: 目標:
* 1234 48b
* 5678 37a
* 90ab 260
* 159
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcH, srcW);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
arrayExchange(srcRGB);
g.drawRGB(srcRGB, 0, 1, i, 0, 1, srcW, true);
}
}
break;
case TRANS_MIRROR:
...{
/** *//**
* 原: 目標:
* 1234 4321
* 5678 8765
* 90ab ba09
*
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcW, srcH);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
arrayExchange(srcRGB);
g.drawRGB(srcRGB, 0, srcW, 0, i, srcW, 1, true);
}
}
break;
case TRANS_MIRROR_ROT90:
...{
/** *//**
* 原: 目標:
* 1234 b84
* 5678 a73
* 90ab 062
* 951
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcH, srcW);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
arrayExchange(srcRGB);
g.drawRGB(srcRGB, 0, 1, srcH - i - 1, 0, 1, srcW, true);
}
}
break;
case TRANS_MIRROR_ROT180:
...{
/** *//**
* 原: 目標:
* 1234 90ab
* 5678 5678
* 90ab 1234
*
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcW, srcH);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
g.drawRGB(srcRGB, 0, srcW, 0, srcH-1-i, srcW, 1, true);
}
}
break;
case TRANS_MIRROR_ROT270:
...{
/** *//**
* 原: 目標:
* 1234 159
* 5678 260
* 90ab 37a
* 48b
* */
int[] srcRGB = new int[srcW];
imgRet = Image.createImage(srcH, srcW);
Graphics g = imgRet.getGraphics();
for (int i = 0; i < srcH; i++) ...{
srcImage.getRGB(srcRGB, 0, srcW, 0, i, srcW, 1);
g.drawRGB(srcRGB, 0, 1, i, 0, 1, srcW, true);
}
}
break;
default:
imgRet = srcImage;
break;
}
return imgRet;
}
/** *//**
* @功能 翻轉一個INT數組
* @參數 要轉換的INT數組
* @返回值 無
* */
public static final void arrayExchange(int[] b)...{
int nCount = b.length;
int nLen = nCount/2;
nCount--;
for (int i = 0; i < nLen; i++) ...{
int nTemp = b[i];
b[i] = b[nCount-i];
b[nCount-i] = nTemp;
}
}
}