Problema método no de ajustar brilho na Imagem

Fala galera.

Estou tentando inserir mais brilho na minha imagem através deste método, contudo ele só me devolve uma imagem preto e branco. Tentei implementar essa função de outras maneiras, usando raster e convertendo a imagem para HSB. Mas nos testes que fiz, me pareceu que eu estava trabalhando somente com um canal de cor, e eu não soube resolver.

O código abaixo dá o brilho na img, contudo apresenta ela em Preto e Branco.

public BufferedImage brilho(float brilho) { BufferedImage imagem_brilho; imagem_brilho = cor; int pixel = 0;
    for (int i = 0; i < imagem_brilho.getWidth(); i++) {
        for (int j = 0; j < imagem_brilho.getHeight(); j++) {
        	//Estudar método Color
        	Color c = new Color(imagem_brilho.getRGB(i, j));
            int cinza = ((c.getRed() + c.getGreen() + c.getBlue()) / 3);
            pixel = (int) (1 * cinza + brilho);

            if (pixel > 256) {
                pixel = 256;
            } else if (pixel < 0) {
                pixel = 0;
            }
            Color pixel_final = new Color((int) pixel, (int) pixel, (int) pixel);
            imagem_brilho.setRGB(i, j, pixel_final.getRGB());

        }
    }
    return imagem_brilho;
}

Meu BufferedImage “cor” vem de:

public BufferedImage imagemColorida(BufferedImage img) { cor = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = cor.getGraphics(); g.drawImage(img, 0, 0, null); g.dispose(); return cor; }

Que valor é passado para o parâmetro brilho? É entre 0 e 1 ou 0 e 100 (percentual)? Qual o objetivo de calcular o brilho em cima do valor de cinza do pixel?

Você está setando o mesmo valor para todos os canais (R, G e B), por isso deve estar obtendo uma imagem preto e branco. Você precisa ajustar o brilho de cada canal individualmente. Algo mais ou menos assim:

int vermelho = c.getRed();
int verde = c.getGreen();
int azul = c.getBlue();

vermelho = (1 * vermelho + brilho);
verde = (1 * verde + brilho);
azul = (1 * azul + brilho);

// mantém os valores no intervalo 0-255, basicamente o mesmo que o seu if
vermelho = Math.max(Math.min(255, vermelho), 0);
verde = Math.max(Math.min(255, verde), 0);
azul = Math.max(Math.min(255, azul), 0);

Color pixel_final = new Color((int) vermelho, (int) verde, (int) azul);
imagem_brilho.setRGB(i, j, pixel_final.getRGB());

Deu uma olhada em outras referências? Para HSV, achei este por exemplo: https://stackoverflow.com/questions/46797579/how-can-i-control-the-brightness-of-an-image .

Abraço.

1 curtida

Olá terraSkill
o parâmetro passado é de 0-100, vou especificar isso com um comentário. E sobre a escala de cinza, creio que realmente você me ajudou a encontrar o problema, pois estava usando a escala cinza como o filtro para aumentar o brilho. (montei um frankstein) vou ajustar conforme você falou e em seguida respondo aqui! Obrigado!