Aplicando Anti-aliasing em Java

 

Anti-aliasing é um processo muito amplo que envolve, dentre as muitas, técnicas de suavização de bordas em fontes, imagens, figuras geométricas, etc. O objetivo deste artigo é demonstrar seu uso em Java.

 

Uma bola de sinuca

Será usado ao longo do artigo uma bola de sinuca; primeiro por ser simples de desenhar e por se tratar de uma forma circular (é em formas circulares que o anti-aliasing é mais necessário).

 

Uma bola de sinuca será desenhada, utilizando ferramentas da classe Graphics do pacote java.awt, através de uma classe que extende JPanel, de acordo com a Listagem 01.

 

public void paintComponent(Graphics g){

      super.paintComponent(g);

     

      g.setColor(Color.BLACK);

      g.fillOval(10, 10, 200, 200);

           

      g.setColor(Color.WHITE);

      g.fillOval(80, 40, 100, 100);

 

      g.setFont(new Font("Tahoma", Font.BOLD, 64));

      g.setColor(Color.BLACK);

      g.drawString("8", 112, 110 );

}

Listagem 01

 

Ao ser visualizada, a bola de sinuca apresenta contornos simples e “quebradiços”. O anti-aliasing vem agora pra dar uma aparência melhor pois esses contornos ficarão suavizados.

 

asaajfig01.jpg 

Figura 01 – bola de sinuca sem anti-aliasing.

 

A bola de sinuca com Anti-aliasing

Para desenhar a bola de sinuca de acordo com a Listagem 01, foram utilizadas ferramentas de desenho da classe Graphics. Para aplicar o anti-aliasing, será utilizada Graphics2D, também do pacote java.awt.

 

Os métodos utilizados (setColor, setFont, fillOval, drawString, etc) serão chamados novamente, porém não pela instância g de Graphics. A Listagem 02 mostra como:

 

public void paintComponent(Graphics g){

      super.paintComponent(g);

     

      Graphics2D g2 = (Graphics2D)g;

     

      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

            RenderingHints.VALUE_ANTIALIAS_ON);

                 

      g2.setColor(Color.BLACK);

      g2.fillOval(10, 10, 200, 200);

     

      g2.setColor(Color.WHITE);

      g2.fillOval(80, 40, 100, 100);

     

      g2.setFont(new Font("Tahoma", Font.BOLD, 64));

      g2.setColor(Color.BLACK);

      g2.drawString("8", 112, 110 );

}

Listagem 02.

 

Cria-se a instância g2 que é igual a (Graphics2D)g, ou seja, efetua-se um casting em g para que a primeira possa chamar os mesmos métodos.

 

Em seguida, g2 chama o método setRenderingHint e passa duas constantes que irão “ligar” o anti-aliasing nos desenhos feitos por g2. A partir daí os métodos são os mesmos, porém chamados pela instância de Graphics2D.

 

Ao ser exibida, a bola de sinuca apresenta agora bordas suavizadas.

 

asaajfig02.jpg 

Figura 02 – bola de sinuca com anti-aliasing.

 

Demonstrando a diferença
Está disponível para download o código de mini-aplicação onde se tem a bola de sinuca desenhada com e sem anti-aliasing. Quando se clica na imagem ele desenha de uma das formas para que se possa compará-las.

 

Conclusão

A utilização de anti-aliasing reduz a performance da aplicação, principalmente quando há movimentos de imagens. Mas a diferença na aparência é tanta que é difícil imaginar um jogo, por exemplo, que não aplique essas técnicas. Vale a pena pagar o preço.

 

Um grande abraço e até a próxima.

Adriano S. Castro