<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Paulo Canedo &#187; Interface do Usuário</title>
	<atom:link href="http://www.paulocanedo.com.br/category/interface-do-usuario/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.paulocanedo.com.br</link>
	<description>Blog pessoal - TI, Java, NetBeans e Programação em geral</description>
	<lastBuildDate>Wed, 26 May 2010 16:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Imagem com cantos arredondados no Java</title>
		<link>http://www.paulocanedo.com.br/2010/05/26/imagem-com-cantos-arredondados-no-java/</link>
		<comments>http://www.paulocanedo.com.br/2010/05/26/imagem-com-cantos-arredondados-no-java/#comments</comments>
		<pubDate>Wed, 26 May 2010 16:30:10 +0000</pubDate>
		<dc:creator>Paulo Canedo</dc:creator>
				<category><![CDATA[Interface do Usuário]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.paulocanedo.com.br/?p=237</guid>
		<description><![CDATA[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: 0 1 2 3 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.paulocanedo.com.br/wp-content/uploads/2010/05/roundimagesample.jpg"><img class="aligncenter size-full wp-image-238" title="Imagem com canto arrendondado em Java" src="http://www.paulocanedo.com.br/wp-content/uploads/2010/05/roundimagesample.jpg" alt="Imagem com canto arredondado em Java" width="450" height="310" /></a></p>
<p>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:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> RoundImage <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Stroke</span> stroke <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BasicStroke</span><span style="color: #009900;">&#40;</span>1.5f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> RoundImage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">Image</span> getRoundImage<span style="color: #009900;">&#40;</span><span style="color: #003399;">Image</span> imageSource, <span style="color: #000066; font-weight: bold;">int</span> radius<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">int</span> width <span style="color: #339933;">=</span> imageSource.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">int</span> height <span style="color: #339933;">=</span> imageSource.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">BufferedImage</span> image <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedImage</span><span style="color: #009900;">&#40;</span>width, height, <span style="color: #003399;">BufferedImage</span>.<span style="color: #006633;">TYPE_INT_ARGB</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">RoundRectangle2D</span> rect <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">RoundRectangle2D</span>.<span style="color: #003399;">Double</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, width, height, radius, radius<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">Graphics2D</span> g2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Graphics2D</span><span style="color: #009900;">&#41;</span> image.<span style="color: #006633;">getGraphics</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
g2.<span style="color: #006633;">setRenderingHint</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">KEY_ANTIALIASING</span>, <span style="color: #003399;">RenderingHints</span>.<span style="color: #006633;">VALUE_ANTIALIAS_ON</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
g2.<span style="color: #006633;">clip</span><span style="color: #009900;">&#40;</span>rect<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
g2.<span style="color: #006633;">drawImage</span><span style="color: #009900;">&#40;</span>imageSource, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
g2.<span style="color: #006633;">setStroke</span><span style="color: #009900;">&#40;</span>stroke<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
g2.<span style="color: #006633;">setColor</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Color</span>.<span style="color: #006633;">WHITE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
g2.<span style="color: #006633;">draw</span><span style="color: #009900;">&#40;</span>rect<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> image<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>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.</p>
<p>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.</p>
<p>Abaixo segue o código fonte de um exemplo de utilização que produz a imagem de exemplo no começo do post.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RoundImageSample <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">JFrame</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> RoundImageSample<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
initComponents<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
<span style="color: #003399;">ImageIcon</span> icon <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ImageIcon</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://www.paulocanedo.com.br/imagens/brasil.jpg&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
roundImageLabel.<span style="color: #006633;">setIcon</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ImageIcon</span><span style="color: #009900;">&#40;</span>RoundImage.<span style="color: #006633;">getRoundImage</span><span style="color: #009900;">&#40;</span>icon.<span style="color: #006633;">getImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">30</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">MalformedURLException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
ex.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> initComponents<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
roundImageLabel <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> javax.<span style="color: #006633;">swing</span>.<span style="color: #003399;">JLabel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
setDefaultCloseOperation<span style="color: #009900;">&#40;</span>javax.<span style="color: #006633;">swing</span>.<span style="color: #003399;">WindowConstants</span>.<span style="color: #006633;">EXIT_ON_CLOSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
setTitle<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;RoundImage, paulocanedo.com.br&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
getContentPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setLayout</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> java.<span style="color: #006633;">awt</span>.<span style="color: #003399;">GridLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
roundImageLabel.<span style="color: #006633;">setHorizontalAlignment</span><span style="color: #009900;">&#40;</span>javax.<span style="color: #006633;">swing</span>.<span style="color: #003399;">SwingConstants</span>.<span style="color: #006633;">CENTER</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
getContentPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>roundImageLabel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
java.<span style="color: #006633;">awt</span>.<span style="color: #003399;">Dimension</span> screenSize <span style="color: #339933;">=</span> java.<span style="color: #006633;">awt</span>.<span style="color: #003399;">Toolkit</span>.<span style="color: #006633;">getDefaultToolkit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getScreenSize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
setBounds<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>screenSize.<span style="color: #006633;">width</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">420</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span>, <span style="color: #009900;">&#40;</span>screenSize.<span style="color: #006633;">height</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">280</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">420</span>, <span style="color: #cc66cc;">280</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
java.<span style="color: #006633;">awt</span>.<span style="color: #003399;">EventQueue</span>.<span style="color: #006633;">invokeLater</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Runnable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">new</span> RoundImageSample<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setVisible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">JLabel</span> roundImageLabel<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.paulocanedo.com.br/2010/05/26/imagem-com-cantos-arredondados-no-java/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

