在J2ME中如何使用 Graphics对象来画背景透明的图片

悬赏:40 发布时间:2008-08-06 提问人:icess (初级程序员)

创建一个Image对象, 然后适用Image对象的getGraphics() 方法得到Graphics对象,然后使用Graphics对象来画这个图片, 如何画出背景透明的图片呢?
问题补充:
没看明白你说的什么意识:

在详细说下我要实现的效果:

image = Image.createImage(20, 20);
Graphics g = image .getGraphics();

g.setColor(imageColor);
g.setFont(font);
g.drawString("STATE", 0,0,Graphics.LEFT|Graphics.TOP);

然后我需要画出来的这个image 对象是背景透明的图片。

如果我把这个图片显示在一个文字上方, 可以看到图片下的文字。
问题补充:
to: yingjinsheng

MIDP 2.0 ,2.1 中有

Color color = new Color(0,0,0,255);
g.setColor(color);

这个类和方法吗?
问题补充:
to:zhai puhong

你这个是直接操作png图片格式的数据,如果png图片本身就是背景透明的, 不用做变换就是透明的,对于一个背景透明的图片,我测试了下, 把a未设置为0和255效果是一样的。

我要实现的是画出一个背景透明的图片。一般的画图方法如下:

image = Image.createImage(20, 20);
Graphics g = image .getGraphics();

g.setColor(bgColor); //这里先设置背景色
g.fillRect(0,0,20,20);//然后填充背景色

g.setColor(imageColor);//然后在画图片的内容
g.setFont(font);
g.drawString("STATE", 0,0,Graphics.LEFT|Graphics.TOP);

要实现的效果, 只要图片的背景色是透明的就可以了。
该问题已经关闭: 结束

回答

MIDP1.0的手机不支持图片透明的,除了NOKIA的.

g.translate(x,y);
g.setClip(x,y,wid,hei);


另外,这篇文章也许能帮你http://www.javaeye.com/topic/27937
qichunren (资深程序员) 2008-08-06
Graphics g = image .getGraphics();
Color color = new Color(0,0,0,255);
g.setColor(color);
这样就可以设置透明了
yingjinsheng (初级程序员) 2008-08-09
楼主,这里有一篇讲MIDP2.0中图片象素级处理之半透明处理的原理和例子:
http://dev.yesky.com/92/2355592.shtml

原文引用:
“MIDP2.0中提供了对图片的象素级的处理,利用这一点,我们可以对图片进行相关的处理,比如半透明,把彩色图片处理成灰度图片,以及图片变色效果都可以在J2ME里很方便地实现。

  在进行这些操作之前,我们必须先了解JAVA中的一些位操作符:

  <<,>>,&,|,主要是这几个操作符,下面我们就开始我们的操作

  1、半透明处理

  在PNG里每个象素是一个ARBG格式,是一个8位的十六进制的数字,比如0xff121212,这个东西描述了图片的一个象素,我们可以通过Image类中的getRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height) 方法获得一个rgbData,这个rgbData就保存了图片所对应的象素信息,取出象素信息之后我们需要对其进行透明效果的处理,透明效果的值是保存在8位中的最高2位,你可以把这个象素值转换成16进制输出,一般情况下最高2位应该都是为FF,也就是不透明,我们现在需要把这个FF改成一个比他小的值,那么我们的图片就透明了,最高位为00的时候图片就全透明了。

  其实8位16进制对应了32位的2进制,那么我们可以通过下面的方法取出他的最高2位:

  A = Argb>>24//把这个数向右移动24位,那么剩下的8位就是我们要的最高位了

  修改之后我们再通过下面的方法可以把他存回去 Argb = a<<24 |( argb & 0x00FFFFFF);

  那么我们通过循环把这个图片的所有象素信息都改变之后,在用改变的象素信息来构造一个图片,或者这个通过我们的Graphics 下面的drawRGB方法直接画出来的就是一个半透明效果的图片了,你可以在画这个图片之前先画一个其他的图片,这样你就可以很明显地看到效果了”

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
* @author 刘军
* @version 1.0
*/
public class TCanvas extends Canvas {
 Image image;//要处理的图片
 int argb[];
 public TCanvas() {
  super();
  try {
   image = Image.createImage("/test.png");//导入图片
  } catch (IOException e) {
   e.printStackTrace();
  }
  argb = new int[image.getWidth()*image.getHeight()];
  image.getRGB(argb,0,image.getWidth(),0,0,image.getWidth(),image.getHeight());//获得图片的ARGB值
  int temp;
  int a= 100;//把象素的透明度都设置为100
  for(int i=0;i<argb.length;i++)
  {
   argb[i]=(a<<24) | (argb[i] & 0x00FFFFFF);// 修改最高2位的值
  }
 }

 protected void paint(Graphics g) {
  g.drawImage(image,0,0,Graphics.TOP|Graphics.LEFT);
  g.drawRGB(argb,0,image.getWidth(),0,100,image.getWidth(),image.getHeight(),true);// 画象素数组
 }
}


看看有没有用。
zhai puhong (资深程序员) 2008-08-12