Imagem com GrayScale

Olá,

tenho uma aplicação com varios icones com imagens e preciso deixar estas imagens
em escala cinza, mas o contorno dos botões estão na cor preta, como resolver?
Alguém tem uma idéia?
segue o que estou fazendo:

class BoxIcon implements Icon {
		private Image img;
		int h, w;
		BoxIcon(Image img, int h, int w) {
			this.img = img;
			this.h = h;
			this.w = w;
		}

		public void paintIcon(Component c, Graphics g, int x, int y) {
			BufferedImage bufferedImage = new BufferedImage (72	, 72,BufferedImage.TYPE_BYTE_GRAY) ; 
			
			Graphics gi = bufferedImage.getGraphics () ; 
		     gi.drawImage ( img, 6 , 6, null ) ; 

		     
		     Graphics2D g2d = ( Graphics2D ) g; 
		     g2d.drawImage ( bufferedImage, null, 0 , 0 ) ; 
		   
		}
		

		@Override
		public int getIconHeight() {
			return 32;
		}

		@Override
		public int getIconWidth() {
			return 32;
		}
	}

onde chamo o método:


public void validaDestaqueBotao() {
		for (Botao b : tela.getBotoes()) {
			// Método de teste
			String metodoTeste = b.getDestacaQuando();
			Object retornoTeste = null;
			if (metodoTeste == null
					|| (metodoTeste != null && metodoTeste.trim().length() == 0)) {
				retornoTeste = false;
			} else {
				try {
					// Executa o método de teste que deve obrigatoriamente ter
					// um booleano como retorno
					retornoTeste = processaMetodoComRetorno(tela.getService(),
							metodoTeste);
				} catch (GenericBusinessException e) {
					throw e;
				} catch (Exception e) {
					retornoTeste = false;
				}
			}
			// Verifica retorno
			if (Boolean.class.isInstance(retornoTeste)) {
				boolean teste = (Boolean) retornoTeste;

				// Recupera o botão da tela
				JButton jb = getBotaoNaTela(b);

				// Caso teste POSITIVO
				if (teste == true) {
					// Desabilita o botão  
					ImageIcon im = (ImageIcon) jb.getIcon();
					Image i = im.getImage();
					jb.setIcon(new BoxIcon(i, jb.getHeight(), jb.getWidth()));

				} 

			}
		}

não entendi muito bem, o problema é para gerar a imagem usando GrayScale, ou tirar a borda ?

pode colocar uma imagem de exemplo ?

gostaria de tirar essa parte preta e volta da imagem.

[img]

[/img]

A borda existe pq vc criou uma imagem maior que a original. E começou a desenhar a original em (6,6).

O que você gostaria de fazer nesse caso? Redimensionar a imagem original?

Se for, é só fazer assim:

    public void paintIcon(Component c, Graphics g, int x, int y) {  
            BufferedImage bufferedImage = new BufferedImage (72 , 72,BufferedImage.TYPE_BYTE_GRAY) ;                 
            Graphics2D gi = bufferedImage.createGraphics () ;   
            gi.drawImage ( img, 0 , 0, 72, 72, null );
            gi.dispose();

            g.drawImage ( bufferedImage, null, 0 , 0 ) ;                
        }

na verdade eu preciso apenas usar a mesma imagem e pintá-la de cinza.
o que voce me passou continua da mesma maneira.
como faço para colocar imagem aqui?

Use o botão de attachments. Fica logo embaixo da caixa onde você digita o texto.

Segue a imagem

Entendi. Seu problema é que sua imagem tem fundo transparente. O TYPE_BYTE_GRAY não suporta transparência.

Você pode usar um programa para gerar as imagens corretamente.

Ou processar a imagem pixel a pixel. Para isso você deve:

  1. Criar uma nova imagem com o tipo INT_ARGB;
  2. Calcular a média dos canais R, G e B;
  3. Atribuir esse valor médio aos canais R, G e B da imagem em níveis de cinza. Mantenha o valor de A igual nas duas imagens.

encontrei este código:

public Image getGrayScaleImage() {
    int[] rgbData = new int[getWidth() * getHeight()];
    image.getRGB(rgbData, 0, getWidth(), 0, 0, getWidth(), getHeight());
    for (int x = 0; x < getWidth() * getHeight(); x++) {
        rgbData[x] = getGrayScale(rgbData[x]);
    }
    Image grayImage = Image.createRGBImage(rgbData, getWidth(), getHeight(), true);
    return grayImage;
}

private int getGrayScale(int c) {
    int[] p = new int[4];
    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level
    p[3] = (int) (c & 0x000000FF); // Blue level

    int nc = p[1] / 3 + p[2] / 3 + p[3] / 3;
    // a little bit brighter
    nc = nc / 2 + 127;

    p[1] = nc;
    p[2] = nc;
    p[3] = nc;

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]);
    return gc;
}

está certo?
e como eu faria para inserir em meu projeto? pois retorna um int.

Pergunta imbecil número um - você quer pegar um botão e desabilitá-lo, é isso? Se for isso, usar setEnabled(false) deve pegar a figura e deixá-la acinzentada, como você quer.

E u não posso desabilitar o botão.
Tenho logo abaixo desta mesma tela, uma aba com perfis,
estes perfis sao de acordo com meus botões (cliente, motorista, despachante, etc).
Se o perfil for por exemplo CLIENTE (estiver marcado no checkbox na aba perfil),
o botão CLIENTE deve ficar cinza informando que esta pessoa é um cliente.
Mas não posso desabilitar o botão.

OK!?

Criei um metodo para deixar a imagem transparente.

GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment
					.getLocalGraphicsEnvironment();
			GraphicsDevice graphicsDevice = graphicsEnvironment
					.getDefaultScreenDevice();
			GraphicsConfiguration graphicsConfiguration = graphicsDevice
					.getDefaultConfiguration();

			// Se a imagem não tem nenhuma fonte de alfa Transparency.OPAQUE
			bufferedImage = graphicsConfiguration.createCompatibleImage(
					img.getWidth(null), img.getHeight(null),
					Transparency.BITMASK);

			// Copis imagem para buffer
			Graphics graphics = bufferedImage.createGraphics();

			// Pinta imagem no buffer
			graphics.drawImage(img, 0, 0, null);
			graphics.dispose();

			// Converte para cinza
			ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
			ColorConvertOp op = new ColorConvertOp(cs, null);
			bufferedImage = op.filter(bufferedImage, null);

Obrigado ViniGodoy pela atenção e pelas dicas.