Piszę metodę, która podmienia piksele o danym kolorze na obrazie na przezroczyste.
/**
*
* @param im - obraz, na którym zamienimy tło na przezroczyste
* @param bColor - kolor tła obrazka
*/
public void removeBackground(BufferedImage im, Color bColor) {
ColorModel model = im.getColorModel();
WritableRaster raster = im.getRaster();
int width = im.getWidth();
int height = im.getHeight();
int argb, transparent = new Color(0xffffffff, true).getRGB();
Object data, transparentData = model.getDataElements(transparent, null);
long c = 0;
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
data = raster.getDataElements(j, i, null);
argb = model.getRGB(data);
if (new Color(argb, true).equals(bColor)) {
raster.setDataElements(j, i, transparentData);
++c;
}
}
}
System.out.println("Kolor występował na " + c * 100.0 / (width * height) + " % pikseli obrazu.");
// na testowym obrazie piksel o wsp (0,0) ma kolor tła - powinien zostać podmieniony
System.out.println(java.util.Arrays.toString(raster.getPixel(0, 0, new int[4])));
}
Niestety, po zastosowaniu tego kodu piksele tła mają kolor biały, zamiast oczekiwanego przezroczystego.
Piksel (0,0) (powinien zostać podmieniony) ma wartość:
[255, 255, 255, 0] , gdzie ostatnie 0 jest wartością kanału alpha.
Potrafię podmienić tło na każdy kolor za wyjątkiem transparent.
Proszę o pomoc.
edit:
Obrazy są w formacie *.png.