# LookupOp und Alpha-Kanal



## Gast (19. Sep 2008)

Servus. Ich habe ein BufferedImage vorliegen, das mit *TYPE_INT_ARGB* erzeugt wird. Wenn ich jetzt mit einer LookupOp bestimmte Farbbereiche ersetzen will, benutze ich folgenden Code-Schnippsel:


```
public class ColorReplaceLookupTable extends LookupTable {
    private Color   srcColor;
    private Color   dstColor;
    
    public ColorReplaceLookupTable(Color srcColor, Color dstColor) {
        super(0, 1);
        this.srcColor = srcColor;
        this.dstColor = dstColor;
    }
    
    @Override
    public int[] lookupPixel(int[] src, int[] dest) {
        if (src[0] == srcColor.getRed() &&
            src[1] == srcColor.getGreen() &&
            src[2] == srcColor.getBlue() &&
            src[3] == srcColor.getAlpha())
        {
            src[0] = dstColor.getRed();
            src[1] = dstColor.getGreen();
            src[2] = dstColor.getBlue();
            src[3] = dstColor.getAlpha();
        }
        return src; 
    }
}
```

Die Bilder werden angezeigt, die Pixel bis zu einem bestimmten Punkt ersetzt und es kommt zu einem Abbruch. 
src[3] ist wohl Fehl am Platz. Es erscheint die Fehlermeldung:

_Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 2
        at SN32.Editor.Tileset_Elements.ColorReplaceLookupTable.lookupPixel(ColorReplaceLookupTable.java:18)
        at java.awt.image.LookupOp.filter(LookupOp.java:300)
        at java.awt.image.LookupOp.filter(LookupOp.java:204)
        at SN32.Editor.Tabs.EditTilesetTab.run(EditTilesetTab.java:73)
        at java.lang.Thread.run(Thread.java:595)_

Wie kann man dennoch mit so einer LookupTable die Alpha-Kanäle erfassen - wenn anscheinend nicht so?

Wäre schön, wenn ihr mir helfen könnten  :?


----------



## Gast (19. Sep 2008)

Edit:

Hier wird der ganze Spaß ausgeführt.


```
public void run() {
        this.transparentChooser.getAssignButton().setEnabled(false);
        BufferedImageOp convertOp   = new LookupOp(new ColorReplaceLookupTable(new Color(0, 0, 0, 127), new Color(255, 0, 0, 127)), null);
        TileMap         tm          = this.tilesetPreview.getBackgroundScrollPane().getTileMap();
        System.out.println();
        
        BufferedImage tempImg = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB);
                
        for (int y = 0; y < tm.getHeight() ; y++) {
            for (int x = 0; x < tm.getWidth() ; x++) {
                tempImg.getGraphics().drawImage(tm.getTileImageAt(x, y), 0, 0, null);
                tm.setTileImageAt(convertOp.filter(tempImg, null), x, y);
                System.out.print(".");
            }
            System.out.println();
        }
        this.transparentChooser.getAssignButton().setEnabled(true);
    }
```


----------



## Marco13 (21. Sep 2008)

Hm. Ich hätte jetzt gedacht, dass das zweite, was bei
 super(0, 1); 
übergeben wird, die Anzahl der components ist, und in diesem Fall dann "4" sein müßte, allerdings müßte es dann schon früher (nämlich bei 1) mit einer Exception abkacheln - kannst ja mal schauen, ob's mit 4 funktioniert, wenn nicht, muss man nochmal genauer nachgucken.


----------

