Here is some code I have used before, I beleive you could also use a BufferedImageFilter.
/**
* Create a new BufferedImage from the information provided.
*
* @param pixels The color information stored as an integer. The 4 bytes of the integer are used for each color attribute, the first byte is the alpha information and the last 3 are the RGB(Red Green Blue) values.
* @param width The width in pixels of the image.
* @param height The height in pixels of the image.
* @return A new image created from the information.
*/
static public BufferedImage makeImage(int[] pixels, int width, int height) {
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
img.setRGB(0,0,width, height, pixels, 0, width);
return img;
}
/**
* This function creates an integer array from the pixel colors of the image passed into it.
*
* @param img The source image.
* @return An integer array containing the color information. The 4 bytes of the integer are used for each color attribute, the first byte is the alpha information and the last 3 are the RGB(Red Green Blue) values.
*/
static public int[] grabPixelsOld(BufferedImage img) {
int w = img.getWidth();
int h = img.getHeight();
int[] pixels = new int[w * h];
try {
img.getRGB(0,0,w,h,pixels, 0, w);
} catch (Exception e) {
System.err.println("interrupted waiting for pixels!");
return null;
}
return pixels;
}
/**
* This function creates an integer array from the pixel colors of the image passed into it.
*
* @param img The source image.
* @return An integer array containing the color information. The 4 bytes of the integer are used for each color attribute, the first byte is the alpha information and the last 3 are the RGB(Red Green Blue) values.
*/
static public int[] grabPixels(BufferedImage img) {
if(img.getRaster().getDataBuffer() instanceof DataBufferInt)
return ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
else
return grabPixelsOld(img);
}
/**
* Create a new BufferedImage that is a color version of the original grayscale image.
*
* @param grayscaleImg The source image to be colored.
* @param newColor The color to use for the coloring of the image.
* @return The new color image.
*/
static public BufferedImage colorImage(BufferedImage grayscaleImg, Color newColor){
int [] pixels = grabPixels(grayscaleImg);
if (pixels==null || newColor == null)
return grayscaleImg;
int r, g, b, a, shade, red, green, blue, color;
red = (0x00FF0000 & newColor.getRGB()) >> 16;
green = (0x0000FF00 & newColor.getRGB()) >> 8;
blue = (0x000000FF & newColor.getRGB());
for (int i=0; i<pixels.length;i++){
a = pixels[i] >> 24;
if(a!=0){
shade = (0x000000FF & pixels[i]);
r = (red*shade/255);
g = (green*shade/255);
b = (blue*shade/255);
a <<= 24;
r <<= 16;
g <<= 8;
//b <<= 0;
color = a|r|g|b;
pixels[i] = color;
}
}
return makeImage(pixels, grayscaleImg.getWidth(), grayscaleImg.getHeight());
}