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.
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.
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