代码之家  ›  专栏  ›  技术社区  ›  Derry

为什么我去除这种颜色的方法不起作用?

  •  0
  • Derry  · 技术社区  · 7 年前

    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();
        }
      }
    

    它可以运行和编译,但当我渲染它时,sprite的效果完全相同。(编辑:可能需要注意的是,我的paintComponent(g)方法中没有super.paintComponent(g)。精灵是。BMP。 this what the sprite looks like

    3 回复  |  直到 7 年前
        1
  •  3
  •   Erwin Bolwidt    7 年前

    您仅使用以下方法检索像素: BufferedImage.getRGB 。返回一个 复制 缓冲区图像某个区域中的数据。

    您对 int[]

    BufferedImage.setRGB 在您更改

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

    您可能应该做另一个更改(这涉及到一些猜测,因为我没有您的bmp来测试)-返回的BuffereImage ImageIO.read 可能有类型 BufferedImage.TYPE_INT_RGB sprite.getType() ,如果打印出来的话 1 它是TYPE\u INT\u RGB,没有alpha通道。

    要获得alpha通道,请创建一个大小合适的新BuffereImage,然后设置转换后的 在该图像上,然后从那时起使用新图像:

    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
    
        2
  •  1
  •   Martin Frank    7 年前

    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
    }
    

        3
  •  1
  •   Andrew Thompson    7 年前

    这项工作:

    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;
    }