Pixelando imágenes en Actionscript 3.0

Etiquetas: Bitmapdata threshold getPixel32 draw

Pixelando imágenes en Actionscript 3.0

Este post es una modificación de este experimento.

En el anterior recortaba una imagen en cuadrados, comprobando si contenían algún pixel transparente o no. En este divido la imagen en cuadrados, calculo el color que aparece mas veces en ese cuadrado, y creo un Shape relleno de ese color que coloco en las coordenadas del cuadrado.

Las función que calcula el color dominante es esta:

  1.  
  2. public static function obtenerColorPrincipal( source:BitmapData):Array
  3. {
  4. var n:Object = {};
  5. var a:Array = [];
  6. var p:int;
  7. var alphaValue:uint
  8.  
  9. for (var x:int = 0; x < source.width; x += 10)
  10. {
  11. for (var y:int = 0; y < source.height; y+= 10)
  12. {
  13. p = source.getPixel32(x, y);
  14. alphaValue = p >> 24 & 0xFF;
  15. if (alphaValue > 0x00) {
  16. n[p] ? n[p]++ : n[p] = 1;
  17. }
  18. }
  19. }
  20.  
  21. for (var c:String in n)
  22. {
  23. a.push ( { colour:c, count:n[c] } );
  24. }
  25.  
  26. return a.sortOn( ["count"], Array.DESCENDING );
  27. }
  28.  

Efecto lupa en Actionscript 3.0

Etiquetas: BitmapData Bitmap smoothing mask drawCircle

Efecto lupa en Actionscript 3.0

En este ejemplo voy a tratar de explicar como se hace el "Efecto lupa" en Flash, con Actionscript 3.0.

Para simplificar voy a explicar la teoria basándome en una imagen que tengo en un MovieClip el escenario. Por supuesto esto se puede modificar para cargar imágenes externamente o como se necesite.

Los pasos que tenemos que seguir para crear el "efecto lupa" son estos:

-Crear una copia del MovieClip en BitmapData, y ponerla por encima a una escala mayor que el original:

  1.  
  2. //Creo un pantallazo del clip, lo pongo con una escala == zoom
  3. var myBitmapData:BitmapData = new BitmapData(clip.width, clip.height);
  4. myBitmapData.draw(clip);
  5. var bmp:Bitmap = new Bitmap(myBitmapData);
  6. bmp.smoothing = true;
  7. contenedor.addChild(bmp);
  8. contenedor.scaleX = contenedor.scaleY = zoom;
  9. addChild(contenedor);

-Poner a la copia una máscara circular, de manera que solo se vea el trozo de imágen tapado por la máscara:

  1.  
  2. //Le pongo una mascara del tamaño t al contenedor
  3. mascara.graphics.beginFill(0x000000, 1);
  4. mascara.graphics.drawCircle(0, 0, t);
  5. contenedor.mask = mascara;
  6. addChild(mascara);
  7.  

-Añadimos un evento enterframe. Dentro de la función del evento vamos a mover la máscara siguiendo al ratón, y a recolocar la "copia grande":

  1.  
  2. addEventListener(Event.ENTER_FRAME,renderizar)
  3.  

En la función del evento tenemos que mover la máscara para que siga al ratón, y recolocar la imagen grande para que el trozo que se vé sea el que corresponde a la imagen pequeña. La función es cuestión es esta:

  1.  
  2. private function renderizar(e:Event):void {
  3. //Calculo el porcentaje que tengo que mover el pantallazo
  4. var porcentajeX = clip.mouseX / clip.width;
  5. var porcentajeY = clip.mouseY / clip.height;
  6. //Recoloco el contenedor
  7. contenedor.x = -(contenedor.width - clip.width) * porcentajeX
  8. contenedor.y = -(contenedor.height - clip.height) * porcentajeY
  9. //Muevo la mascara
  10. mascara.x = escenario.mouseX;
  11. mascara.y = escenario.mouseY;
  12. }
  13.  

Adjunto fuentes con todos los materiales, por si queda alguna duda.

Comparar pixels de imágenes en Actionscript 3.0 con threshold

Etiquetas: BitmapData clone threshold

Comparar pixels de imágenes en Actionscript 3.0 con threshold

La función threshold permite hacer comparaciones pixel a pixel en una imagen. Por ejemplo, podemos separar todos los pixels mayores de un color de una imagen, y obtener otra imagen con esos pixels. La función threshold tiene 5 parámetros obligatorios (y varios opcionales):

