Imagem com cantos arredondados no Java

Imagem com canto arredondado em Java

De uns tempos para cá notei uma nova onda dos desenvolvedores em arredondar os cantos da imagens para ficar mais estiloso, realmente o resultado fica bem mais agradável, então vamos ver como se faz isso em Java, vamos começar com o que mais interessa a todos, o código fonte da mágica:

class RoundImage {
 
private static final Stroke stroke = new BasicStroke(1.5f);
 
private RoundImage() { }
 
public static Image getRoundImage(Image imageSource, int radius) {
int width = imageSource.getWidth(null);
int height = imageSource.getHeight(null);
 
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
RoundRectangle2D rect = new RoundRectangle2D.Double(0, 0, width, height, radius, radius);
 
Graphics2D g2 = (Graphics2D) image.getGraphics();
 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
g2.clip(rect);
g2.drawImage(imageSource, 0, 0, null);
 
g2.setStroke(stroke);
g2.setColor(Color.WHITE);
g2.draw(rect);
 
return image;
}
}

O truque baseia-se em criar uma nova instância de BufferedImage com suporte ao canal alpha e restringir a área de trabalho do graphics para um shape do tipo RoundRectangle2D através do método clip presente na classe Graphics2D, após isso é só mandar pintar a imagem original em nossa nova imagem com suporte a alpha e restrição aos cantos para ficar arredondado.

Existe um probleminha, quando utilizamos o clip do objeto Graphics2D, não obtemos o recurso de antialising porque o mesmo não o fornece através do clip, então para conseguirmos o efeito de suavidade desejada nos cantos arredondados podemos fazer um workaround quase inperceptível aí, desenhe um RoundRectangle2D (sem preenchimento, lógico) usando uma cor aproximada ao background, no caso utilizei o branco por ser uma cor que se mistura facilmente com várias outras cores.

Abaixo segue o código fonte de um exemplo de utilização que produz a imagem de exemplo no começo do post.

public class RoundImageSample extends JFrame {
 
public RoundImageSample() {
initComponents();
 
try {
ImageIcon icon = new ImageIcon(new URL("http://www.paulocanedo.com.br/imagens/brasil.jpg"));
 
roundImageLabel.setIcon(new ImageIcon(RoundImage.getRoundImage(icon.getImage(), 30)));
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}
 
private void initComponents() {
roundImageLabel = new javax.swing.JLabel();
 
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("RoundImage, paulocanedo.com.br");
getContentPane().setLayout(new java.awt.GridLayout());
 
roundImageLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
getContentPane().add(roundImageLabel);
 
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-420)/2, (screenSize.height-280)/2, 420, 280);
}
 
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
 
public void run() {
new RoundImageSample().setVisible(true);
}
});
}
 
private JLabel roundImageLabel;
}

Comments (5)

Wagner Borgesmaio 27th, 2010 at 8:28

puts. Muito massa!!! parabéns pelo post.

Harlan Gomesjunho 22nd, 2010 at 22:57

Colega muito Legal comecei estudar Java agora e achuei muito foda!

Robson Fernandesjunho 30th, 2010 at 3:26

Grande Paulo Canedo!

Tudo jóia! Como andam as coisas ai em Palmas-TO, muito quente como sempre(rsrs).

Cara, achei muito show a dica que tu passou, para arredondar imagens no Java. Estou querendo aperfeiçoar meus conhecimentos em tratamento de Imagem com Java, estou achando muito massa isso!
Esse final de semana estava treinando aquelas dicas que você tinha me passado em Palmas, para estilizar os botões no Java, muito legal!

Grande Abs, e mande noticias!

Paulo Canedojunho 30th, 2010 at 9:02

Opa Robson, quente como sempre aqui, hehehehe. Se tiver qq dúvida aí nos seus estudos com estilização no Java, é só postar aqui!

Webert Oliveiranovembro 17th, 2010 at 14:49

Vamos lá amigo, deixa eu ver se complico um pouco.
Eava precisando de algo assim, só que com bordas, tabela com borda arredondada.
Ou pegar um pdf que criei no java transforma-lo em figura e usar esse seu codigo.
MAs não faço enm ideia de como fazer isso.

Leave a comment

Your comment