Cuando se desea cambiar la apariencia de una imagen de mapa de bits a nivel de sus píxeles, en primer lugar es necesario obtener los valores de color de los píxeles que contiene el área que se pretende manipular. Para leer esos valores de los píxeles se utiliza el método
getPixel()
.
El método
getPixel()
obtiene el valor RGB del par de coordenadas x, y (píxel) que se le pasan como parámetros. Si alguno de los píxeles que se desea manipular incluye información de transparencia (canal alfa), será necesario emplear el método
getPixel32()
. Este método también lee un valor RGB pero, al contrario que
getPixel()
, el valor devuelto por
getPixel32()
contiene datos adicionales que representan el valor del canal alfa (transparencia) del píxel seleccionado.
Por otra parte, si simplemente se desea cambiar el color o la transparencia de un píxel que pertenece a un mapa de bits, se pueden usar los métodos
setPixel()
o
setPixel32()
. Para definir el color de un píxel basta con pasar las coordenadas x, y, además del valor del color, a uno de estos métodos.
En el siguiente ejemplo se utiliza
setPixel()
para dibujar una cruz en un fondo BitmapData verde. A continuación, se emplea
getPixel()
para leer el valor del color del píxel que se encuentra en las coordenadas 50, 50 y se realiza un seguimiento del valor devuelto.
import flash.display.Bitmap;
import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0x009900);
for (var i:uint = 0; i < 100; i++)
{
var red:uint = 0xFF0000;
myBitmapData.setPixel(50, i, red);
myBitmapData.setPixel(i, 50, red);
}
var myBitmapImage:Bitmap = new Bitmap(myBitmapData);
addChild(myBitmapImage);
var pixelValue:uint = myBitmapData.getPixel(50, 50);
trace(pixelValue.toString(16));
Si se desea leer el valor de un grupo de píxeles, en lugar del de uno solo, se debe usar el método
getPixels()
. Este método genera un conjunto de bytes a partir de una región rectangular de datos de píxeles que se transmite como parámetro. Cada uno de los elementos del conjunto de bytes (dicho de otro modo, los valores de los píxeles) es un entero sin signo, es decir, un valor de píxel no multiplicado de 32 bits.
A la inversa, para cambiar (o definir) el valor de un grupo de píxeles, se usa el método
setPixels()
. Este método recibe dos parámetros (
rect
y
inputByteArray
), que se combinan para dar lugar a una región rectangular (
rect
) de datos de píxeles (
inputByteArray
).
A medida que se leen (y escriben) los datos de
inputByteArray
, se llama al método
ByteArray.readUnsignedInt()
para cada uno de los píxeles del conjunto. Si, por algún motivo,
inputByteArray
no contiene todo un rectángulo de datos de píxeles, el método deja de procesar los datos de imagen en ese punto.
Es importante recordar que, tanto para leer como para definir los datos de los píxeles, el conjunto de bytes espera valores de píxeles de 32 bits compuestos por los canales alfa, rojo, verde y azul (ARGB).
En el siguiente ejemplo se utilizan los métodos
getPixels()
y
setPixels()
para copiar un grupo de píxeles de un objeto BitmapData a otro:
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
import flash.geom.Rectangle;
var bitmapDataObject1:BitmapData = new BitmapData(100, 100, false, 0x006666FF);
var bitmapDataObject2:BitmapData = new BitmapData(100, 100, false, 0x00FF0000);
var rect:Rectangle = new Rectangle(0, 0, 100, 100);
var bytes:ByteArray = bitmapDataObject1.getPixels(rect);
bytes.position = 0;
bitmapDataObject2.setPixels(rect, bytes);
var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1);
addChild(bitmapImage1);
var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2);
addChild(bitmapImage2);
bitmapImage2.x = 110;