I want to do a simple color replace on a BufferedImage, in java.
Here is my code:
public BufferedImage convertEDEDEDtoRGB(BufferedImage bufferedImage,
short nr, short ng, short nb){
short[] r = new short[256];
short[] g = new short[256];
short[] b = new short[256];
short[] a = new short[256]; //leave a the same
for(short i=0; i<r.length; i++) {
r[i]=i;
g[i]=i;
b[i]=i;
a[i]=i;
}
System.out.println("componentSize "+bufferedImage.getColorModel().getComponentSize());
for(int i = 0; i<bufferedImage.getColorModel().getComponentSize().length; i++)
System.out.println("rgb ("+i+") " +bufferedImage.getColorModel().getComponentSize(i) ); //gives 8 bits
System.out.println("num Components "+bufferedImage.getColorModel().getNumColorComponents()); // gives 3
r[237] = nr;
g[237] = ng;
b[237] = nb;
short[][] ededed2rgb = new short[][]{r, g, b, a};
ShortLookupTable t = new ShortLookupTable(0, ededed2rgb);
LookupOp ededed2rgbOp = new LookupOp(t, null);
bufferedImage = ededed2rgbOp.filter(bufferedImage, null);
return bufferedImage;
}
This yields the following error, and I just do not see what I am mising:
Number of color/alpha components should be 4 but length of bits array is 2
at java.awt.image.ColorModel.<init>(ColorModel.java:318)
at java.awt.image.ComponentColorModel.<init>(ComponentColorModel.java:256)
at java.awt.image.LookupOp.createCompatibleDestImage(LookupOp.java:396)
at java.awt.image.LookupOp.filter(LookupOp.java:136)
at nl.sytematic.projects.myproj.server.custom.MyServlet.convertEDEDEDtoRGB(GenerateFlavourImageServlet.java:225)
I tried with
new short[][] { r,g,b}
but the same error pops up. Any thoughts? I am loading a .png image (with transparency) by the way.
I changed the filter call into
ededed2rgbOb.filter(bufferedImage, bufferedImage)and the error is gone. Found this out by inspecting the code at link. Supplying a second parameter effectively bypasses thecreateCompatibleDestImage.