JPGEncoder (AS3) com AMFPHP
Posted in ActionScript 3.0, Flash, PHP, Remoting on abril 7th, 2009 by Bruno Soares – 2 CommentsTenho 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 com ActionScript 3, encodar essas imagens com a classe JPGEncoder presente na biblioteca as3corelib e salvar como um arquivo .jpg utilizando o AMFPHP). Já escrevi aqui como fazer isso em FluorineFx (ASP.NET Flash Remoting Gateway).
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 XAMPP (é de fácil instalação e tem tudo que um programador precisa).
Configuração do AMFPHP:
A versão que utilizo neste tutorial é a 1.9 beta, mas versões posteriores devem funcionar perfeitamente.
• Baixe o AMFPHP do seguinte link: http://www.amfphp.org/
• 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:

• Para testar o funcionamento é só acessar o diretório browser do navegador (http://127.0.0.1/www/amf/browser/).
Fique entendido que a responsabilidade de gerar a imagem é do Flash, e o servidor deve apenas receber os binários para gravar em disco. Para gerarmos o código da imagem (binário), vamos utilizar a classe JPGEncoder.
Exemplo:
1 2 3 4 5 6 7 8 | import flash.display.BitmapData; import flash.utils.ByteArray; import com.adobe.images.JPGEncoder; var bmpData:BitmapData = new BitmapData(width, height); bmpData.draw(MEU_MOVIECLIP); var objJPGEncoder:JPGEncoder = new JPGEncoder(QUALIDADE); var dadosEncode:ByteArray = objJPGEncoder.encode(bmpData); |
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 Array de Bytes (flash.utils.ByteArray).
Vamos a parte do actionscript que interessa:
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 | private function encode():void { lblMessage.text = "Codificando dados (JPGEncoder.encode)"; var bmpData:BitmapData = new BitmapData(hit.width, hit.height); bmpData.draw(target); var objJPGEncoder:JPGEncoder = new JPGEncoder(sliderQuality.value); var dadosEncode:ByteArray = objJPGEncoder.encode(bmpData); sendToAmf(dadosEncode); } private function sendToAmf(data:ByteArray):void { lblMessage.text = "Enviando dados para o AMF..."; _objService = new NetConnection(); _objResponder = new Responder(onResultEvent, onStatusEvent); _objService.connect(_amfGateway); _objService.call("br.com.bsoares.Image.saveDataToFile", _objResponder, data); } private function onResultEvent(result:Object):void { lblMessage.text = "Abrindo imagem"; navigateToURL(new URLRequest("http://blog.bsoares.com.br/articles/jpgencoder_amfphp/generated_images/image.jpg"), "_blank"); } private function onStatusEvent(event:Event):void { lblMessage.text = "Erro"; } |
Agora a classe Image do PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php class Image { var $imagePath; public function __construct () { $this->imagePath = "../../../../../generated_images/image.jpg"; } function saveDataToFile($byteArray) { file_put_contents($this->imagePath, $byteArray->data); return $this->imagePath; } } ?> |
O PHP só precisa pegar o ByteArray e salvar em um arquivo.
Dica: Para verificar os request usem o Charles Web Debugging Proxy.
É isso ai, qualquer dúvida só postar um comentário.
Conteúdo relacionado:
Código fonte do exemplo: http://blog.bsoares.com.br/articles/jpgencoder_amfphp/jpgencoder-amfphp.zip
AMFPHP: http://www.amfphp.org/
AS3CoreLib: http://code.google.com/p/as3corelib/
Charles: http://www.charlesproxy.com/
Enjoy





