首先我們參考一下MIDP2.0 Java doc中關於Alpha Processing的闡明:在可修正圖片中的每個像素都必需是完整含混的,在不可修正圖片中的每個像素可以是完整透明的,完整含混的或者介於兩者之間的,也就是半透明。系統的實現必需要支撐存儲,處理和繪畫全透明和全含混的像素,當從數據源創立一個圖片的時候(數據源可能來自PNG圖片或者一個字節數組),原圖片中的不透明像素和透明像素應當在新圖片中保持不變。對半透明像素的處理就和系統的實現相干了,要看Alpha混雜是否被支撐。假如系統實現支撐Alpha混雜,那麼原圖中的半透明像素在新圖片中依然保持半透明,當然數值可能會根據系統支撐的半透明的級別產生一些變更。假如系統實現不支撐Alpha混雜的話,任何半透明的像素在新圖片中應當應用全透明的像素來調換。
接下來我們熟悉幾個方法,正是他們的引進增加了Alpha混雜特征。
public static Image createRGBImage(int[] rgb,
int width,
int height,
boolean processAlpha)
上面的方法來自於Image類,它答應我們從rgb數組創立一個不可修正的圖片,數組中的數值情勢為0xAARRGGBB,其中AA代表透明度,後面的代表色彩值。具體方法的先容請參考MIDP Java doc。
public void getRGB(int[] rgbData,
int offset,
int scanlength,
int x,
int y,
int width,
int height)
下面的方法同樣來自於Image類,這個方法可以讓我們從圖片的指定區域讀取ARGB像素值,並存儲到rgbData數組中。具體方法的先容請參考MIDP Java doc。
public void drawRGB(int[] rgbData,
int offset,
int scanlength,
int x,
int y,
int width,
int height,
boolean processAlpha)
上面的方法是Graphics中新增的,應用這個方法我們可以在指定的區域繪畫一些列和設備無關的(RGB+透明)值,rgbData中的元素情勢為0xAARRGGBB。其中AA代表透明度,00代表全透明 ,FF代表完整含混。具體方法的先容請參考MIDP Java doc。
下面我們編寫一個例子來先容如何應用Alpha混雜,通過實例形象的闡明這一後果。我們打開一個圖片,然後在圖像的上面進行半透明的粉飾,制作出下面的後果,參考下圖:
制作這樣的後果並不難,我們只需要調用上面的drawRGB()方法即可,為了更好的粉飾這一後果。我們啟動一個新的線程來不斷的更新mask區域的高度,然後重新繪制屏幕(這裡沒有考慮優化)。代碼如下:
public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());//paint Canvas background white
g.drawImage(backgroundImage, x, y, Graphics.TOP|Graphics.LEFT);
//render the semi-transparent mask
if (maskHeight != 0){
g.drawRGB(maskArray, 0, imageWidth, x, y, imageWidth, maskHeight, true);
}
}
public void run() {
for(int i = 1; i <= imageHeight; i++) {
maskHeight = i;
repaint();
try {
Thread.sleep(50);
}catch(InterruptedException IE) {}
}
}
下面給出這個利用程序的源代碼,代碼出自Programming Java 2 Micro Edition on SymBian OS一書。筆者只是借花獻佛,由於最近論壇一直有人問Alpha相干的標題。
/*
* Copyright 2003, 2004 SymBian Ltd.
* For License terms see http://www.SymBian.com/developer/techlib/codelicense.Html
*/
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class AlphaBlending extends MIDlet implements CommandListener {
private Display display;
private Form form;
private Command exitCommand;
private Command startCommand;
private Command backCommand;
private AlphaCanvas alphaCanvas;
private static final String IMAGE_NAME = "/image.png";
public AlphaBlending() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.EXIT, 2);
startCommand = new Command("Start", Command.SCREEN, 1);
backCommand = new Command("Back", Command.BACK, 1);
alphaCanvas = new AlphaCanvas(IMAGE_NAME);
form = new Form("Alpha Blending Demo");
form.append(new StringItem(null, "Press 'Start' to run demo."));
form.addCommand(exitCommand);
form.addCommand(startCommand);
form.setCommandListener(this);
}
public void startApp() {
display.setCurrent(form);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}else if (c == startCommand) {
display.setCurrent(alphaCanvas);
alphaCanvas.addCommand(backCommand);
alphaCanvas.setCommandListener(this);
Thread t = new Thread(alphaCanvas);
t.start();
}else if (c == backCommand) {
display.setCurrent(form);
}
}
}
/*
* Copyright 2003, 2004 SymBian Ltd.
* For License terms see http://www.SymBian.com/developer/techlib/codelicense.Html
*/
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
import Java.io.*;
public class AlphaCanvas extends Canvas implements Runnable {
private Image backgroundImage;
private int[] maskArray;
private int imageWidth;
private int imageHeight;
private int x;
private int y;
private int maskHeight = 0;
public AlphaCanvas(String imageName) {
//create the background image
try {
backgroundImage = Image.createImage(imageName);
}catch(IOException ioe) {
ioe.printStackTrace() ;
}
imageWidth = backgroundImage.getWidth();
imageHeight = backgroundImage.getHeight();
//create a semi-transparent red mask to cover the background image
maskArray = new int[imageWidth*imageHeight];
for (int i = 0; i < imageWidth*imageHeight; i++) {
maskArray[i] = 0x11FFF000;//alpha coefficIEnt set to 0.3
}
x = (getWidth() - imageWidth)/2;
y = (getHeight() - imageHeight)/2;
}
public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());//paint Canvas background white
g.drawImage(backgroundImage, x, y, Graphics.TOP|Graphics.LEFT);
//render the semi-transparent mask
if (maskHeight != 0){
g.drawRGB(maskArray, 0, imageWidth, x, y, imageWidth, maskHeight, true);
}
}
public void run() {
for(int i = 1; i <= imageHeight; i++) {
maskHeight = i;
repaint();
try {
Thread.sleep(50);
}catch(InterruptedException IE) {}
}
}
}