Coloring gray image

Hi,
I’ve tried to create coloring gray image with given colour but it always failed. I know I have to use BufferedImage and load all pixels of source image into array, but I don’t know how to work with color value, so there always were some weird colors after multiplying source color and given color.

Thanks for any help.

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