threshold(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, operation:String, threshold:uint)

-sourceBitmapData: la imagen que vamos a utilizar

-sourceRect: rectángulo que define el area de la imagen de origen que vamos a utilizar

-destPoint: punto de la imagen de destino que corresponde a la esquina superior izquierda del rectángulo

-operation: operación que vamos a utilizar

-threshold: valor con el que comparamos cada pixel

Por ejemplo, si queremos separar los pixels mayores de 0xFFCCCCCC de los menores en una imagen, podemos utilizar:

  1.  
  2. img1.threshold(img1, new Rectangle(0, 0, 350, 242), new Point(0, 0), ">", 0xFFCCCCCC);
  3. img2.threshold(img2, new Rectangle(0, 0, 350, 242), new Point(0, 0), "<=", 0xFFCCCCCC);

El código completo y los fuentes:

Comparando imágenes en Actionscript 3.0 con compare()

Etiquetas: BitmapData draw Bitmap compare

Comparando imágenes en Actionscript 3.0 con compare()

Esta prueba se me ha ocurrido hoy en el metro. Es algo muy sencillo, hacer una captura de un video, y compararla con la anterior para sacar los pixels diferentes y mostrar esta diferencia.

La comparación se puede hacer con la función compare de BitmapData:

  1.  
  2. var df:BitmapData = BitmapData(bmd.compare(ant));
  3.  

Hay que tener "cuidado" con esta función, ya que no siempre devuelve un objeto BitmapData. Según la ayuda de Flash:

Si los objetos BitmapData son equivalentes (con la misma anchura y altura e idénticos valores de píxeles), el método devolverá el número 0.

Si la anchura de los objetos BitmapData no es la misma pero la altura sí, el método devolverá el número -3.

Si la altura de los objetos BitmapData no es la misma pero la anchura sí, el método devolverá el número -4.

El video que he utilizado para la prueba es D.A.N.C.E., del grupo francés Justice.

Actionscript 2.0: Utilizar imágenes de la biblioteca

Etiquetas: attachBitmap BitmapData loadBitmap

El siguiente método muestra como añadir imágenes de nuestra biblioteca a la escena de la película, usando BitmapData y el método attachBitmap.

Guardar imágenes en AS3 con PNGEncoder y Base64

Etiquetas: PNGEncoder Base64 BitmapData Rectangle encodeByteArray

Para guardar una imagen en AS2 habia que almacenar los colores de todos sus pixels, y mandar una cadena de texto con los valores a un fichero en el servidor para que creara la imagen. Esto era viable para imágenes relativamente pequeñas, ya que tanto Flash como el servidor tardaban mucho en procesar los datos. Con AS3 han surgido varias clases que aprovechan el potencial de la clase ByteArray y optimizan el flujo de datos Flash/servidor. En este ejemplo utilizo las clases PNGEncoder y Base64 para guardar un dibujo hecho en flash y guardarlo en el servidor como PNG. El tamaño de la imagen es de 400x400, y el proceso no dura más de 2 seg.

Este es el código:

Crear reflejos por medio de Actionscript 3.0

Etiquetas: BitmapData Bitmap draw cachaAsBitmap createGradientBox beginGradientFill

Esta función recibe como parámetro un MovieClip y crea su reflejo. Para ello se copia la imagen del mc en un Bitmap y después de le aplica como máscara un degradado. Para modificar el reflejo se puede jugar con los valores de alphas y ratios con los que se crea el degradado.

Actionscript 3.0: utilizar imágenes de la biblioteca

Etiquetas: Bitmap BitmapData

Este ejemplo muestra como añadir al esenario imágenes de la biblioteca con Actionscript 3. Para ello hay que tenerlas vinculadas con un nombre de clase (en este caso material1), que es el que utilizaremos para crear el objeto en el escenario.

Guardar imágenes con BitmapData y PHP

Etiquetas: BitmapData draw getPixel getURL sendAndLoad

La idea es sencilla: Hacer un dibujo en Flash, y guardarlo como jpg ( o guardar el contenido de un clip, o hacer un pantallazo). El proceso es el siguiente:

  • "Calcar" el objeto que queremos guardar en un objeto BitmapData
  • Recorrer ese objeto para almacenar el color de cada pixel en un String.
  • Mandar ese String a un PHP para que nos "pinte" la imagen y la guarde.

    Y el código (el Actionscript, el PHP lo saqué de Google) es este: