Manipulação de pixels

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

A classe BitmapData também contém um conjunto de métodos que permitem manipular valores de dados de pixels.

Manipulação de pixels individuais

Ao alterar a aparência de uma imagem de bitmap no nível de pixel, você primeiro precisa obter os valores de cores dos pixels contidos dentro da área que deseja manipular. Use o método getPixel() para ler esses valores de pixel.

O método getPixel() recupera um valor RGB a partir de um conjunto de coordenadas x, y (pixel) transmitidas como parâmetros. Se qualquer um dos pixels que você deseja manipular incluir informações sobre transparência (canal alfa), será necessário usar o método getPixel32() . Esse método também recupera um valor RGB, mas diferente de getPixel() , o valor retornado por getPixel32() contém dados adicionais que representam o valor do canal alfa (transparência) do pixel selecionado.

Como alternativa, se você quiser simplesmente alterar a cor ou a transparência de um pixel contido em um bitmap, poderá usar o método setPixel() ou setPixel32() . Para definir uma cor de pixels, transmita simplesmente as coordenadas x, y e o valor da cor para um desses métodos.

O exemplo a seguir usa o método setPixel() para desenhar uma cruz em um plano de fundo BitmapData verde: Ele então usa getPixel() para recuperar o valor da cor do pixel nas coordenadas 50, 50 e liga o valor retornado.

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));

Se você quiser ler o valor de um grupo de pixels, use o método getPixels() . Esse método gera uma matriz de bytes a partir de uma região retangular dos dados de pixels que são transmitidos como um parâmetro. Cada um dos elementos da matriz de bytes (em outra palavras, os valores de pixel) são valores de pixel inteiros não assinados de 32 bits e não multiplicados.

Inversamente, para alterar (ou definir) o valor de um grupo de pixels, use o método setPixels() . Esse método espera dois parâmetros ( rect e inputByteArray ), que são combinados para resultar em uma região retangular ( rect ) dos dados de pixel ( inputByteArray ).

Como os dados são lidos (e gravados) fora de inputByteArray , o método ByteArray.readUnsignedInt() é chamado para cada um dos pixels na matriz. Se, por alguma razão, inputByteArray não contiver pelo menos um retangular inteiro de dados de pixel, o método interromperá o processamento dos dados da imagem naquele ponto.

É importante lembrar que, para obter e configurar dados de pixel, a matriz de byte espera valores de pixel vermelho, verde, azul e alfa de 32 bits (ARGB).

O exemplo a seguir usa os métodos getPixels() e setPixels() para copiar um grupo de pixels de um objeto BitmapData para outro:

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;

Detecção de colisão de nível de pixel

O método BitmapData.hitTest() executa a detecção de colisão no nível de pixel entre os dados de bitmap e outro objeto ou ponto.

O método BitmapData.hitTest() aceita cinco parâmetros:

  • firstPoint (Point): Esse parâmetro se refere à posição do pixel do canto superior esquerdo do primeiro BitmapData no qual o teste de ocorrência está sendo executado.

  • firstAlphaThreshold (uint): Esse parâmetro especifica o valor de canal alfa mais alto que é considerado opaco para esse teste de ocorrência.

  • secondObject (Object): Esse parâmetro representa a área de impacto. O objeto secondObject não pode ser um objeto Rectangle, Point, Bitmap ou BitmapData. Esse objeto representa a área de ocorrência na qual a detecção de colisão está sendo executada.

  • secondBitmapDataPoint (Point): Esse parâmetro opcional é usado para definir uma localização de pixel no segundo objeto BitmapData. Use esse parâmetro apenas quando o valor de secondObject for um objeto BitmapData. O padrão é null .

  • secondAlphaThreshold (uint): Esse parâmetro opcional representa o valor de canal alfa mais alto que é considerado opaco no segundo objeto BitmapData. O valor padrão é 1. Use esse parâmetro apenas quando o valor de secondObject for um objeto BitmapData e quando ambos os objetos BitmapData forem transparentes.

Ao executar a detecção de colisão em imagens opacas, lembre-se de que o ActionScript trata a imagem como se ela fosse um retângulo totalmente opaco (ou caixa delimitadora). Como alternativa, ao executar teste de ocorrência em nível de pixel em imagens transparentes, ambas as imagens devem ser transparentes. Além disso, o ActionScript usa os parâmetros de limitação de alfa para determinar em qual ponto os pixels são alterados de transparente para opaco.

O exemplo a seguir cria três imagens de bitmap e verifica se há colisão de pixel utilizando dois diferentes pontos de colisão (um retorna false e outro true):

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Point; 
 
var bmd1:BitmapData = new BitmapData(100, 100, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(20, 20, false, 0x00FF3300); 
 
var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
 
// Create a red square. 
var redSquare1:Bitmap = new Bitmap(bmd2); 
this.addChild(redSquare1); 
redSquare1.x = 0; 
 
// Create a second red square. 
var redSquare2:Bitmap = new Bitmap(bmd2); 
this.addChild(redSquare2); 
redSquare2.x = 150; 
redSquare2.y = 150; 
 
// Define the point at the top-left corner of the bitmap. 
var pt1:Point = new Point(0, 0); 
// Define the point at the center of redSquare1. 
var pt2:Point = new Point(20, 20); 
// Define the point at the center of redSquare2. 
var pt3:Point = new Point(160, 160); 
 
trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true 
trace(bmd1.hitTest(pt1, 0xFF, pt3)); // false