如何将BufferedImage中的某种颜色(0xFF00FF)设置为透明?

时间:2013-10-29 22:38:52

标签: java transparency bufferedimage

我在使用Java构建的视频游戏中遇到了一个相当令人不安的问题。在您将其设置为垃圾邮件之前,请注意我已经查看了这两个链接,但他们没有以任何方式帮助我:

  1. Drawing a transparent BufferedImage over a non-transparent BufferedImage
  2. Making a Certain Color on a BufferedImage Become Transparent
  3. 我需要做的是从我的精灵中获取颜色0xFF00FF并将其设置为透明,以便显示charecter,而不仅仅是他背后的背景。这就是我所拥有的:

    (抱歉没有足够的“声望”,但这里是图片的链接。) https://plus.google.com/photos/yourphotos?enfplm&hl=en&utm_source=lmnavbr&utm_medium=embd&utm_campaign=lrnmre&rtsl=1&partnerid=selm0&pid=5940308896707611042&oid=114903427794927596233

    我有一个主要的BufferedImage和一个像素[]数组,用于该图像中的数据,然后我将关卡渲染到屏幕,然后渲染播放器。这是我在渲染之前更新图像的方法:

    private void tickImage() {
    
        final int centerY = (HEIGHT / 2) - (48 / 2);
        final int centerX = (WIDTH / 2) - (48 / 2);
    
        display.clear();
        display.renderBlock(StoneBlock.block, xMove, yMove);
    
        display.renderPlayer(knight, centerX, centerY);
    
        for (int a = 0; a < pixels.length; a++) {
            pixels[a] = display.pixels[a];
        }
    }
    

    如果您想查看其余代码,请随时访问:

    https://github.com/NikolaAndMichael/WarDungeon/tree/master/WarDungeon/src/net/naprav/wardungeon

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

像这样:

BufferedImage img = ...;
for (int x = 0; x < img.getWidth(); ++x)
for (int y = 0; y < img.getHeight(); ++y)
{
   if ((img.getRGB(x, y) & 0x00FFFFFF) == 0xFF00FF) 
   {
       img.setRGB(x, y, 0);
   }
}

这样做是迭代每个像素并测试红色,绿色和蓝色组件以匹配0xFF00FF。如果匹配,请将颜色设置为透明黑色(0x00000000)。为了仅测试RGB通道而不测试alpha通道,请使用按位运算符来过滤掉Alpha通道数据。