powinder的专栏

专注于移动开发

图像的透明处理!

MIDP 1.0中要创建可变图片只有一种方法:
Image img = Image.createImage(100, 100); // create a 100x100 image
很遗憾,它生成的图片充满了不透明的白色象素-无法创建一开始就透明的可变图片。因为之后无法使象素透明,你就不能用这种方法创建具有透明性的图片。特别要强调的是:你不能用它为某个透明子图创建透明的可变副本。
Graphics g = img.getGraphics(); g.drawImage(spriteImg, 0, 0, Graphics.TOP | Graphics.LEFT);
因为,无论子图是否透明,其派生的图片都填充着不透明的白色。
用诺基亚Java用户界面API,你就可以创建可变图片,并将其初始化为任何颜色,包括透明色:
Image img = DirectUtils.createImage(100, 100, 0x00000000);
这里的颜色“0x00000000”不是RGB而是“ARGB” 这个至关重要的字节详细规定了“alpha”值:0xFFrrggbb表示不透明,0x00rrggbb表示透明(在这种情况下,rrggbb值没有意义)。可以把“alpha”理解为不透明性(与透明性相反)。需要注意的是:移动电话有可能并不支持alpha混合(即半透明线条和图片与背景的混合)。在这种情况下,大于0alpha值被认为是不透明的。
你也能用GraphicsDirectGraphics方法绘制透明子图,如果你想节省MIDlet JAR文件的空间,你可以把所有的子图合并成一个大图,这种方法是非常实用的(这样,单位文件的系统开销就只有一次了)。
这里,你由一个图片文件(图5中上部图片)创建一个大图片,然后使用DirectGraphics为每个子图创建透明小图片,并以适当的x-y-偏移量,通过drawImage方法分别在每个透明小图片(图5中下面的图片)上面绘制大图片的相应部分。源代码如下(注意每个图片是12x12象素):
Image fivemen = Image.createImage("/fivemen.png"); Image man[] = new Image[5]; for (int i = 0; i < 5; ++i) { man[i] = DirectUtils.createImage(12, 12, 0x00000000); Graphics g = man[i].getGraphics(); g.drawImage(fivemen, -12 * i, 0, Graphics.TOP | Graphics.LEFT); }
(该代码在MIDP1.0中不起作用,因为各个小图片都被初始化为不透明的白色背景,如果想在这些小图片上绘制透明子图,子图将具有不透明的白色背景)。需要记住的是:之后不要再保留对该大图片的引用,以便让其能作为垃圾被收集。
最后,你可以从图片的字节数据中创建一个可变图片:
Image img = DirectUtils.createImage(data, offset, length);
这种方法很有用,比如,你要在几个子图上显示玩家可以选择的赛车,你可以先创建子图,然后在这些子图上绘制那些可选赛车。

阅读更多
个人分类: J2ME
上一篇Java Socket编程(
下一篇Tomcat全攻略
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

图像的透明处理!

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