在开发J2ME手机
![](/icons/63993chengxu.gif)
![](/icons/63993de.gif)
时候
![](/icons/63993dou.gif)
尤其是在开发游戏
![](/icons/63993de.gif)
时候
![](/icons/63993dou.gif)
透明图片几乎是
![](/icons/63993yi.gif)
种必然
![](/icons/63993de.gif)
需求
![](/icons/63993dou.gif)
但是在游戏开发中我们会采用Sprite精灵来做图形元素
![](/icons/63993de.gif)
绘制
![](/icons/63993dou.gif)
而这些图片素材可能都是来自于资源中
![](/icons/63993de.gif)
文件
![](/icons/63993dou.gif)
这些文件如果采用PNG等支持透明设置
![](/icons/63993de.gif)
格式
![](/icons/63993de.gif)
话
![](/icons/63993dou.gif)
透明
![](/icons/63993de.gif)
处理就会被精灵类自动实现
![](/icons/63993dou.gif)
不需要我们特别处理了
![](/icons/63993dou2.gif)
如果遇到
![](/icons/63993yi.gif)
些特殊需求
![](/icons/63993dou.gif)
比如某些图片可能需要通过
![](/icons/63993chengxu.gif)
来绘制
![](/icons/63993dou.gif)
或者开发者希望用
![](/icons/63993chengxu.gif)
来绘制
![](/icons/63993dou.gif)
那么这时候自己绘制
![](/icons/63993de.gif)
图片如何被透明地绘制在Canvas中呢?
透明图片
![](/icons/63993de.gif)
绘制在J2ME中不是通过Graphics
![](/icons/63993de.gif)
思路方法
![](/icons/63993diaoyong.gif)
完成
![](/icons/63993de.gif)
![](/icons/63993dou.gif)
而是通过将Image图片对象指定成透明图片对象来完成
![](/icons/63993de.gif)
![](/icons/63993dou2.gif)
在Image中有
![](/icons/63993yi.gif)
个思路方法叫createRGBImage(
![](/icons/63993int.gif)
![](/icons/63993zhk2.gif)
rgb,
![](/icons/63993int.gif)
width,
![](/icons/63993int.gif)
height,boolean processAlpha)
![](/icons/63993dou2.gif)
这个思路方法可以创建出
![](/icons/63993yi.gif)
幅具有透明和半透明效果
![](/icons/63993de.gif)
图片
![](/icons/63993dou.gif)
当这样
![](/icons/63993de.gif)
图片被绘制在屏幕上
![](/icons/63993de.gif)
时候
![](/icons/63993dou.gif)
会自动表现为透明或半透明色
![](/icons/63993dou2.gif)
但是这个思路方法产生
![](/icons/63993de.gif)
图片有
![](/icons/63993yi.gif)
个问题
![](/icons/63993dou.gif)
就是这个图片中
![](/icons/63993de.gif)
像素颜色是不可变
![](/icons/63993de.gif)
![](/icons/63993dou.gif)
也就是说这个对象
![](/icons/63993de.gif)
getGraphics
![](/icons/63993kh.gif)
不能取得Graphics对象
![](/icons/63993dou.gif)
也就不能通过
![](/icons/63993chengxu.gif)
自定义绘制图片
![](/icons/63993dou2.gif)
而我们所需要
![](/icons/63993de.gif)
就是要通过
![](/icons/63993chengxu.gif)
来绘制图片并且达到半透明效果
![](/icons/63993dou2.gif)
那么如何办呢?
我们这样来处理
![](/icons/63993dou.gif)
首先我们通过Image
![](/icons/63993de.gif)
createImage思路方法来创建
![](/icons/63993yi.gif)
个可变图片
![](/icons/63993dou.gif)
然后绘制自定义
![](/icons/63993de.gif)
图片数据内容
![](/icons/63993dou2.gif)
举例
![](/icons/63993chengxu.gif)
如下:
![](/icons/63993int.gif)
w = 32;
![](/icons/63993int.gif)
h = 24;
//创建可变
![](/icons/63993de.gif)
自定义图片
![](/icons/63993dou.gif)
指定宽度和高度
Image bufImg = Image.createImage(w, h);
Graphics g = bufImage.getGraphics
![](/icons/63993kh.gif)
;
g.
![](/icons/63993set.gif)
Color(0xFFFFFF);
//使用白色绘制背景
g.fillRect(0, 0, w, h);
//绘制需要
![](/icons/63993de.gif)
图片内容
g.
![](/icons/63993set.gif)
Color(0xFF0000);
g.fillRect(10, 10, 20, 20);
//绘制图片完成
![](/icons/63993dou.gif)
现在需要取得图片中
![](/icons/63993de.gif)
数据内容
//准备
![](/icons/63993yi.gif)
个
![](/icons/63993shuzu.gif)
用来存放像素颜色
![](/icons/63993zhk2.gif)
imgData =
![](/icons/63993int.gif)
[w * h];
//取得像素颜色
bufImg.getRGB(imgData, 0, w * h, 0, 0, w, h);
上面
![](/icons/63993chengxu.gif)
完成了对自定义图片
![](/icons/63993de.gif)
像素颜色
![](/icons/63993de.gif)
提取
![](/icons/63993dou.gif)
在J2ME中
![](/icons/63993de.gif)
Image是这样规定
![](/icons/63993de.gif)
![](/icons/63993dou.gif)
如果这是
![](/icons/63993yi.gif)
个不可变图片
![](/icons/63993dou.gif)
取得
![](/icons/63993de.gif)
每
![](/icons/63993yi.gif)
个像素颜色是
![](/icons/63993yi.gif)
个
![](/icons/63993int.gif)
类型
![](/icons/63993de.gif)
值
![](/icons/63993dou.gif)
如果其高位是00
![](/icons/63993dou.gif)
也就是颜色为0x00RRGGBB
![](/icons/63993de.gif)
时候
![](/icons/63993dou.gif)
这个像素就是完全透明
![](/icons/63993de.gif)
![](/icons/63993dou.gif)
如果是0xAARRGGBB
![](/icons/63993dou.gif)
其中AA表示透明度
![](/icons/63993dou.gif)
这样
![](/icons/63993de.gif)
颜色表示半透明
![](/icons/63993dou.gif)
现在我们取得了自定义
![](/icons/63993de.gif)
可变图片
![](/icons/63993de.gif)
像素颜色值
![](/icons/63993dou.gif)
接下来
![](/icons/63993dou.gif)
我们需要创建不可变图片
![](/icons/63993dou.gif)
并且要把白色
![](/icons/63993de.gif)
背景设置为完全透明
![](/icons/63993de.gif)
//将取得
![](/icons/63993de.gif)
保存在
![](/icons/63993shuzu.gif)
中
![](/icons/63993de.gif)
背景颜色
![](/icons/63993de.gif)
高位值设置为00
for(
![](/icons/63993int.gif)
i=0; i<imgData.length; i
![](/icons/63993jiajia.gif)
) {
![](/icons/63993if.gif)
(imgData[i] & 0x00FFFFFF
![](/icons/63993dd.gif)
0x00FFFFFF) {
imgData[i] = imgData[i] & 0x00FFFFFF;
}
}
//创建不可变透明图片, 其中最后
![](/icons/63993yi.gif)
个参数表示透明
Image immutableImg = Image.createRGBImage(imgData, w, h, true);
好了
![](/icons/63993dou.gif)
到这里
![](/icons/63993yi.gif)
个透明图片创建出来了
![](/icons/63993dou.gif)
这个图片被绘制到Canvas上将会是
![](/icons/63993yi.gif)
幅背景完全透明
![](/icons/63993de.gif)
图片
![](/icons/63993dou2.gif)
其实这样我们可以对这个功能封装
![](/icons/63993yi.gif)
个思路方法
![](/icons/63993dou.gif)
代码如下:
createAlphaImage(Image img,
![](/icons/63993int.gif)
alphaColor) {
![](/icons/63993int.gif)
w = img.getWidth
![](/icons/63993kh.gif)
;
![](/icons/63993int.gif)
h = img.getHeight
![](/icons/63993kh.gif)
;
![](/icons/63993zhk2.gif)
imgData =
![](/icons/63993int.gif)
[w * h];
img.getRGB(imgData, 0, w * h, 0, 0, w, h);
for(
![](/icons/63993int.gif)
i=0; i<imgData.length; i
![](/icons/63993jiajia.gif)
) {
![](/icons/63993if.gif)
(imgData[i] & alphaColor
![](/icons/63993dd.gif)
alphaColor) {
imgData[i] = imgData[i] & alphaColor;
}
}
思路方法参数介绍说明如下:
img-是不透明
![](/icons/63993de.gif)
原图片
alphaColor-是需要设为透明
![](/icons/63993de.gif)
像素颜色
![](/icons/63993dou.gif)
格式为0x00RRGGBB