<?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>Bruno Soares &#187; PHP</title>
	<atom:link href="http://blog.bsoares.com.br/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.bsoares.com.br</link>
	<description></description>
	<lastBuildDate>Sun, 11 Jul 2010 02:16:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Operações binárias</title>
		<link>http://blog.bsoares.com.br/aspnet/operacoes-binarias</link>
		<comments>http://blog.bsoares.com.br/aspnet/operacoes-binarias#comments</comments>
		<pubDate>Tue, 26 May 2009 02:28:09 +0000</pubDate>
		<dc:creator>Bruno Soares</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Electronics]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Open Hardware]]></category>
		<category><![CDATA[Techology]]></category>

		<guid isPermaLink="false">http://blog.bsoares.com.br/?p=340</guid>
		<description><![CDATA[Ultimamente tenho me deparado com muitos trechos de códigos que utilizam operações binárias, como chaveamento de multiplexador, extração de RGB a partir de um inteiro ou hexadecimal, bitshift para controlar LED Matrix, etc&#8230; E finalmente dei aquela estuda, agora vai ai um post sobre o que resultou o estudo.
Obs.: Os trechos de códigos deste post [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente tenho me deparado com muitos trechos de códigos que utilizam <a href="http://en.wikipedia.org/wiki/Bitwise_operation" target="_blank">operações binárias</a>, como chaveamento de <a href="http://pt.wikipedia.org/wiki/Multiplexador" target="_blank">multiplexador</a>, extração de <a href="http://pt.wikipedia.org/wiki/RGB" target="_blank">RGB</a> a partir de um inteiro ou <a href="http://pt.wikipedia.org/wiki/Sistema_hexadecimal" target="_blank">hexadecimal</a>, bitshift para controlar <a href="http://blog.bsoares.com.br/tag/8x8-led-matrix">LED Matrix</a>, etc&#8230; E finalmente dei aquela estuda, agora vai ai um post sobre o que resultou o estudo.</p>
<p>Obs.: Os trechos de códigos deste post foram escritos em <a href="http://blog.bsoares.com.br/tag/as3">ActionScript</a>, mas pode ser aplicado a C, <a href="http://blog.bsoares.com.br/tag/cpp">C++</a>, Java, <a href="http://blog.bsoares.com.br/tag/processing">Processing</a>, <a href="http://blog.bsoares.com.br/tag/php">PHP</a>, entre outras linguagens.</p>
<hr />
• <a href="#introducao">Introdução</a><br />
• Bit Shift<br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-right-shift">Operador >> (bitwise right shift)</a><br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-left-shift">Operador << (bitwise left shift)</a><br />
• Operações Bitwise<br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-and">Operador &#038; (bitwise AND)</a><br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-or">Operador | (bitwise OR)</a><br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-xor">Operador ^ (bitwise XOR)</a><br />
&nbsp;&nbsp;&nbsp;• <a href="#bitwise-not">Operador ~ (bitwise NOT)</a><br />
• Exemplos<br />
&nbsp;&nbsp;&nbsp;• <a href="#extract-rgb">Extraindo o RGB de uma cor</a><br />
&nbsp;&nbsp;&nbsp;• <a href="#multiplexer-4051">Chaveando multiplexador 4051</a><br />
&nbsp;</p>
<hr /><a name="introducao"><strong>Introdução</strong></a><br />
Um operador binário, como o nome sugere, é um operador que trabalha com a representação binária do número, e como normalmente não sabemos a representação binária dos números de cabeça, vamos utilizar a tabela abaixo:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;"> -----------------------
|      BIN |  DEC | HEX |
|-----------------------|
|        1 |    1 |   1 |
|       10 |    2 |   2 |
|       11 |    3 |   3 |
|      100 |    4 |   4 |
|      101 |    5 |   5 |
|      110 |    6 |   6 |
|      111 |    7 |   7 |
|     1000 |    8 |   8 |
|     1001 |    9 |   9 |
|     1010 |   10 |   A |
|     1011 |   11 |   B |
|     1100 |   12 |   C |
|     1101 |   13 |   D |
|     1110 |   14 |   E |
|     1111 |   15 |   F |
|    10000 |   16 |  10 |
|    10001 |   17 |  11 |
|    10010 |   18 |  12 |
|    10011 |   19 |  13 |
|    10100 |   20 |  14 |
|-----------------------|
| 11111111 |  255 |  FF |
 ----------------------- </pre>
<p>A tabela lista os números de 1 à 20 e 255 em três bases diferentes:<br />
• <a href="http://pt.wikipedia.org/wiki/Sistema_bin%C3%A1rio_%28matem%C3%A1tica%29" target="_blank">Binário (BIN)</a><br />
• Decimal (DEC)<br />
• <a href="http://pt.wikipedia.org/wiki/Sistema_hexadecimal" target="_blank">Hexadecimal (HEX)</a></p>
<p>Analisando a tabela podemos concluir que 3d = 11b, 19d = 10011b (as letras d e b significam decimal e binário respectivamente). Lembrando que pode ser utilizada uma calculadora que opere em binário (como a do windows) ou uma alternativa de conversão de bases on-line como está: <a href="http://calculadoraonline.com.br/view/conversao-binario.php" target="_blank">&#8220;Conversão de número binário&#8221;</a>.</p>
<p>Então vamos <strong>deslocar</strong>, <strong>escorregar</strong>, <strong>escovar</strong> alguns bits para entender melhor.</p>
<p>
<hr /><a name="bitwise-right-shift"><strong>Operador >></strong></a><br />
Deslocamento de bits para a direita (bitwise right shift)</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>8 <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 1<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 4</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>8 <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 2<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 2</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>8 <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 3<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 1</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>8 <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 4<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 0</span></div></td></tr></tbody></table></div>
<p>Olhando os números na base decimal faz pouco sentido, ou talvez nenhum sentido, então passamos os números corretos para a base binária e tudo fica mais claro:<br />
8d = 1000b (8 decimal é igual a 1000 em binário), então:<br />
1000b >> 1 (deslocando uma casa para direita) temos o número:<br />
100b que em decimal é 4(dê uma olhada na tabela).</p>
<p>Agora ficou fácil não? Vamos deslocar o número 13:</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>13 <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 1<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 6</span></div></td></tr></tbody></table></div>
<p>13 em binário é 1101, deslocando uma casa para a direita (ou removendo 1 bit), fica 110, e 110 é igual a 6 em decimal.</p>
<p>
<hr /><a name="bitwise-left-shift"><strong>Operador <<</strong></a><br />
Deslocamento de bits para a esquerda (bitwise left shift)</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>2 <span style="color: #000066; font-weight: bold;">&lt;&lt;</span> 1<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 4</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>2 <span style="color: #000066; font-weight: bold;">&lt;&lt;</span> 2<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 8</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>2 <span style="color: #000066; font-weight: bold;">&lt;&lt;</span> 3<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 16</span></div></td></tr></tbody></table></div>
<p>Agora é só seguir o mesmo raciocino já utilizando anteriormente.<br />
Se 2 em base binária é igual a 10 e deslocarmos um bit para esquerda, vamos ganhar mais um zero, ficando com 100 que é igual a 4 em decimal.</p>
<p>
<hr /><a name="bitwise-and"><strong>Operador &#038;</strong></a><br />
AND binário (bitwise AND)<br />
O operador &#038; compara bit a bit os números a sua direita e esquerda, por exemplo o resultado de 10 &#038; 11 é 10:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1010
&#038; 1011
------
  1010</pre>
<p>A comparação bit-a-bit somente retorna True (1) quando os bits comparados são iguais a 1, caso contrário retorna False (0). Formando assim um novo número.<br />
Mais alguns exemplos para fortalecer:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
|14 &#038;  9|13 &#038; 11|20 &#038;  9|14 &#038; 10|89 &#038;  112|45  &#038;  77|255  &#038;  13|112 &#038;  255|
|       |       |       |       |         |         |          |          |
|  1110 |  1101 |  10100|  1110 |  1011001|   101101|  11111111|   1110000|
|&#038; 1001 |&#038; 1011 |&#038;  1001|&#038; 1010 |&#038; 1110000|&#038; 1001101|&#038;     1101|&#038; 11111111|
|  ---- |  ---- |  -----|  ---- |  -------|  -------|  --------|  --------|
|  1000 |  1001 |      0|  1010 |  1010000|     1101|      1101|   1110000|
|    8d |    9d |     0d|   10d |      80d|      13d|       13d|      112d|</pre>
<p>
<hr /><a name="bitwise-or"><strong>Operador |</strong></a><br />
OR binário (bitwise OR)<br />
O operador | tem a mesma função do operador OR comum (||) só que atua bit-a-bit, assim como os outros operadores binários. Vejamos um exemplo:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1010
| 1011
------
  1011</pre>
<p>Se um dos bits comparados forem iguais a 1 a expressão retornará 1, caso os dois bits comparados forem iguais a 0, a expressão retorna 0. Agora vamos refazer o exemplo anterior trocando apenas o operador &#038; (and binário) por | (or binário):</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
|14 |  9|13 | 11|20 |  9|14 | 10|89 |  112|45  |  77|255  |  13|112 |  255|
|       |       |       |       |         |         |          |          |
|  1110 |  1101 |  10100|  1110 |  1011001|   101101|  11111111|   1110000|
|| 1001 || 1011 ||  1001|| 1010 || 1110000|| 1001101||     1101|| 11111111|
|  ---- |  ---- |  -----|  ---- |  -------|  -------|  --------|  --------|
|  1111 |  1111 |  11101|  1110 |  1111001|  1101101|  11111111|  11111111|
|   15d |   15d |    29d|   14d |     121d|     109d|      255d|      255d|</pre>
<p>
<hr /><a name="bitwise-xor"><strong>Operador ^</strong></a><br />
OU exclusivo (bitwise XOR)<br />
A letra X na frente do OR significa Exclusive (Exclusive OR). Isso quer dizer que este operador faz a comparação binária de dois números e resulta os bits que são diferentes. Por exemplos, quais são os bits diferentes entre os números 10 e 11?</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1010
^ 1011
------
     1</pre>
<p>Vamos novamente trocar o operador do exemplo anterior para analisar os resultados:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
|14 ^  9|13 ^ 11|20 ^  9|14 ^ 10|89 ^  112|45  ^  77|255  ^  13|112 ^  255|
|       |       |       |       |         |         |          |          |
|  1110 |  1101 |  10100|  1110 |  1011001|   101101|  11111111|   1110000|
|^ 1001 |^ 1011 |^  1001|^ 1010 |^ 1110000|^ 1001101|^     1101|^ 11111111|
|  ---- |  ---- |  -----|  ---- |  -------|  -------|  --------|  --------|
|   111 |   110 |  11101|   100 |   101001|  1100000|  11110010|  10001111|
|    7d |    6d |    29d|    4d |      41d|      96d|      242d|      143d|</pre>
<p>
<hr /><a name="bitwise-not"><strong>Operador ~</strong></a><br />
Negação (bitwise NOT)<br />
O operador NOT inverte o sinal e complementa em um.<br />
Negando o número 168 (~168) teremos -169.</p>
<p>Alguns exemplos:</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~</span>7<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> &nbsp; <span style="color: #009900; font-style: italic;">// -8</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~-</span>7<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> &nbsp;<span style="color: #009900; font-style: italic;">// 6</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~</span>14<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> &nbsp;<span style="color: #009900; font-style: italic;">// -15</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~</span>13<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> &nbsp;<span style="color: #009900; font-style: italic;">// -14</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~</span>255<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// -256</span><br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #000066; font-weight: bold;">~</span>112<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// -113</span></div></td></tr></tbody></table></div>
</p>
<p>&nbsp;</p>
<hr /><a name="extract-rgb"><strong>Extraindo o RGB de uma cor</strong></a><br />
Sabendo que uma cor no formato RGB utiliza dois dígitos hexadecimais para definir quanto existe de Vermelho, Verde e Azul (respectivamente), formando cores como: Vermelho (FF0000), Cinza (C0C0C0), Laranja (FF9900), etc. Temos ai a possibilidade de gerar 16.581.375 de cores com este código, é só fazer a conta para conferir: 255 * 255 * 255 ou FF * FF * FF.<br />
Vamos desmembrar um tom de azul (<strong><font color="#347BB7">#347BB7</font></strong>) para saber quanto esta cor tem de Vermelho, Verde e Azul (o valor dos canais RGB).</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900; font-style: italic;">// DEC: 3439543</span><br />
<span style="color: #009900; font-style: italic;">// BIN: 1101000111101110110111</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">color</span><span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = 0x347BB7<span style="color: #000066; font-weight: bold;">;</span><br />
<br />
<span style="color: #6699cc; font-weight: bold;">var</span> r<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000;">&#40;</span><span style="color: #004993;">color</span> <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> 16<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">&amp;</span> 0xFF<span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> g<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000;">&#40;</span><span style="color: #004993;">color</span> <span style="color: #000066; font-weight: bold;">&gt;&gt;</span> &nbsp;8<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">&amp;</span> 0xFF<span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">b</span><span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = &nbsp;<span style="color: #004993;">color</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">&amp;</span> 0xFF<span style="color: #000066; font-weight: bold;">;</span><br />
<br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Red:&quot;</span><span style="color: #000066; font-weight: bold;">,</span> r<span style="color: #000066; font-weight: bold;">,</span> <span style="color: #990000;">&quot;Green:&quot;</span><span style="color: #000066; font-weight: bold;">,</span> g<span style="color: #000066; font-weight: bold;">,</span> <span style="color: #990000;">&quot;Blue:&quot;</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #004993;">b</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #009900; font-style: italic;">// Red: 52 Green: 123 Blue: 183</span></div></td></tr></tbody></table></div>
<p>Linha 5) Deslocando 16 bits para a direita temos:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1101000111101110110111 >> 16
=                 110100 (DEC: 52)</pre>
<p>Para o caso do vermelho não precisamos continuar a expressão (&#038; 0xFF),<br />
pois deslocando 16 bits para a direita já temos o resultado do vermelho,<br />
mas se a cor estivesse no formato ARGB (Alpha Red Green Blue), seria necessário.</p>
<p>Linha 6) Deslocando 8 bits para conseguir o verde:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1101000111101110110111 >> 8
=         11010001111011 (DEC: 13435)</pre>
<p>Só com o valor do deslocamentos não vamos conseguir a cor verde, então utilizamos o<br />
operador &#038; (AND) com o valor 255 (0xFF) para extrair a parte binária que nos interessa:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  11010001111011 (DEC: 13435)
&#038;       11111111 (DEC: 255, HEX: 0xFF)
  --------------
        01111011 (DEC: 123)</pre>
<p>Linha 7) Para extrair o azul não precisamos deslocar bits e sim pegar os últimos 8 bits:</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1101000111101110110111
&#038;               11111111 (DEC: 255, HEX: 0xFF)
  ----------------------
                10110111 (DEC: 183)</pre>
<p>Agora voltando para o hexadecimal:</p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6699cc; font-weight: bold;">var</span> r<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000; font-weight:bold;">52</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> g<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000; font-weight:bold;">123</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">b</span><span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000; font-weight:bold;">183</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">color</span><span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=uint%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:uint.html"><span style="color: #004993;">uint</span></a> = <span style="color: #000000;">&#40;</span>r <span style="color: #000066; font-weight: bold;">&lt;&lt;</span> 16<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">|</span> <span style="color: #000000;">&#40;</span>g <span style="color: #000066; font-weight: bold;">&lt;&lt;</span> 8<span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">|</span> <span style="color: #004993;">b</span><span style="color: #000066; font-weight: bold;">;</span><br />
<br />
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">color</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span>16<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #009900; font-style: italic;">// 347bb7</span></div></td></tr></tbody></table></div>
<p>Linha 4) Deslocando 16 bits para a esquerda do número 52 (Vermelho):</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  110100 << 16
= 1101000000000000000000</pre>
<p>Deslocando 8 bits para a esquerda do número 123 (Verde):</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1111011 << 8
= 111101100000000</pre>
<p>Efetuando o OR (|) com o resultado das duas operações ((r << 16) | (g << 8)):</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1101000000000000000000
|        111101100000000
  ----------------------
  1101000111101100000000</pre>
<p>Efetuando a última operação, o OR com o Azul (183)</p>
<pre style="font-family: 'Lucida Console', 'Courier New', 'Courier'; font-size: 10px; line-height: 10px;">
  1101000111101100000000
| 0000000000000010110111
  ----------------------
  1101000111101110110111</pre>
<p>O resultado agora ficou claro. O número 1101000111101110110111 (binário) é igual a 3439543 (decimal) e 347BB7 (hexadecimal).</p>
<p>&nbsp;</p>
<hr /><a name="multiplexer-4051"><strong>Chaveando multiplexador 4051</strong></a><br />
A tarefa de chavear um Multiplexador / Demultiplexador (MUX / DEMUX) 4051 é muito parecida com a extração dos canais RGB de uma cor. Você só precisa Ligar ou Desligar três pinos de seleção (select pins) para que o circuito interprete o valor gerado e transmita a voltagem da entrada desejada.<br />
Existe um gif animado do <a href="http://www.rogercom.com" target="_blank">RogerCom</a> muito didático que demonstra o funcionamento do CI 4051, <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/05/animacd4051b.gif" rel="shadowbox[post-340];player=img;" target="_blank">gif animado CI 4051 aqui</a>.<br />
Por exemplo, para ler a entrada 3, precisamos desligar o pino de seleção 0, ligar o 1 e o 2, formando assim o número 011 (binário) que é igual a 3 em decimal. Veja no código (Escrito em Arduino / C++):</p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">// Entrada desejada</span><br />
<span style="color: #0000ff;">int</span> count <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span><br />
<br />
<span style="color: #666666;">// Extração dos bits ativos</span><br />
byte s0 <span style="color: #000080;">=</span> &nbsp;count &nbsp; &nbsp; &nbsp; <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x1</span><span style="color: #008080;">;</span><br />
byte s1 <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>count <span style="color: #000080;">&gt;&gt;</span> 1<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x1</span><span style="color: #008080;">;</span><br />
byte s2 <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>count <span style="color: #000080;">&gt;&gt;</span> 2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x1</span><span style="color: #008080;">;</span><br />
<br />
<span style="color: #666666;">// Ligando ou desligando os pinos de seleção</span><br />
digitalWrite<span style="color: #008000;">&#40;</span>2, s0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
digitalWrite<span style="color: #008000;">&#40;</span>3, s1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
digitalWrite<span style="color: #008000;">&#40;</span>4, s2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></div></td></tr></tbody></table></div>
<hr /><strong>Conteúdo relacionado:</strong><br />
• <a href="http://en.wikipedia.org/wiki/Bitwise_operation" target="_blank">Bitwise operation on Wikipedia</a><br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bsoares.com.br/aspnet/operacoes-binarias/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Controlando a Arduino com PHP via porta serial</title>
		<link>http://blog.bsoares.com.br/php/controlling-arduino-with-php</link>
		<comments>http://blog.bsoares.com.br/php/controlling-arduino-with-php#comments</comments>
		<pubDate>Sat, 02 May 2009 02:58:02 +0000</pubDate>
		<dc:creator>Bruno Soares</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Electronics]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Led]]></category>
		<category><![CDATA[Led RGB]]></category>
		<category><![CDATA[Open Hardware]]></category>
		<category><![CDATA[PWM]]></category>
		<category><![CDATA[Techology]]></category>

		<guid isPermaLink="false">http://blog.bsoares.com.br/?p=274</guid>
		<description><![CDATA[É isso mesmo, o PHP pode escrever ou ler dados da porta serial, e com isso podemos controlar a Arduino.

Você pode ligar o seu ar-condicionado, cafeteira, luz, etc&#8230; via Internet, e de uma forma bem simples.
Serialproxy também é uma ótima forma de se conectar a Arduino via Internet, utilizei no projeto Twitter Hardware, mas este [...]]]></description>
			<content:encoded><![CDATA[<p>É isso mesmo, o <a href="http://www.php.net/" target="_blank">PHP</a> pode escrever ou ler dados da porta serial, e com isso podemos controlar a <a href="http://www.arduino.cc/" target="_blank">Arduino</a>.</p>
<p style="text-align: center;"><object width="480" height="368"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4437541&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=4437541&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="368"></embed></object></p>
<p>Você pode ligar o seu ar-condicionado, cafeteira, luz, etc&#8230; via Internet, e de uma forma bem simples.<br />
Serialproxy também é uma ótima forma de se conectar a Arduino via Internet, utilizei no projeto <a href="http://blog.bsoares.com.br/arduino/twitter-hardware">Twitter Hardware</a>, mas este post é sobre <a href="http://www.php.net/" target="_blank">PHP</a>, então vamos lá.</p>
<p style="text-align: center;"><img src="http://blog.bsoares.com.br/wp-content/uploads/2009/04/arduino-php-diagram.jpg" alt="Arduino + PHP Diagram" /></p>
<p>Vou utilizar o exemplo descrito no post &#8220;<a href="http://blog.bsoares.com.br/processing/controlling-rgb-led-with-arduino-and-processing">Controlando Led RGB com Arduino e Processing</a>&#8221; (trocando o <a href="http://www.processing.org/" target="_blank">Processing</a> pelo PHP).</p>
<p>A função <a href="http://br2.php.net/manual/en/function.fopen.php" target="_blank">fopen</a> do PHP da suporte a escrita na porta serial:</p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/fopen"><span style="color: #990000;">fopen</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'COM2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/fwrite"><span style="color: #990000;">fwrite</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/fclose"><span style="color: #990000;">fclose</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Linha 1) Abre a conexão com a COM2 (porta serial onde a minha Arduino está conectada).<br />
Linha 2) Escreve na porta<br />
Linha 3) Fecha a conexão</p>
<p><strong>Código PHP do exemplo:</strong></p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Arduino + PHP<br />
&nbsp;*<br />
&nbsp;* @author &nbsp;Bruno Soares<br />
&nbsp;* @website www.bsoares.com.br<br />
&nbsp;*/</span><br />
<br />
<span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'color'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$color</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$color</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/hexdec"><span style="color: #990000;">hexdec</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$color</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'^'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$color</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'$'</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// USB Serial Port (COM2)</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$portAddress</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'COM2'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Open connection on port</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/fopen"><span style="color: #990000;">fopen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$portAddress</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Necessary when the Arduino reset after the connection</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/sleep"><span style="color: #990000;">sleep</span></a><span style="color: #009900;">&#40;</span>2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Send chars</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/fwrite"><span style="color: #990000;">fwrite</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Close connection</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/fclose"><span style="color: #990000;">fclose</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>Linha 12) Converte a cor de hexadecimal para decimal.<br />
Linha 13) Coloca os caracteres que indicam o inicio e fim da mensagem.<br />
Linha 16) Define a variável com o endereço da porta (no meu caso COM2).<br />
Linha 19) Abre a &#8220;conexão&#8221; com a porta serial.<br />
Linha 22) Pausa o código por 2 segundo, pois a Arduino costuma reiniciar quando é feita uma conexão a ela.<br />
Linha 25) Escreve a mensagem com a cor na porta serial.<br />
Linha 28) Fecha a &#8220;conexão&#8221; com a porta serial.</p>
<p><em><font color="#990000">Update 09/07/2009:</font></em><br />
<strong>Lendo dados:</strong><br />
Tenho recebido diversos e-mails e até alguns comentários de pessoas que precisam ler dados de um sensor, potenciometro, ou qualquer coisa conectada a Arduino, e isso via PHP. Então vamos lá, preparei um código que faz isso de forma fácil.<br />
Acredito que um problema que o pessoal tem tido com esta tarefa é: você deve se dar tempo para a mensagem chegar a Arduino (não que isso seja muito tempo), e também para que a Arduino consiga responder:</p>
<p><strong>Código Arduino:</strong></p>
<div class="codecolorer-container cpp mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff0000; font-style: italic;">/**<br />
&nbsp;* Arduino + PHP<br />
&nbsp;*<br />
&nbsp;* @author &nbsp;Bruno Soares<br />
&nbsp;* @website www.bsoares.com.br<br />
&nbsp;*/</span><br />
<br />
<span style="color: #339900;">#define ANALOG_PIN 4</span><br />
<br />
<span style="color: #0000ff;">void</span> setup<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; Serial.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span>9600<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span><br />
<br />
<span style="color: #0000ff;">void</span> loop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Serial.<span style="color: #007788;">available</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> 0<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Serial.<span style="color: #007788;">read</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #FF0000;">'1'</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; Serial.<span style="color: #007788;">print</span><span style="color: #008000;">&#40;</span>analogRead<span style="color: #008000;">&#40;</span>ANALOG_PIN<span style="color: #008000;">&#41;</span>, DEC<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>Código PHP:</strong></p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Arduino + PHP<br />
&nbsp;*<br />
&nbsp;* @author &nbsp;Bruno Soares<br />
&nbsp;* @website www.bsoares.com.br<br />
&nbsp;*/</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Conecta na porta</span><br />
<span style="color: #000088;">$port</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/fopen"><span style="color: #990000;">fopen</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'COM2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w+'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Em alguns casos a Arduino pode reiniciar, por isso</span><br />
<span style="color: #666666; font-style: italic;">// é bom esperar para enviar informação depois de conectar</span><br />
<a href="http://www.php.net/sleep"><span style="color: #990000;">sleep</span></a><span style="color: #009900;">&#40;</span>2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Envia &quot;1&quot; para o programa na Arduino saber que deve responder</span><br />
<a href="http://www.php.net/fwrite"><span style="color: #990000;">fwrite</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Espera para que o dado enviado pelo PHP chegue até a Arduino</span><br />
<a href="http://www.php.net/sleep"><span style="color: #990000;">sleep</span></a><span style="color: #009900;">&#40;</span>1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Agora que a Arduino &quot;Provavelmente já respondeu&quot;, pega</span><br />
<span style="color: #666666; font-style: italic;">// o valor da resposta</span><br />
<span style="color: #b1b100;">echo</span> <a href="http://www.php.net/fgets"><span style="color: #990000;">fgets</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Fecha a conexão com a porta</span><br />
<a href="http://www.php.net/fclose"><span style="color: #990000;">fclose</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$port</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><strong>O que esse código faz?</strong><br />
A Arduino fica em loop esperando  receber pela porta serial o numero 1, assim que recebido ela lê a voltagem do pino analógico 4 e escreve na porta serial.<br />
O PHP abre a porta serial, escreve &#8220;1&#8243;, e espera para ler novamente, quando lê novamente encontra o valor do pino analógico 4, assim como a Arduino escreveu.<br />
Bom, espero que este exemplo acabe com as dúvidas do pessoal que precise ler dados da Arduino :)</p>
<p><strong>Observações:</strong><br />
Caso você precise fazer um projeto onde muitos usuário vão acessar o script que escreve na porta serial, você deve implementar uma fila, de forma a não ter um usuário escrevendo na porta ao mesmo tempo que outro, isto geraria um erro.<br />
O código fonte escrito para a Arduino é o mesmo do post <a href="http://blog.bsoares.com.br/processing/controlling-rgb-led-with-arduino-and-processing">Controlando Led RGB com Arduino e Processing</a></p>
<p>Faça o <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/05/arduino-php.zip">download do código fonte aqui</a>.</p>
<p><strong>Conteúdo relacionado:</strong><br />
Arduino: <a href="http://www.arduino.cc/" target="_blank">http://www.arduino.cc/</a><br />
Referência: <a href="http://www.arduinoprojects.com/?q=node/10" target="_blank">http://www.arduinoprojects.com/?q=node/10</a><br />
jQuery ColorPicker: <a href="http://www.eyecon.ro/colorpicker/" target="_blank">http://www.eyecon.ro/colorpicker/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bsoares.com.br/php/controlling-arduino-with-php/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>JPGEncoder (AS3) com AMFPHP</title>
		<link>http://blog.bsoares.com.br/remoting/jpgencoder-as3-with-amfphp</link>
		<comments>http://blog.bsoares.com.br/remoting/jpgencoder-as3-with-amfphp#comments</comments>
		<pubDate>Wed, 08 Apr 2009 02:21:54 +0000</pubDate>
		<dc:creator>Bruno Soares</dc:creator>
				<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Remoting]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[JPGEncoder]]></category>
		<category><![CDATA[PNGEncoder]]></category>
		<category><![CDATA[Techology]]></category>

		<guid isPermaLink="false">http://blog.bsoares.com.br/?p=160</guid>
		<description><![CDATA[Tenho notado pelo Google Analytics que pessoas chegam ao blog procurando por AMFPHP, encode de imagens criadas no flash, salvar imagem com Flash + AMFPHP e outros critérios de busca. E por isso me sinto na obrigação de escrever algo sobre isto.
Exemplo:









Vou demonstrar exatamente o que o título do post propõe (Criar imagens no Flash [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho notado pelo Google Analytics que pessoas chegam ao blog procurando por <a href="http://www.amfphp.org/" target="_blank">AMFPHP</a>, encode de imagens criadas no flash, salvar imagem com Flash + AMFPHP e outros critérios de busca. E por isso me sinto na obrigação de escrever algo sobre isto.</p>
<p><strong>Exemplo:</strong>
<object width="550" height="450">
<param name="movie" value="http://blog.bsoares.com.br/articles/jpgencoder_amfphp/swf/Main.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="550" height="450" src="http://blog.bsoares.com.br/articles/jpgencoder_amfphp/swf/Main.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p>Vou demonstrar exatamente o que o título do post propõe (Criar imagens no Flash com ActionScript 3, encodar essas imagens com a classe JPGEncoder presente na biblioteca <a href="http://code.google.com/p/as3corelib/">as3corelib</a> e salvar como um arquivo .jpg utilizando o AMFPHP). Já escrevi aqui como fazer isso em <a href="http://blog.bsoares.com.br/remoting/jpeg-encoder-as3-fluorinefx-net-flash-remoting-gateway" target="_blank">FluorineFx (ASP.NET Flash Remoting Gateway)</a>.</p>
<p>Suponho que quem esteja interessado em rodar o que está descrito neste tutorial tenha o Apache com PHP instalado, ou algum servidor com suporte. Caso você não tenha recomendo a instalação do <a href="http://www.apachefriends.org/pt_br/xampp.html" target="_blank">XAMPP</a> (é de fácil instalação e tem tudo que um programador precisa).</p>
<p><strong>Configuração do AMFPHP:</strong><br />
A versão que utilizo neste tutorial é a <strong>1.9 beta</strong>, mas versões posteriores devem funcionar perfeitamente.<br />
• Baixe o AMFPHP do seguinte link: <a href="http://www.amfphp.org/" target="_blank">http://www.amfphp.org/</a><br />
• Copie o conteúdo do ZIP para o diretório onde você está criando o projeto, recomendo a estrutura de diretórios como mostrada na imagem abaixo:<br />
<img class="alignnone size-full wp-image-174" title="folders" src="http://blog.bsoares.com.br/wp-content/uploads/2009/04/folders.png" alt="folders" width="186" height="209" /></p>
<p>• Para testar o funcionamento é só acessar o diretório browser do navegador (http://127.0.0.1/www/amf/browser/).</p>
<p>Fique entendido que <strong>a responsabilidade de gerar a imagem é do Flash</strong>, e o <strong>servidor deve apenas receber os binários para gravar em disco</strong>. Para gerarmos o código da imagem (binário), vamos utilizar a classe JPGEncoder.<br />
<strong>Exemplo:</strong></p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span><span style="color: #000066; font-weight: bold;">.</span><a href="http://www.google.com/search?q=bitmapdata%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bitmapdata.html"><span style="color: #004993;">BitmapData</span></a><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span><span style="color: #000066; font-weight: bold;">.</span><a href="http://www.google.com/search?q=bytearray%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bytearray.html"><span style="color: #004993;">ByteArray</span></a><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #0033ff; font-weight: bold;">import</span> com<span style="color: #000066; font-weight: bold;">.</span>adobe<span style="color: #000066; font-weight: bold;">.</span>images<span style="color: #000066; font-weight: bold;">.</span>JPGEncoder<span style="color: #000066; font-weight: bold;">;</span><br />
<br />
<span style="color: #6699cc; font-weight: bold;">var</span> bmpData<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=bitmapdata%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bitmapdata.html"><span style="color: #004993;">BitmapData</span></a> = <span style="color: #0033ff; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=bitmapdata%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bitmapdata.html"><span style="color: #004993;">BitmapData</span></a><span style="color: #000000;">&#40;</span><span style="color: #004993;">width</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #004993;">height</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
bmpData<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">draw</span><span style="color: #000000;">&#40;</span>MEU_MOVIECLIP<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> objJPGEncoder<span style="color: #000066; font-weight: bold;">:</span>JPGEncoder = <span style="color: #0033ff; font-weight: bold;">new</span> JPGEncoder<span style="color: #000000;">&#40;</span>QUALIDADE<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #6699cc; font-weight: bold;">var</span> dadosEncode<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=bytearray%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bytearray.html"><span style="color: #004993;">ByteArray</span></a> = objJPGEncoder<span style="color: #000066; font-weight: bold;">.</span>encode<span style="color: #000000;">&#40;</span>bmpData<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span></div></td></tr></tbody></table></div>
<p>Muito simples não? O método draw da classe BitmapData obtém a imagem atual do clip, criamos uma instância da JPGEncoder já passando a qualidade (0 à 100) e por fim “encodamos” o BitmapData utilizando o método encode da nossa instância da JPGEncoder, ele nos retorna um <strong>Array de Bytes (flash.utils.ByteArray)</strong>.</p>
<p><strong>Vamos a parte do actionscript que interessa:</strong></p>
<div class="codecolorer-container actionscript3 mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> encode<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; lblMessage<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;Codificando dados (JPGEncoder.encode)&quot;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #6699cc; font-weight: bold;">var</span> bmpData<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=bitmapdata%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bitmapdata.html"><span style="color: #004993;">BitmapData</span></a> = <span style="color: #0033ff; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=bitmapdata%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bitmapdata.html"><span style="color: #004993;">BitmapData</span></a><span style="color: #000000;">&#40;</span>hit<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">width</span><span style="color: #000066; font-weight: bold;">,</span> hit<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">height</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; bmpData<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">draw</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">target</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <span style="color: #6699cc; font-weight: bold;">var</span> objJPGEncoder<span style="color: #000066; font-weight: bold;">:</span>JPGEncoder = <span style="color: #0033ff; font-weight: bold;">new</span> JPGEncoder<span style="color: #000000;">&#40;</span>sliderQuality<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">value</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <span style="color: #6699cc; font-weight: bold;">var</span> dadosEncode<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=bytearray%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bytearray.html"><span style="color: #004993;">ByteArray</span></a> = objJPGEncoder<span style="color: #000066; font-weight: bold;">.</span>encode<span style="color: #000000;">&#40;</span>bmpData<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; sendToAmf<span style="color: #000000;">&#40;</span>dadosEncode<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #000000;">&#125;</span><br />
<br />
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> sendToAmf<span style="color: #000000;">&#40;</span><span style="color: #004993;">data</span><span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=bytearray%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:bytearray.html"><span style="color: #004993;">ByteArray</span></a><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; lblMessage<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;Enviando dados para o AMF...&quot;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; _objService = <span style="color: #0033ff; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=netconnection%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:netconnection.html"><span style="color: #004993;">NetConnection</span></a><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; _objResponder = <span style="color: #0033ff; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=responder%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:responder.html"><span style="color: #004993;">Responder</span></a><span style="color: #000000;">&#40;</span>onResultEvent<span style="color: #000066; font-weight: bold;">,</span> onStatusEvent<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; _objService<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span>_amfGateway<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; _objService<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">call</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;br.com.bsoares.Image.saveDataToFile&quot;</span><span style="color: #000066; font-weight: bold;">,</span> _objResponder<span style="color: #000066; font-weight: bold;">,</span> <span style="color: #004993;">data</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #000000;">&#125;</span><br />
<br />
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> onResultEvent<span style="color: #000000;">&#40;</span>result<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=object%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:object.html"><span style="color: #004993;">Object</span></a><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; lblMessage<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;Abrindo imagem&quot;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <span style="color: #004993;">navigateToURL</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <a href="http://www.google.com/search?q=urlrequest%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:urlrequest.html"><span style="color: #004993;">URLRequest</span></a><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;http://blog.bsoares.com.br/articles/jpgencoder_amfphp/generated_images/image.jpg&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #990000;">&quot;_blank&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #000000;">&#125;</span><br />
<br />
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> onStatusEvent<span style="color: #000000;">&#40;</span>event<span style="color: #000066; font-weight: bold;">:</span><a href="http://www.google.com/search?q=event%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:event.html"><span style="color: #004993;">Event</span></a><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; lblMessage<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;Erro&quot;</span><span style="color: #000066; font-weight: bold;">;</span><br />
<span style="color: #000000;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>Agora a classe Image do PHP:</strong></p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #000000; font-weight: bold;">class</span> Image<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$imagePath</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">imagePath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;../../../../../generated_images/image.jpg&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> saveDataToFile<span style="color: #009900;">&#40;</span><span style="color: #000088;">$byteArray</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/file_put_contents"><span style="color: #990000;">file_put_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">imagePath</span><span style="color: #339933;">,</span> <span style="color: #000088;">$byteArray</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">imagePath</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p>O PHP só precisa pegar o ByteArray e salvar em um arquivo.</p>
<p>Dica: Para verificar os request usem o <a href="http://www.charlesproxy.com/" target="_blank">Charles Web Debugging Proxy</a>.</p>
<p>É isso ai, qualquer dúvida só postar um comentário.</p>
<p><strong>Conteúdo relacionado:</strong><br />
Código fonte do exemplo: <a href="http://blog.bsoares.com.br/articles/jpgencoder_amfphp/jpgencoder-amfphp.zip" target="_blank">http://blog.bsoares.com.br/articles/jpgencoder_amfphp/jpgencoder-amfphp.zip</a><br />
AMFPHP: <a href="http://www.amfphp.org/" target="_blank">http://www.amfphp.org/</a><br />
AS3CoreLib: <a href="http://code.google.com/p/as3corelib/" target="_blank">http://code.google.com/p/as3corelib/</a><br />
Charles: <a href="http://www.charlesproxy.com/" target="_blank">http://www.charlesproxy.com/</a></p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bsoares.com.br/remoting/jpgencoder-as3-with-amfphp/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Convertendo PNG para SWF com PHP 5</title>
		<link>http://blog.bsoares.com.br/flash/converting-png-to-swf-with-php-5</link>
		<comments>http://blog.bsoares.com.br/flash/converting-png-to-swf-with-php-5#comments</comments>
		<pubDate>Sun, 05 Apr 2009 00:50:14 +0000</pubDate>
		<dc:creator>Bruno Soares</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Techology]]></category>

		<guid isPermaLink="false">http://blog.bsoares.com.br/?p=141</guid>
		<description><![CDATA[Bom para quem não sabe o Adobe Flash consegue uma compressão incrível com arquivos do tipo PNG, mantendo a sua qualidade e transparência. Vou deixar um exemplo de código PHP para fazer essa conversão sem a ajuda de softwares como o png2swf.exe pois a realidade é que muitos servidores (hosts) não permitem que o script [...]]]></description>
			<content:encoded><![CDATA[<p>Bom para quem não sabe o Adobe Flash consegue uma compressão incrível com arquivos do tipo PNG, <strong>mantendo a sua qualidade e transparência</strong>. Vou deixar um exemplo de código PHP para fazer essa conversão sem a ajuda de softwares como o png2swf.exe pois a realidade é que muitos servidores (hosts) não permitem que o script PHP rode softwares.</p>
<p><strong>Classe:</strong></p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* SwfConvertion<br />
&nbsp;* <br />
&nbsp;* @author Bruno Soares<br />
&nbsp;* @link &nbsp; http://www.bsoares.com.br<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">class</span> SwfConvertion<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* image2swf<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param &nbsp;$imagePath String<br />
&nbsp; &nbsp; &nbsp;* @return void<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> image2swf<span style="color: #009900;">&#40;</span><span style="color: #000088;">$imagePath</span><span style="color: #339933;">,</span> <span style="color: #000088;">$outputPath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$outputPath</span> <span style="color: #339933;">=</span> SwfConvertion<span style="color: #339933;">::</span><span style="color: #004000;">resolveOutputPath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$imagePath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$bitmap</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SWFBitmap<span style="color: #009900;">&#40;</span><a href="http://www.php.net/file_get_contents"><span style="color: #990000;">file_get_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$imagePath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SWFShape<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setRightFill</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addFill</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bitmap</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">drawLine</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">drawLine</span><span style="color: #009900;">&#40;</span>0<span style="color: #339933;">,</span> <span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">drawLine</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$shape</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">drawLine</span><span style="color: #009900;">&#40;</span>0<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SWFMovie<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDimension</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bitmap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shape</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param $imagePath Object<br />
&nbsp; &nbsp; &nbsp;* @return String<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000000; font-weight: bold;">function</span> resolveOutputPath<span style="color: #009900;">&#40;</span><span style="color: #000088;">$imagePath</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^(.+)\.([A-Za-z]{3,4})$/i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'${1}.swf'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$imagePath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><strong>Exemplo de uso:</strong></p>
<div class="codecolorer-container php mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span> SwfConvertion<span style="color: #339933;">::</span><span style="color: #004000;">image2swf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'imagem_branco.png'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'imagem_branco_2.swf'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><strong>1º Teste:</strong><br />
PNG: <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/04/imagem_branco.png" rel="shadowbox[post-141];player=img;">imagem_branco.png</a> 167KB<br />
SWF: <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/04/imagem_branco_2.swf" rel="shadowbox[post-141];width=640;height=385;">imagem_branco_2.swf</a> 98KB<br />
<strong>41,31%</strong> de compressão (menos 69KB)</p>
<p><strong>2º Teste:</strong><br />
PNG: <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/04/imagem_vermelho.png" rel="shadowbox[post-141];player=img;">imagem_vermelho.png</a> 309KB<br />
SWF: <a href="http://blog.bsoares.com.br/wp-content/uploads/2009/04/imagem_vermelho_2.swf" rel="shadowbox[post-141];width=640;height=385;">imagem_vermelho_2.swf</a> 264KB<br />
<strong>14,56%</strong>  de compressão (menos 45KB)</p>
<p>Obs.: É importante que você escolha bem as conversões que deseja fazer, pois em alguns casos o SWF pode ficar mais pesado que o PNG ou seja, se você vai utilizar este script para otimizar suas imagens <strong>compare os pesos antes de escolher a definitiva</strong>.</p>
<p><strong>Conteúdo relacionado:</strong><br />
PHP Shockwave Flash: <a href="http://br2.php.net/manual/pt_BR/book.swf.php" target="_blank">http://br2.php.net/manual/pt_BR/book.swf.php</a><br />
Funções para SWF: <a href="http://br2.php.net/manual/pt_BR/ref.swf.php" target="_blank">http://br2.php.net/manual/pt_BR/ref.swf.php</a></p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bsoares.com.br/flash/converting-png-to-swf-with-php-5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
