Lucas Ferreira (contato@lucasferreira.com) Lucas Ferreira é webdeveloper, atuante na área de web desde 2001. Com experiência em diversas linguagens, dentre as principais PHP, JS, AS, XHTML, HTML e CSS, é amante do Flash e tem contato com a ferramenta desde sua versão 4. Atualmente é sócio-diretor e desenvolvedor chefe da Burn web.studio. |
Salvando um MC 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
{
tTrace.text = "";
trace("Iniciando Captura... em: " + mcAlvo);
tTrace.text += "Iniciando Captura... em: " + mcAlvo + chr(13);
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);
tTrace.text += "Captura Finalizada... em: " + mcAlvo + chr(13);
trace("Tempo Estimado: " + ((tempoFinal - tempoInicio)/1000));
tTrace.text += "Tempo Estimado: " + ((tempoFinal - tempoInicio)/1000).toString() + chr(13);
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);
tTrace.text += "Cancelado... em: " + mcAlvo + chr(13);
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:
E e dois métodos:
E os eventos:
Observação:
É interessante, delimitarmos a área do MC, nem que seja virtualmente, para que o processo saiba onde começar e onde terminar, sempre.

3º Passo - Enfim o código PHP:
Segue abaixo o código php, já comentado:
<?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";
//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... ;)