No Java temos uma classe muito importante para se trabalhar com conversão do espaço de cores em imagens: java.awt.image.ColorConvertOp. Essa classe realiza a conversão pixel a pixel do espaço de cores. Dessa forma, podemos facilmente converter uma imagem de um espaço de cores qualquer para algum definido. É necessário apenas criar um objeto dela passando o espaço de cores de origem e o de destino e depois chamar o método filter passando as duas imagens (origem e destino).
Por exemplo, se desejamos converter uma imagem de colorida para preto e branco, basta executar o seguinte código:
BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_BINARY); ColorConvertOp op = new ColorConvertOp(src.getColorModel() .getColorSpace(), dest.getColorModel().getColorSpace(), null); op.filter(src, dest);
Na linha 1 é criada uma imagem cinza não indexada (BufferedImage.TYPE_BYTE_GRAY) com o mesmo tamanho da imagem de origem (src.getWidth(), src.getHeight()). Os tipos você pode consultar no javadoc da java.awt.image.BufferedImage. Na linha 4 é criado um objeto que faz a conversão no espaço de cores e é passado os dois espaços de cores (origem e destino) a partir do ColorModel da imagem (img.getColorModel().getColorSpace()). Após isso é só invocar o método filter passando as duas imagens como parâmetro (linha 7).
Abaixo segue o resultado de conversão da bandeira do Brasil (primeira imagem), com três tipos de imagens: TYPE_BYTE_BINARY (segunda imagem), TYPE_BYTE_GRAY (terceira imagem) e TYPE_3BYTE_BGR (quarta imagem).
A conversão feita com o tipo TYPE_BYTE_BINARY foi utilizado no artigo do CAPTCHA para remoção do fundo.
Show, muito massa !!!