为什么我的方法不能消除这种颜色?

时间:2017-08-02 03:30:17

标签: java swing bufferedimage

我试图制作一个Mario游戏克隆,而现在,在我的构造函数中,我有一个方法应该使某个颜色透明而不是当前的粉红色(R:255,G:0) ,B:254)。根据Photoshop,十六进制值是ff00fe。我的方法是:

public Mario(){
    this.state = MarioState.SMALL;
    this.x = 54;
    this.y = 806;
    URL spriteAtLoc = getClass().getResource("sprites/Mario/SmallStandFaceRight.bmp");

    try{
      sprite = ImageIO.read(spriteAtLoc);
      int width = sprite.getWidth();
      int height = sprite.getHeight();
      int[] pixels = new int[width * height];
      sprite.getRGB(0, 0, width, height, pixels, 0, width);

      for (int i = 0; i < pixels.length; i++) {

        if (pixels[i] == 0xFFff00fe) {

          pixels[i] = 0x00ff00fe; //this is supposed to set alpha value to 0 and make the target color transparent
        }

      }
    } catch(IOException e){
      System.out.println("sprite not found");
      e.printStackTrace();
    }
  }

它运行并编译,但是当我渲染它时精灵出现完全相同。 (编辑:也许注意我在paintComponent(g)方法中没有super.paintComponent(g)。精灵是.bmps。this what the sprite looks like

3 个答案:

答案 0 :(得分:3)

您只是使用BufferedImage.getRGB检索像素。这将返回BufferedImage的某个区域中的副本数据。

您对返回的int[]所做的任何更改都不会自动反映回图片。

要更新图片,您需要在更改BufferedImage.setRGB后致电int[]

sprite.setRGB(0, 0, width, height, pixels, 0, width);

你应该做的另一个改变(这涉及一些猜测,因为我没有你的bmp进行测试) - ImageIO.read返回的BufferedImage可能有类型BufferedImage.TYPE_INT_RGB - 含义它没有alpha通道。您可以通过打印sprite.getType()进行验证,如果在没有Alpha通道的情况下打印1它的TYPE_INT_RGB。

要获取Alpha通道,请创建一个正确大小的新BufferedImage,然后在该图像上设置转换后的int[],然后使用新图像:

BufferedImage newSprite = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
newSprite.setRGB(0, 0, width, height, pixels, 0, width);
sprite = newSprite; // Swap the old sprite for the new one with an alpha channel

答案 1 :(得分:1)

BMP图片不提供Alpha通道,您必须手动设置(就像在代码中一样)......

当你检查你的像素是否有某种颜色时你必须检查没有alpha(BMP没有alpha它总是0x0)。

if (pixels[i] == 0x00ff00fe) { //THIS is the color WITHOUT alpha
    pixels[i] = 0xFFff00fe; //set alpha to 0xFF to make this pixel transparent
}

所以简而言之:你做得很好,但把它混合了一点^^

答案 2 :(得分:1)

这有效:

enter image description here

private BufferedImage switchColors(BufferedImage img) {
    int w = img.getWidth();
    int h = img.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    // top left pixel is presumed to be BG color
    int rgb = img.getRGB(0, 0); 
    for (int xx=0; xx<w; xx++) {
        for (int yy=0; yy<h; yy++) {
            int rgb2 = img.getRGB(xx, yy);
            if (rgb2!=rgb) {
                bi.setRGB(xx, yy, rgb2);
            }
        }
    }

    return bi;
}