Mostrarei um código básico para deixar uma imagem em tons de cinza, ou grayscale.
O algoritmo para deixar uma imagem em tons de cinza é muito simples. Levando-se em conta que cada pixel de uma imagem possui 4 valores ARGB, representando o canal de transparência (A=Alpha), o canal de vermelho (R=Red), o canal de verde (G=Green), e o canal de azul (B=Blue), devemos alterar os canais RGB, mantendo o canal alpha inalterado.
Mas como calcular o tom de cinza de um pixel pelos canais RGB? Basta calcular a média aritmética dos 3 canais e usar esse valor como o novo valor de R, G e B.
Canal Cinza = ((R+G+B) / 3 )
Por exemplo, um pixel que tenha:
A=10, R=120, G=30, B=45
Calcularíamos o canal cinza assim: (120 + 30 + 45) /3 = 56.
Então montaríamos a nova cor do pixel repetindo o canal cinza nos canais RGB, ficando assim:
A=10, R=56, G=56, B=56
Fazendo isso com todos os pixels da imagem, deixando os valores RGB iguais, com o valor da médias dos 3 canais de cores, fará com que a imagem fique em tons de cinza, como mostra a imagem ao lado.
O código é bem simples. Ele trabalha em cima do array ARGB da imagem. Veja:
public Image grayscaleImage(Image imgOriginal, int porcentagem) {
//Guarda a largura e altura da imagem
int largura = imgOriginal.getWidth();
int altura = imgOriginal.getHeight();
//Cria o vetor RGB da imagem destino, com o mesmo tamanho da imagem origem
int[] rgb = new int[largura * altura];
//Preenche o vetor RGB com as cores dos pixels da imagem origem
imgOriginal.getRGB(rgb, 0, largura, 0, 0, largura, altura);
//Deixa a imagem em tons de cinza
int gray;
for (int i = 0; i < rgb.length; ++i) {
gray = (((rgb[i] >> 16) & 0xff) + ((rgb[i] >> 8) & 0xff) + (rgb[i] & 0xff)) / 3;
rgb[i] = (((rgb[i] >> 24) & 0xff) << 24) | (gray << 16) | (gray << 8) | gray;
}
//Cria a imagem final com base no vetor RBG com transparência alterada
return Image.createRGBImage(rgb, largura, altura, true);
}
Continue reading ‘Como deixar uma imagem em tons de cinza em J2ME’ »