JPGEncoder (AS3) com AMFPHP
Autor: Bruno Soares | Publicado: 2009-04-24T15:04:00-03:00

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 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: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: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:&lt;?phpclass 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;    }}?&gt;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:Post original: http://blog.bsoares.com.br/remoting/jpgencoder-as3-with-amfphpCódigo fonte do exemplo: http://blog.bsoares.com.br/articles/jpgencoder_amfphp/jpgencoder-amfphp.zipAMFPHP: http://www.amfphp.org/AS3CoreLib: http://code.google.com/p/as3corelib/Charles: http://www.charlesproxy.com/Enjoy