教你如何处理J2ME手机开发中的透明图片

在开发J2ME手机程序的时候,尤其是在开发游戏的时候,透明图片几乎是一种必然的需求,但是在游戏开发中我们会采用Sprite精灵来做图形元素的绘制,而这些图片素材可能都是来自于资源中的文件,这些文件如果采用PNG等支持透明设置的格式的话,透明的处理就会被精灵类自动实现,不需要我们特别处理了。如果遇到一些特殊需求,比如某些图片可能需要通过程序来绘制,或者开发者希望用程序来绘制,那么这时候自己绘制的图片如何被透明地绘制在Canvas中呢?

  透明图片的绘制在J2ME中不是通过Graphics的方法调用完成的,而是通过将Image图片对象指定成透明图片对象来完成的。在Image中有一个方法叫createRGBImage(int[] rgb,int width,int height,boolean processAlpha)。这个方法可以创建出一幅具有透明和半透明效果的图片,当这样的图片被绘制在屏幕上的时候,会自动表现为透明或半透明色。但是这个方法产生的图片有一个问题,就是这个图片中的像素颜色是不可变的,也就是说这个对象的getGraphics()不能取得Graphics对象,也就不能通过程序自定义绘制图片。而我们所需要的就是要通过程序来绘制图片并且达到半透明效果。那么怎么办呢?

  我们这样来处理,首先我们通过Image的createImage方法来创建一个可变图片,然后绘制自定义的图片数据内容。示例程序如下:

 


 int w = 32;
  int h = 24;
  //创建可变的自定义图片,指定宽度和高度
  Image bufImg = Image.createImage(w, h);
  Graphics g = bufImage.getGraphics();
  g.setColor(0xFFFFFF);
  //使用白色绘制背景
  g.fillRect(0, 0, w, h);
  //绘制需要的图片内容
  g.setColor(0xFF0000);
  g.fillRect(10, 10, 20, 20);
  //绘制图片完成,现在需要取得图片中的数据内容。
  //准备一个数组用来存放像素颜色
  int [] imgData = new int[w * h];
  //取得像素颜色
  bufImg.getRGB(imgData, 0, w * h, 0, 0, w, h);

 

  上面程序完成了对自定义图片的像素颜色的提取,在J2ME中的Image是这样规定的,如果这是一个不可变图片,取得的每一个像素颜色是一个int类型的值,如果其高位是00,也就是颜色为0x00RRGGBB的时候,这个像素就是完全透明的,如果是0xAARRGGBB,其中AA表示透明度,这样的颜色表示半透明,现在我们取得了自定义的可变图片的像素颜色值,接下来,我们需要创建不可变图片,并且要把白色的背景设置为完全透明的。

  //将取得的保存在数组中的背景颜色的高位值设置为00

 


   for(int i=0; i 
  if(imgData[i] & 0x00FFFFFF == 0x00FFFFFF) {
  imgData[i] = imgData[i] & 0x00FFFFFF;
  }
  }
  //创建不可变透明图片, 其中最后一个参数表示透明。
  Image immutableImg = Image.createRGBImage(imgData, w, h, true);

 

  好了,到这里一个透明图片创建出来了,这个图片被绘制到Canvas上将会是一幅背景完全透明的图片。其实这样我们可以对这个功能封装一个方法,代码如下:

 


   createAlphaImage(Image img, int alphaColor) {
  int w = img.getWidth();
  int h = img.getHeight();
  int [] imgData = new int[w * h];
  img.getRGB(imgData, 0, w * h, 0, 0, w, h);
  for(int i=0; i 
  if(imgData[i] & alphaColor == alphaColor) {
  imgData[i] = imgData[i] & alphaColor;
  }
  }

 

  方法参数说明如下:

  img-是不透明的原图片

  alphaColor-是需要设为透明的像素颜色,格式为0x00RRGGBB.

文章来自永磁起重器http://www.shqzjx.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值