No artigo anterior já havia demonstrado o poder do Flex, criando um FLV. Neste agora, em um pequeno exemplo vou demonstrar como converter uma Imagem PNG em um SWF e salvar em sua maquina.
Quando clicar no Botão Salvar será executado a função gravarHandler() que captura um Snapshot do vídeo com a classe ImageSnapshot. Este Snapshot é convertido para PNG com a classe PNGEncoder e utilizando a classe Loader é carregado estes Bytes em um formato já mais parecido com um SWF. Então não precisaremos fazer muitas alterações no formato resultante.
Os bites resultante da classe Loader são separados em duas partes. Uma primeira chamada de header contendo os 8 primeiros bytes do PNG. Substituo a primeira TAG por ‘F’. O restante do PNG eu comprimo e retorno a montar os 8 primeiros caracteres com os demais caracteres comprimidos.
protected function gravarHandler():void { // captura um print da webcam var bdata:BitmapData = ImageSnapshot.captureBitmapData(camera) // converte para PNG var imagem:ByteArray = ( new PNGEncoder()).encode( bdata ); // Usa a clase Load para carregar a imagem var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loaderCompleteHandler ); loader.loadBytes( imagem ); } private function loaderCompleteHandler( event:Event ):void { var loaderinfo:ByteArray = ( event.target as LoaderInfo ).bytes // cria o bitearray do cabeçalho var header:ByteArray = new ByteArray(); header.endian = Endian.LITTLE_ENDIAN; header.writeBytes( loaderinfo, 0, 8 ); header[0] = 0x43; // 'C' letter; header.position = 0; // cria o bitearray do corpo var corpo:ByteArray = new ByteArray(); corpo.endian = Endian.LITTLE_ENDIAN; corpo.writeBytes( loaderinfo, 8 ); corpo.position = 0; corpo.compress(); corpo.position = 0; // criando o SWF var swf:ByteArray = new ByteArray(); swf.writeBytes( header ); swf.writeBytes( corpo ); var file:FileReference = new FileReference(); file.save( swf, "imagem.swf" ); }
Veja abaixo funcionado.
Fonte disponível aqui, e se quiser mais detalhes, comente.