Salvando um MovieClip como Imagem – Flash 8

Coluna Flash – Salvando um MovieClip como uma Imagem – Flash 8 (BitmapData) + PHP (GD)

Buenos,

Mostrarei neste artigo, uma solução de como salvar ou exportar, um MC como uma Imagem, jpg ou png no pc do usuário.

Lembrando que para que o mesmo funcione, será necessário Flash 8 e PHP com a biblioteca GD instalada. Digamos que este tutorial seja de nível intermediário.

1º Passo – Entendendo o Processo:

Até o Flash mx 2004 isto não era possível, agora no Flash 8 com a classe BitmapData, podemos tratar qualquer MC, Video ou Imagem, como um Bitmap. Aí é que consiste a tecnica, através da BitmapData, pegaremos pixel por pixel do MC, e enviaremos via LoadVars ao PHP. Chegando no PHP, o mesmo através da biblioteca GD, aloca os pixels, transforma as cores, e monta nossa imagem.

Neste artigo mostrarei o código PHP para este recurso, e disponibilizarei uma classe facilitadora para a exportação.

2º Passo – A classe MCE – MovieClip Exporter:

Começaremos baixando a classe aqui. Deverá ser salva na pasta de nosso projeto. Se quiserem analisá-la fiquem a vontade. Neste, mostrarei só seus eventos e métodos.

Exemplo:

/* criando o obj MCE…*/
var mceImagem:MCE = new MCE();
/*em format definimos se queremos JPG ou PNG. PNG depende do servidor, mais JPG quase todos tem… */
mceImagem.format = “jpg”;
/*target é o mc Alvo da exportação… */
mceImagem.target = mcImagem;
/*criando listener de eventos..*/
var objMCE:Object = new Object();
/*evento de início da captura…*/
objMCE.onCaptureStart = function(mcAlvo:MovieClip, tempoInicio:Date):Void
{
trace(“Iniciando Captura… em: ” + mcAlvo);
mcProgresso._visible = true;
}
/*evento de progresso na captura, quanto mais pixels, mais vai tempo…*/
objMCE.onCaptureProgress = function(mcAlvo:MovieClip, progresso:Number):Void
{
trace(“Status: ” + progresso + “%”);
mcProgresso.xBar._xscale = progresso;
}
/*captura dos pixels do mc, em uma imagem, dispostos em uma string, tb informa a largura e altura, necessaria para criação da imagem…*/
objMCE.onCaptureEnd = function(mcAlvo:MovieClip, lvEnvia:LoadVars, tempoInicio:Date, tempoFinal:Date):Void
{
trace(“Captura Finalizada… em: ” + mcAlvo);
trace(“Tempo Estimado: ” + ((tempoFinal – tempoInicio)/1000));
lvEnvia.sendAndLoad(“./salvar.php?r=” + (new Date()).getSeconds(), lvImagem, “POST”);
mcProgresso._visible = false;
}
/*evento chamado no cancelamento da ação de exportação…*/
objMCE.onCaptureCancel = function(mcAlvo:MovieClip, tempoInicio:Date, tempoFinal:Date):Void
{
trace(“Cancelado… em: ” + mcAlvo);
mcProgresso._visible = false;
}
/*adicionando os eventos a classe… */
mceImagem.addListener(objMCE);
/*o método export da class MCE, tem um argumento, que é o nome da imagem, junto com a pasta de destino…*/
mceImagem.export(“imagem101.jpg”);

Bom a classe tem algumas definições:

  • MCE.format – “jpg” ou “png”: Formato de exportação da imagem, PNG fica muito melhor, porém não é todo servidor que o GD da suporte ao PNG.
  • MCE.target: O MovieClip que será exportado em questão.

E e dois métodos:

  • MCE.export: Possui um argumento, filename:String, que é o nome do arquivo junto ao seu destino, se for o caso.
  • MCE.cancel: Como o processo pega pixel por pixel, dependendo do tamanho de seu MC demora um pouco, então esse método aborta a exportação.

