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.
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:
- Criar uma nova imagem com o tipo INT_ARGB;
- Calcular a média dos canais R, G e B;
- 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.