500分请问谁有图片透明,半透明的算法?

Dickensi 2003-12-13 05:43:10
如题,我会再加分的!
...全文
550 53 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
deo2000 2004-03-16
  • 打赏
  • 举报
回复
midp2.0实现起来简单。
就是上面sniper_bat(sniper_bat) 的帖子。

如果是midp1.0的话,
就是上面 MrYoucheng(老大) 的帖子。
/
如果你不是特别需要这种效果 或者能用几幅渐变的图片代替的话 最好打消这个念头

如果非要作
你只能自己解包了(png用了zip压缩)
思路 如下
1 把png图片变成rgb数组存在内存里(估计速度很慢,因为j2me用了native方法)
2 把数组里的象素进行alpha变换
3 最后画到canvas上

整个过程需要你去研究png的格式(英文版大概20k 很痛苦啊)
/
我以前做过这个方面的一些试验,基本和上面的说法差不多,可是真的太痛苦了。
而且用这样的方法,速度暴慢,完全没有什么太大的实际意义的。



lEFTmOON 2004-03-13
  • 打赏
  • 举报
回复
关注
limd 2004-03-07
  • 打赏
  • 举报
回复
YES,上面的做的不错,MARK
huangtaoxiao 2004-02-24
  • 打赏
  • 举报
回复
那得看你用的是什么平台,一般特定的API里面都有这种方法 例如LGT里就有setAlpha();
sniper_bat 2004-02-24
  • 打赏
  • 举报
回复
我前面说了是用MIDP2.0做的.
2.0里面Image里用getRGB()这个函数的.
drawRGB这个函数在Graphics里
topSixstar 2004-02-23
  • 打赏
  • 举报
回复
img0.getRGB(srcRgbdata,0,width,0,0,width,height);
img1.getRGB(desRgbdata,0,width,0,0,width,height);
image类中没有getRGB()和drawRGB()函数啊

上面的程序不能编译
??
topSixstar 2004-02-23
  • 打赏
  • 举报
回复
up一下
sniper_bat 2004-02-22
  • 打赏
  • 举报
回复
up
yutian1981 2004-02-21
  • 打赏
  • 举报
回复
midp2.0是怎样作的呢?
sniper_bat 2004-02-21
  • 打赏
  • 举报
回复
搞定了,现写了一个.是MIDP2.0的.

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class trans extends MIDlet
{
private static boolean noRun = true;
protected void destroyApp(boolean unconditional)
{
}
protected void pauseApp()
{
}
protected void startApp()
{
if(noRun)
{
GameCanvas c = new GameCanvas();
Thread t = new Thread(c);
t.start();
noRun = false;
Display.getDisplay(this).setCurrent(c);
}
}

class GameCanvas extends Canvas implements Runnable
{

private int[] srcRgbdata;
private int[] desRgbdata;
private int alpha = 128;
private int gameStatus = 0;
private int width = 0;
private int height = 0;

GameCanvas()
{
//init
try
{
Image img0 = Image.createImage("/0.png");
Image img1 = Image.createImage("/1.png");
width = img0.getWidth();
height = img0.getHeight();
srcRgbdata = new int [width*height];
desRgbdata = new int [width*height];
img0.getRGB(srcRgbdata,0,width,0,0,width,height);
img1.getRGB(desRgbdata,0,width,0,0,width,height);
img0=null;
img1=null;
}
catch(Exception e)
{
System.out.println("get image error"+e);
}
}
public void run()
{
long time_counter=0;
while(true)
{
while(10 > System.currentTimeMillis()-time_counter)
{
}
time_counter = System.currentTimeMillis();
repaint();
serviceRepaints();
}
}

public void paint(Graphics g)
{
switch(gameStatus)
{
case 0:
g.drawRGB(getTransImg(alpha),0,width,0,0,width,height,false);
alpha-=10;
if(alpha<=0)
{

gameStatus = 1;
}
break;
case 1:
g.drawRGB(getTransImg(alpha),0,width,0,0,width,height,false);
alpha+=10;
if(alpha>=255)
{
gameStatus = 0;
}
break;
default:
break;
}

}
private int[] getTransImg(int alpha)
{
int [] tempRgbData= new int [desRgbdata.length];
for(int i=0;i<desRgbdata.length;i++)
{
int sr = (srcRgbdata[i]&0xff0000)>>16;
int sg = (srcRgbdata[i]&0xff00)>>8;
int sb = srcRgbdata[i]&0xff;

int dr = (desRgbdata[i]&0xff0000)>>16;
int dg = (desRgbdata[i]&0xff00)>>8;
int db = desRgbdata[i]&0xff;

int tr = (sr*alpha + dr*(255-alpha))/255;
int tg = (sg*alpha + dg*(255-alpha))/255;
int tb = (sb*alpha + db*(255-alpha))/255;

tempRgbData[i] = (tr<<16)|(tg<<8)|tb;
}
return tempRgbData;
}
}

}
sniper_bat 2004-02-21
  • 打赏
  • 举报
