[RESOLVIDO] Criar um BufferedImage cinza

Gente e tenho um bufferImage que foi criado dessa forma:

icm = new IndexColorModel(8,256,r,g,b);
bf =  new BufferedImage(mapWidth,mapHeight,BufferedImage.TYPE_BYTE_INDEXED,icm);

Eu quero criar outro BufferedImage mas que seja uma imagem completamente cinza. Como posso fazer?
Para ser mais precisa eu quero criar uma imagem que tenha um tamanho que não é padrão, ou seja, o tamanho vai depender do mapWidth e do mapHeight do primeiro BufferedImage. Mas essa imagem é apenas formada da cor cinza.
Obrigada

Nessa página tem um conjunto de classes que te permite fazer basicamente tudo que um Photoshop da vida faz:
http://www.jhlabs.com/ip/filters/index.html

São filtros, fáceis de usar e muito velozes.

Muito legal essa página Vini, mas eu creio q eu precise de alguma coisa muito mais simples. Quero criar um BufferedIamge de tamanho x,y (altura, largura) preenchido com a cor cinza.

Você pode usar o TYPE_BYTE_GRAY ou o TYPE_USHORT_GRAY.
O segundo tem mais tons de cinza que o primeiro.

bfCinza =  new BufferedImage(bf.getWidth(), bf.getHeight(), BufferedImage.TYPE_USHORT_GRAY);

então eu teria que fazer assim?

bfCinza =  new BufferedImage(bf.getWidth(), bf.getHeight(), BufferedImage.TYPE_USHORT_GRAY);  
Graphics g = bfCinza.createGraphics(); 
g.setColor( Color.GRAY);   
g.fillRect( 0, 0, width, height );  

Ou eu estou complicando demais?

Achei algo perdido/escondido aqui e talvez sirva:

	public BufferedImage newImage(int width, int height, int type)
	{
		switch (type)
		{
			case BufferedImage.TYPE_BYTE_INDEXED:
			{
				BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, byteIndexed216ColorModel);
				Arrays.fill(((DataBufferByte)image.getRaster().getDataBuffer()).getData(), (byte) 129);
				return image;
			}
			case BufferedImage.TYPE_USHORT_555_RGB:
			{
				BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_555_RGB);
				Arrays.fill(((DataBufferUShort)image.getRaster().getDataBuffer()).getData(), (short) 0x4E73);
				return image;
			}
			case BufferedImage.TYPE_INT_RGB:
			{
				BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
				Arrays.fill(((DataBufferInt)image.getRaster().getDataBuffer()).getData(), 0x00999999);
				return image;
			}
			case BufferedImage.TYPE_INT_ARGB:
			{
				BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
				Arrays.fill(((DataBufferInt)image.getRaster().getDataBuffer()).getData(), 0xFF999999);
				return image;
			}
		}
		return null;
	}

Inté.

Faltou a parte de como criar o IndexColorModel "cúbico" de 216 cores:

	public static IndexColorModel create216ColorModel()
	{
		byte[] r = new byte[216];
		byte[] g = new byte[216];
		byte[] b = new byte[216];
		int i = 0;
		int j = 0;
		int k = 0;
		int l = 0;
		for (i = 0;i < 6;i++)
		{
			for (j = 0;j < 6;j++)
			{
				for (k = 0;k < 6;k++)
				{
					r[l] = (byte) ((51 * i) & 0xFF);
					g[l] = (byte) ((51 * j) & 0xFF);
					b[l] = (byte) ((51 * k) & 0xFF);
					l++;
				}
			}
		}
		return new IndexColorModel(8, 216, r, g, b);
	}

Inté.

É isso mesmo. Mas essa imagem, criada com o tipo de GRAY nunca poderá ter cor. Se você quiser que tenha cor, crie com o mesmo tipo da anterior e use o mesmo método de desenho que vc já usou.

Desculpa Vini, mas eu não entendi o que vc disse…
:frowning:
eu teria que fazer assim então:

bfCinza =  new BufferedImage(bf.getWidth(), bf.getHeight(), BufferedImage.TYPE_INT_RGB ); 

Existem duas coisas:

  1. O tipo da imagem, que define quantos bytes ela gastará para representar cores, quais cores serão representadas e de que forma (indexada ou direta);
  2. A imagem em si.

Você pode ter uma imagem que suporte o desenho colorido, mas que casualmente só foi desenhado com cinza (ou seja, uma imagem do tipo INT_RGB ou INT_ARGB, pintada inteiramente de cinza).
E você pode ter uma imagem que só tenha tons de cinza, e jamais vá aceitar qualquer tipo de cor (do tipo GRAY). Nesse caso, se você pintar cores na imagem, elas serão convertidas para um tom de cinza.

A questão é, o que você precisa?

"E você pode ter uma imagem que só tenha tons de cinza, e jamais vá aceitar qualquer tipo de cor (do tipo GRAY). Nesse caso, se você pintar cores na imagem, elas serão convertidas para um tom de cinza. " Eu preciso disso. Então, para que isso aconteça, eu devo excluir a linha onde eu seto uma cor, ou seja, não definir cor alguma, é isso?

gr.setColor( Color.GRAY); // eu devo excluir essa linha do meu código? Ou devo colocar um outro valor aqui?
gr.fillRect( 0, 0, mapWidth+400, mapHeight+400);

Não, vc ainda precisa do setColor. Ele dirá qual é o tom de cinza a ser usado.

No caso de criar uma imagem com TYPE_USHORT_GRAY, você pode usar qualquer cor (GRAY, RED, YELLOW) que sairá cinza. Só o que muda é o tom. Aí é só achar o tom que você precisa.

ah tah valeu Vini!!! Entendi… agora soh preciso saber como faço pra colocar tudo isso dentro de um JLabel…

Você pode colocar no JImagePanel (que aceita um BufferedImage direto).

Ou usar o setIcon do JLabel. Um dos construtores da classe ImageIcon aceita um Image. E todo BufferedImage é um Image.

Valeu Vini!!! Mais uma vez vc me salvou!