Metodi getPixel - setPixel della classe BitmapData
This is a discussion on Metodi getPixel - setPixel della classe BitmapData within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; I nomi di questi due metodi non danno spazio ad equivoci...
Sono semplicemente due metodi della classe BitmapData che ricevono ...
Metodi getPixel - setPixel della classe BitmapData
I nomi di questi due metodi non danno spazio ad equivoci...
Sono semplicemente due metodi della classe BitmapData che ricevono o impostano un determinato valore RGB.
Il metodo getPixel, vuole 2 parametri:
- la coordinata x del pixel di cui vogliamo recuperare il valore RGB
- la coordinata y del pixel di cui vogliamo recuperare il valore RGB
Il metodo setPixel, vuole 3 parametri:
- la coordinata x del pixel di cui vogliamo impostare il valore RGB
- la coordinata y del pixel di cui vogliamo impostare il valore RGB
- il valore RGB da utilizzare
Vediamo come funzionano...
Creo un FLA che salvo con nome ' scambio.fla ' al cui interno importo 2 immagini e le inserisco in 2 MovieClip a cui assegno nomi istanza' pic_0_mc ' e ' pic_1_mc ' .
Creo la Document Class, un file AS che salvo con nome ' Scambio.as ', implementata in questo modo:
Code:
package
{
import flash.display.MovieClip;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.Event;
public class Scambio extends MovieClip
{
private var clip:MovieClip;
private var immagine_1:BitmapData;
private var immagine_2:BitmapData;
private var copia:BitmapData;
private var bitmap:Bitmap;
private var startX:Number=0;
private var startY:Number=0;
private var startW:Number=0;
private var startH:Number=1;
public function Scambio()
{
init();
crea();
creaEffetto();
}
private function init():void
{
stage.frameRate=31;
}
private function crea():void
{
immagine_1=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xFF000000);
immagine_1.draw(pic_0_mc);
immagine_2=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xFF000000);
immagine_2.draw(pic_1_mc);
clip=new MovieClip();
copia=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xFFFFFFFF);
bitmap=new Bitmap(copia);
clip.addChild(bitmap);
clip.x=stage.stageWidth/2-clip.width/2;
clip.y=pic_0_mc.y+pic_0_mc.height+50;
addChild(clip);
}
private function creaEffetto():void
{
clip.addEventListener(Event.ENTER_FRAME,effetto1);
clip.addEventListener(Event.ENTER_FRAME,effetto2);
}
private function effetto1(e:Event):void
{
for(var i:Number=0;i < immagine_1.width;i++)
{
startX=i;
bitmap.bitmapData.setPixel(startX,startY,immagine_1.getPixel(startX,startY));
}
startY+=2;
if(startY>=immagine_1.height)
{
e.target.removeEventListener(Event.ENTER_FRAME,effetto1);
}
}
private function effetto2(e:Event):void
{
for(var i:Number=0;i < immagine_2.width;i++)
{
startW=i;
bitmap.bitmapData.setPixel(startW,startH,immagine_2.getPixel(startW,startH));
}
startH+=2;
if(startH>=immagine_2.height)
{
e.target.removeEventListener(Event.ENTER_FRAME,effetto2);
}
}
}
}
risultato:
Analizziamo il codice.
Proprietà:
un' istanza MovieClip dove inserirò la nuova immagine
private var clip:MovieClip;
tre istanze BitmapData
la prima scatterà una foto ( metodo draw() ) alla MovieClip pic_0_mc
la seconda scatterà una foto ( metodo draw() ) alla MovieClip pic_1_mc
la terza sarà la nuova BitmapData che andrò a creare
private var immagine_1:BitmapData;
private var immagine_2:BitmapData;
private var copia:BitmapData;
un' istanza Bimap, che serve per rendere visibile l' istanza BitmapData ( copia )
private var bitmap:Bitmap;
quattro variabili numeriche che serviranno far girare dei cicli
private var startX:Number=0;
private var startY:Number=0;
private var startW:Number=0;
private var startH:Number=1;
Metodi:
init();
imposto il frame rate
stage.frameRate=31;
crea();
creo le due nuove BitmapData ed uso il metodo draw() per scattare una foto alle rispettive MovieClip che ho sullo stage con le immagini all' interno
immagine_1=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xF F000000);
immagine_1.draw(pic_0_mc);
immagine_2=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xF F000000);
immagine_2.draw(pic_1_mc);
creo una nuova MovieClip
clip=new MovieClip();
creo la terza BitmapData ( mantenendo lo stesso colore dello sfondo del FLA )
copia=new BitmapData(pic_0_mc.width,pic_0_mc.height,true,0xF FFFFFFF);
creo una nuova Bitmap a cui passo la BitmapData ' copia '
bitmap=new Bitmap(copia);
inserisco la Bitmap nella MovieClip ' clip ' o non sarebbe visibile
clip.addChild(bitmap);
posiziono ' clip '
clip.x=stage.stageWidth/2-clip.width/2;
clip.y=pic_0_mc.y+pic_0_mc.height+50;
aggiungo al DisplayObject la MovieClip ' clip ' o non sarebbe visibile
addChild(clip);
creaEffetto();
aggiungo 2 listeners in ascolto dell' evento ENTER_FRAME che a loro volta chiamano due funzioni diverse ( effetto1 ed effetto2 )
clip.addEventListener(Event.ENTER_FRAME,effetto1);
clip.addEventListener(Event.ENTER_FRAME,effetto2);
effetto1();
creo un ciclo che parte da zero ed ha come iterazione massima il valore della larghezza di immagine_1, al cui interno
- imposto la variabile numerica startX uguale a i in modo che nell' arco del ciclo la ' i ' coprirà tutti i valori da zero fino alla massima larghezza di immagine_1
- dico alla BitmapData copia ( che adesso è una proprietà di ' bitmap ' di utilizzare il metodo setPixel a cui passo i valori:
startX che corre sulla larghezza di immagine_1, startY che è sempre a zero ( e con questi due valori dico a Flash le coordinate del pixel su cui voglio agire )
poi come terzo parametro il metodo setPixel vuole un valore RGB che recupero utilizzando getPixel su immagine_1 chea sua volta vuole 2 parametri, startX e startY, le stesse coordinate dello stesso pixel
for(var i:Number=0;i < immagine_1.width;i++)
{
startX=i;
bitmap.bitmapData.setPixel(startX,startY,immagine_ 1.getPixel(startX,startY));
}
incremento startY di 2 in modo da saltare una riga ( in quanto nelle righe pari metterò i pixels di immagine _2 )
startY+=2;
controllo se startY raggiunge il valore dell' altezza di immagine_1, se si fermo l' intervallo
if(startY>=immagine_1.height)
{
e.target.removeEventListener(Event.ENTER_FRAME,eff etto1);
}
effetto2();
stessa cosa di effetto1(), solo che recupero i valori da immagine_2 .