Bitmapdata, copiando canales de color

julio 3, 2006

Mas codigo, esta vez, vamos a jugar un poco con el objeto BitmapData de Flash 8.

En este ejemplo esta la imagen original, y tres imagenes, con los colores cambiados. Como? pues copie la informacion del canal verde del bitmap original de tres distintas formas. Veamos que se hizo.

  1. //importamos las clases necesarias para trabajar con Bitmaps y copiar canales
  2. import flash.display.BitmapData;
  3. import flash.geom.Rectangle;
  4. import flash.geom.Point;
  5. //crear bitmapdata con el bitmap sin modificar
  6. b1 = BitmapData.loadBitmap("bitmaptest");

La clase flash.display.BitmapData es necesaria para todo lo que tenga que ver con Bitmaps.
Para traer un bitmap de la libreria, es necesario darle un nombre para utilizarlo con actionscript (en nuestro caso, bitmaptest). Esta opcion se modifica dando click derecho en el bitmap de la libreria, en la opcion ‘linkage’.

Luego, creamos un bitmap vacio y lo adjuntamos a un movieclip vacio

  1. //creamos un nuevo bitmap de color verde (#00FF00)
  2. var b2:BitmapData = new BitmapData(100, 133, true, 0xFF000000);
  3. //creamos el movieclip donde pondremos el nuevo bitmap
  4. this.createEmptyMovieClip('mc2', this.getNextHighestDepth());
  5. //posicionamos el movieclip
  6. this.mc2._x = 100;
  7. //adjuntamos el nuevo bitmap al movieclip
  8. this.mc2.attachBitmap(b2, this.getNextHighestDepth());

Listo, finalmente, copiamos la informacion del canal verde del bitmap original en el canal verde del nuevo bitmap:

  1. //copiamos la informacion del canal verde del original en el canal verde de la copia
  2. b2.copyChannel(b1, new Rectangle(0, 0, 100, 133), new Point(0, 0), 2, 2);

el metodo copyChannel de la clase BitmapData tiene los siguientes parametros:

sourceBitmap:el bitmap original de donde vamos a copiar la informacion.

sourceRect:flash.geom.Rectangle , Un objeto Rectangle con el que especificamos el area que vamos a copiar (en nuestro ejemplo, el area tiene las mismas dimensiones del bitmap original).

destPoint:flash.geom.Point , El punto donde ‘pegaremos’ el resultado de la copia, en nuestro ejemplo, lo estamos pegando en el inicio (esquina superior izquierda), asi que utilizamos: new Point(0, 0).
sourceChannel: Number, el numero del canal que vamos a copiar. Los valores posibles son 1 (rojo), 2 (verde), 3 (azul) y 8 (alpha).

destChannel:Number, el canal de destino. Los valores posibles son los mismos que en el parametro anterior: 1,2,4,8.

En el segundo ejemplo, copio el canal verde del bitmap original sobre un bitmap blanco:

  1. //bitmap copiando el canal verde del original
  2. var b3:BitmapData = new BitmapData(100, 133, true, 0xFFFFFFFF);
  3. this.createEmptyMovieClip('mc3', this.getNextHighestDepth());
  4. this.mc3._x = 200;
  5. this.mc3.attachBitmap(b3, this.getNextHighestDepth());
  6. //copiamos la informacion del canal verde del original en el canal verde de la copia
  7. b3.copyChannel(b1, new Rectangle(0, 0, 100, 133), new Point(0, 0), 2, 2);

Y para el tercero, copio el canal verde del bitmap original en cada uno de los canales del nuevo bitmap:

  1. var b4:BitmapData = new BitmapData(100, 133, true, 0xFFFFFFFF);
  2. this.createEmptyMovieClip('mc4', this.getNextHighestDepth());
  3. this.mc4._x = 300;
  4. //añadimos el bitmap al movieclip
  5. this.mc4.attachBitmap(b4, this.getNextHighestDepth());
  6. //copiamos el canal verde del primer bitmap en todos los canales del nuevo bitmap
  7. b4.copyChannel(b1, new Rectangle(0, 0,100, 133), new Point(0, 0), 2, 1);
  8. b4.copyChannel(b1, new Rectangle(0, 0,100, 133), new Point(0, 0), 2, 2);
  9. b4.copyChannel(b1, new Rectangle(0, 0, 100, 133), new Point(0, 0), 2, 4);

Puesto que acabamos de realizar todas las copias y recopias, podemos deshacernos del bitmap original:

  1. //nos deshacemos del bitmap original
  2. b1.dispose()

(en el ejemplo, la imagen original que aparece no es creada con actionscript, simplemente ya se encontraba en el stage).

La foto de este ejemplo la saque de flickr: ver foto en tamaño original aqui
Bajar el archivo fla (flash 8 ): colortest1.zip