E os eventos:

  • MCE.onCaptureStart(mcAlvo:MovieClip, tempoInicio:Date) – mc que esta sendo exportado, e obj Date do inicio da exportação, e bom para uma comparação de tempo caso demore muito a imagem, no evento onCaptureEnd tem o tempoFinal.
  • MCE.onCaptureProgress(mcAlvo:MovieClip, progresso:Number) – o primeiro é o mesmo para todos os eventos, já o progresso é o numero da porcentagem do progresso, para caso queiram fazer um preload.
  • MCE.onCaptureEnd(mcAlvo:MovieClip, lvEnvia:LoadVars, tempoInicio:Date, tempoFinal:Date) – ao final da captura, nos envia o mc alvo, o objeto LoadVars já com as informações que deve ser enviada ao PHP, o tempo de inicio do processo e o tempo final.
  • MCE.onCaptureCancel(mcAlvo:MovieClip, tempoInicio:Date, tempoFinal:Date) – quando cancelada a ação, mc alvo, o tempo que iniciou e o tempo em que foi cancelada.

Observação:

É interessante, delimitarmos a área do MC, nem que seja virtualmente, para que o processo saiba onde começar e onde terminar, sempre.

<?php
error_reporting(E_ALL);
//função responsável pela exportação do MC…
function exporta()
{
global $_REQUEST;
//verificando se o GD está instalado…
if(!function_exists(“imagecreate”)) die(“Para exportar o MC, vc necessitará da biblioteca GD instalada!”);
//resgatando variáveis do flash e tb verificamos se as mesmas foram preenchidas…
$w = (isset($_REQUEST['width']) && strlen($_REQUEST['width']) > 0) ? intval($_REQUEST['width']) : 3;
$h = (isset($_REQUEST['height']) && strlen($_REQUEST['height']) > 0) ? intval($_REQUEST['height']) : 3;
$s = (isset($_REQUEST['dataString']) && strlen($_REQUEST['dataString']) > 0) ? $_REQUEST['dataString'] : “2550000,2550000\n2550000,2550000″;
$ext = (isset($_REQUEST['format']) && strlen($_REQUEST['format']) > 0) ? $_REQUEST['format'] : “png”;
$nome = (isset($_REQUEST['filename']) && strlen($_REQUEST['filename']) > 0) ? $_REQUEST['filename'] : “imagem.” . $ext ;
//criando image do GD…
$image = (function_exists(“imagecreatetruecolor”)) ? imagecreatetruecolor($w, $h) : imagecreate($w, $h);
//preenchendo o fundo da imagem de branco…os pixels brancos nao vem do flash por uma economia…
imagefill($image, 0, 0, 0xFFFFFF);
//quebrando a string que vem do flash em um array de pixels…
$color = explode(chr(13), $s);
for($i = 0; $i < $h; $i++){
$linha = explode(“,”, $color[$i]);
for($j = 0; $j < $w; $j++){
//pegando cada pixel, de cada linha…
$hex = $linha[$j];
if(strlen($hex) > 0){
//convertendo HEX para DECIMAL…
while(strlen($hex) < 6) $hex = “0″ . $hex;
$r = hexdec(substr($hex, 0, 2));
$g = hexdec(substr($hex, 2, 2));
$b = hexdec(substr($hex, 4, 2));
//alocando o rgb a imagem…
$tmp = imagecolorallocate($image, $r, $g, $b);
//inserindo pixel na nova imagem…
imagesetpixel($image, $j, $i, $tmp);
}
}
}
//salvando o arquivo de imagem, de acordo com o tipo especificado…
if($ext == “jpg”)
imagejpeg($image, $nome, 100);

if($ext == “png”)
imagepng($image, $nome, 100);

//limpando memória…
imagedestroy($image);
//resposta para o Flash…
echo “salvo=true&file=” . $nome . “&”;
}
//executando função export…
exporta();
?>

Bom é isso pessoal, salva este php na mesma pasta do swf de preferência, rode em seu servidor, não esqueçam que a pasta em que a imagem vai ser salva no servidor tem que ter permissão de escrita 777 (chmod 777). No mais clique abaixo e faça o download de um exemplo completo.

Clique aqui para baixar os arquivos de exemplo deste tutorial.

Até a próxima e abracetas… ;)

Autor: Lucas Ferreira – www.lucasferreira.com

Qualquer dúvida envie um email para contato@lucasferreira.com ou acesse o nosso fórum.

Escrito por Lucasferreira on fevereiro 21, 2006. Arquivado em Flash. Você pode seguir as respostas a esse artigo pelo RSS 2.0. Você pode deixar respostas para esse artigo

1 resposta a Salvando um MovieClip como Imagem – Flash 8

  1. Eu disponibilizei em meu blog isso aí na versão AS3 e sem usar o PHP. Link

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>