回复
:~~~
对不起大家,昨天忘了..........
wind_rain 2004-02-20
  • 打赏
  • 举报
回复
我等着 sniper_bat(sniper_bat) d 代码呢!
sunny110 2004-02-20
  • 打赏
  • 举报
回复
关注
sniper_bat 2004-02-19
  • 打赏
  • 举报
回复
代码在公司里
明天给
hx 2004-02-19
  • 打赏
  • 举报
回复
唉...郁闷!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
luckyum 2004-02-17
  • 打赏
  • 举报
回复
要是用nokia UI的话 我做过图片逐渐透明,不透明。
Midp2.0也可以有办法做出来
光用midp1.0的话不知道说不定就只能用楼上的方法作了。
root3646 2004-02-17
  • 打赏
  • 举报
回复
关注
UP
aaronyes 2004-02-16
  • 打赏
  • 举报
回复
关注
minghui000 2004-02-16
  • 打赏
  • 举报
回复
up
tlq2000 2004-02-16
  • 打赏
  • 举报
回复
希望对大家有点帮助

  各点像素的RGB值是按一定比例混合而成的,这个比例由Alpha值决定,具体算式见下:

  Alpha = 0 ~ 100
  R = ( R1 * (100 - Alpha) + R2 * Alpha ) / 100
  G = ( G1 * (100 - Alpha) + G2 * Alpha ) / 100
  B = ( B1 * (100 - Alpha) + B2 * Alpha ) / 100

  示例:
  RGB1 ( 232, 54, 13 )
  RGB2 ( 94, 186, 233 )

  Alpha = 30
  R = ( 232 * 70 + 94 * 30 ) / 100 = 190.6 -> 190
  G = ( 54 * 70 + 186 * 30 ) / 100 = 93.6 -> 93
  B = ( 13 * 70 + 233 * 30 ) / 100 = 79
  Alpha = 50
  R = ( 232 * 50 + 94 * 50 ) / 100 = 163
  G = ( 54 * 50 + 186 * 50 ) / 100 = 120
  B = ( 13 * 50 + 233 * 50 ) / 100 = 123

这样在Java中可以对以上计算方法封装成函数或类,以方便代码复用,对应的Java代码如下:
protected Color calculateAlphaValue(Color c1, Color c2, int alpha)
{
if (alpha < MIN_ALPHA)
alpha = MIN_ALPHA;
else if (alpha > MAX_ALPHA)
alpha = MAX_ALPHA;

int R = (c1.getRed() * (MAX_ALPHA - alpha) + c2.getRed() * alpha) / MAX_ALPHA;
int G = (c1.getGreen() * (MAX_ALPHA - alpha) + c2.getGreen() * alpha) / MAX_ALPHA;
int B = (c1.getBlue() * (MAX_ALPHA - alpha) + c2.getBlue() * alpha) / MAX_ALPHA;

return new Color(R, G, B);
}

加载更多回复(33)

13,097

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