Posted in

Generar una imagen a partir de flash

Exportar a una imagen un movieclip, o cualquier elemento de flash con AS3.
para que funcione el ejemplo, tanto el swf como el php se deben encontrar en el mismo dominio.

[swfobj src=”https://blog.oscarperiche.com/wp-content/uploads/2012/02/envio_simple.swf”]

Se toma un “pantallazo” dibujando el movieclip en un bitmapData

var bmpData:BitmapData = new BitmapData(foto_mc.width, foto_mc.height);
    bmpData.draw(foto_mc);

Se crea un objeto JPGEncoder. El parámetro indica la calidad de la imagen (sobre 100). Se codifica el bitmapData y se asigna a un byteArray.

 var jpg_codificado:JPGEncoder = new JPGEncoder(99);
    var byteArray:ByteArray = jpg_codificado.encode(bmpData);

El tipo de cabecera indica que se trata de un archivo binario

 var cabecera:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");

Se crea un objeto URLRequest que contiene toda la información referente al envío. El parámetro data es que el que contiene la foto codificada, y el parámetro vFoto el nombre que le queramos asignar (no es obligatorio).

var urlFoto:URLRequest = new URLRequest();
    urlFoto.requestHeaders.push(cabecera);
    urlFoto.method = URLRequestMethod.POST;
    urlFoto.data = byteArray;
    urlFoto.url = _ruta + "?vFoto=" + _nombre_foto;

En este ejemplo se manda abrir el php en una ventana en blanco, pero lo normal sería utilizar un objeto URLLoader para enviar la información y procesar el resultado.

navigateToURL(urlFoto, "_blank");

descargar ejemplo

Para cosas muy sencillas el ejemplo anterior es perfecto, pero normalmente, cuando se envía un archivo se suele acompañar también de variables que contienen información. Al asignar a la propiedad data el byteArray, perdemos todas las opciones de adjuntar un objeto con dicha información.

[swfobj src=”https://blog.oscarperiche.com/wp-content/uploads/2012/02/envio_multiple.swf”]

Un “truquillo” sería enviar la foto mediante POST y aprovechar la url para pasar variables por GET, igual que hemos hecho con el nombre del archivo. Por ejemplo:

urlFoto.url = "ruta/form.php?vFoto=avatar.jpg&nombre=llops&edad=28"; 

De todas formas, no es el sistema más limpio, y mejor usarlo como un recurso puntual para pasar pocos parámetros (aunque no tiene nada que ver con el mito de los 256 caracteres).

Lo ideal es poder hacer un envío multipart, igual que se hace con los formularios html o como lo hace la propia clase de AS3 FileReference.

Enviando una imagen y datos mediante la clase UploadPostHelper
La clase UploadPostHelper te permite pasar un nombre de archivo, un ByteArray y un Object y devuelve otro ByteArray con todo el contenido codificado que podemos enviar como data.
El uso sigue siendo muy sencillo: la mayoría de pasos del ejemplo anterior son los mismos, y UploadPostHelper hace todo el trabajo sucio de forma transparente:

    var urlFicha:URLRequest = new URLRequest();
    urlFicha.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
    urlFicha.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
    urlFicha.method = URLRequestMethod.POST;
    urlFicha.data = UploadPostHelper.getPostData(_nombre_foto, byteArray, datos);
    urlFicha.url = _ruta;

descargar ejemplo 2

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *


The reCAPTCHA verification period has expired. Please reload the page.