[RESOLVIDO] Criar um BufferedImage cinza

14 respostas
O

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

14 Respostas

V

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.

O

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.

V

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);
O

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?

K

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é.

K

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é.

V

É 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.

O

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 );
V

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?

O

"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);
V

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.

O

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

V

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.

O

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

Criado 9 de setembro de 2010
Ultima resposta 9 de set. de 2010
Respostas 14
Participantes 3