Como alterar a semi-transparência de uma imagem em J2ME

n95.jpgMostrarei um código básico para deixar uma imagem transparente, respeitando a transparência já existente na imagem. Por exemplo, se eu aplicasse 50% a mais de transparência numa imagem, e esta imagem já tivesse pixels semi-transparentes com 50% de transparência, estes pixels ficariam 75% transparentes, enquanto que os outros pixels que não tinham transparência ficariam 50% transparentes.

Veja as duas imagens ao lado. A imagem PNG-24 da motocicleta está com transparência de 70%. Ocorre que ela já possuía pixels semi-transparentes em sua extremidade, e quando aplicamos a transparência de 70%, mesmo estes pixels que já eram trasnparentes ficaram 70% mais transparentes do que já eram.

Procurei bastante na internet por um método para fazer isso, mas não encontrei. O mais perto que cheguei foi de um método que deixava a imagem semi-transparente, mas não respeitava os pixels que já eram semi-transparentes. Isso não poderia ser usado numa imagem PNG-24 com pixels semi-transparentes.

O código é bem simples. Ele trabalha em cima do array ARGB da imagem. Veja:

    public Image transparentImage(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 transparente, respeitando a transparência já existente        
        for (int i = 0; i < rgb.length; i++)

            rgb[i] = (((porcentagem * ((rgb[i] & 0xFF000000) >>> 24))
                     / 100) * 0×1000000) + (rgb[i] & 0×00FFFFFF); 

        //Cria a imagem final com base no vetor RBG com transparência alterada

        return Image.createRGBImage(rgb, largura, altura, true);    
    }


Para usar esse método, basta eu chamá-lo da seguinte forma:

Image imagem = Image.createImage(”\foto.png”);
imagem = transparentImage(imagem, 50); 

Isso fará com que a imagem fique 50% transparente.

O núcleo do método, é o for, que percorre todos os pixels da imagem, agindo sobre cada um deles. Para cada um faz o cálculo da nova cor, levando em consideração a transparência já existente.

Para deixar um pixel semi-transparente precisa-se apenas alterar o canal alpha da cor. O canal alpha da de uma cor é representado pelo FF neste exemplo de cor:

int cor = 0xFF554422

É isso! Agora você já sabe como fazer para deixar suas imagens semi-transparentes em J2ME.

Bons códigos!



Sobre o Autor

Este artigo foi escrito por Nelson Pereira Junior.
Nelson é desenvolvedor há 12 anos. Hoje desenvolve aplicações Web e Móveis na Abacomm Brasil cuidando do desenvolvimento server-side J2EE, banco de dados, design de aplicações móveis, e desenvolvimento móvel usando várias plataformas como BlackBerry, J2ME, FlashLite, Android, etc. Para conversar com o autor use o e-mail, MSN e GTalk npereirajr@gmail.com.



Receba artigos em seu e-mail

Receba os novos artigos do blog em seu e-mail. E-Mail:



Deixe um comentário

blogarama.com Globe of Blogs EatonWeb Blog Directory