【发布时间】:2012-04-01 22:29:08
【问题描述】:
图像测试:原始图像,
Image testt : 应用透明度后的图像
在我的笔记本电脑中,我想要透明的颜色变成透明的,test 和 testt 都被渲染了,但是在没有绘制 testt 图像的地方,绘制了测试但没有绘制 testt。
绘制简单透明图片的完整代码:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;
import java.io.Serializable;
public class test extends Applet implements Runnable
{
public static Image makeColorTransparent(Image im, final Color color)
{
ImageFilter filter = new RGBImageFilter()
{
public int markerRGB = color.getRGB() | 0xFF000000; //color to make transparent
public final int filterRGB(int x, int y, int rgb)
{
if ( ( rgb | 0xFF000000 ) == markerRGB )
{
// Mark the alpha bits as zero - transparent
return 0x00FFFFFF & rgb;
}
else
{
// nothing to do
return rgb;
}
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
Image test;
public void init()
{
setSize(600,600);
}
public void update (Graphics g) //overriding the update for double buffering
{
// initialize buffer
Image dbImage = createImage (this.getSize().width, this.getSize().height);
Graphics dbg = dbImage.getGraphics ();
// clear screen in background
dbg.setColor (getBackground());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// draw elements in background
dbg.setColor (getForeground());
paint (dbg);
// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}
public void paint(Graphics g)
{
test = getImage(getCodeBase (), "tt.gif");
Image testt = makeColorTransparent(test, Color.white);
g.drawImage (testt,0,0, this);
}
@Override
public void run() {
// TODO Auto-generated method stub
repaint();
}
}
【问题讨论】:
-
会不会与 32/64 位环境有关?我不确定 64 位 java 是否使用 64 位颜色,但如果是,那可能是你的问题,因为位掩码搞砸了。
-
您确定文件“tt.gif”确实存在于您启动应用程序的其他计算机上吗?并且在应用程序找到它所需的确切路径上?
-
是的,tt.gif 位于两台计算机项目文件夹的 bin 文件夹中...
-
由于您使用与图像输入相同的 GIF 文件,我现在怀疑还有别的东西。也许,您应该提供有关这两个系统的更多信息:它的操作系统、它的 JRE 版本? OS/JRE 中的 32 位还是 64 位?专用 GPU 还是集成 GPU?
-
@Accatyyc 颜色深度不会随 CPU 位数而变化,并且无论 VM 如何,Java 的数据类型大小都相同。 (也就是说,
int在 32 位和 64 位 JVM 上都是 32 位宽,并且它们都使用相同的运行时,其中像素为ints。)
标签: java transparency