Ciao tia,
per cortesia, potresti riscrivere il codice all' interno dei tags [code] ?
Altrimenti quando lo si copia su Flash è tutto dritto e tradurlo è un bel da fare...
grazie :)
This is a discussion on setPixel32 mi da problemi nel settare pixel neri in trasparenza within the Actionscript 3.0 avanzato forums, part of the Flash Italiano category; Salve a tutti.. Come ho già scritto in qualche commento sugli articloi di flep, ultimamente mi ero dedicato alla creazione ...
Salve a tutti..
Come ho già scritto in qualche commento sugli articloi di flep, ultimamente mi ero dedicato alla creazione di un codice che mi potesse caricare un'immagine, farne una copia (clonarla), rifletterla e dargli una trasparenza graduale, un po' come gli effetti che usa il Mac per le immagini.
Prova che ti prova..alla fine..ci sono riuscito..(considerando che su as 3 non sono un esperto x me è un gran risultato)..
tutto contento ho voluo fare delle prove per constatare la solidità del codice..
ma alla fine ho scoperto la falla..
Di seguito è riportato il codice funzionante. Per poterlo usare copiatelo nel primo fotogramma. Per vedere meglio l'effetto mettete nel primo frame un'immagine a far da sfondo così che l'effetto trasparenza della immagine riflessa si possa notare al meglio. Inoltre per capire se questo effetto poteva essere usabile (cioè che non impoegnasse troppo la CPU) ho posto sullo stage una casella di testo "tbox" la quale mi restituiva il tempo impiegato per elaborare il ciclo che costruisce l'effetto.
CODICE:
import flash.display.BitmapData;
import flash.display.Loader;
import flash.filters.DisplacementMapFilter;
import flash.net.URLRequest;
import flash.utils.getTimer;
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image3.jpg");
loader.load(url);
var i:Number;
var k:Number;
var z:Number;
var perc_alfa:Number;
var t:uint;
var tf:uint;
var alfa:String;
var colore:String;
var col:uint;
function setupStage(event:Event):void {
var myBitmapData:BitmapData = new BitmapData(loader.width, loader.height);
myBitmapData.draw(loader.content);
var bmp:Bitmap = new Bitmap(myBitmapData);
this.addChild(bmp);
var imgclone:BitmapData =new BitmapData(loader.width, loader.height);
t=getTimer();
for (i=0; i<=loader.height+1; i++) {
for (k=0; k<=loader.width; k++) {
perc_alfa=Math.round(i/(loader.height/100));
if (perc_alfa==100) {
alfa="0xFF";
} else if (perc_alfa<10) {
alfa="0x0"+perc_alfa;
} else {
alfa="0x"+perc_alfa;
}
colore=alfa+(myBitmapData.getPixel(k,i).toString(1 6));
col=uint(colore);
imgclone.setPixel32(k, (loader.height-i+1), col);
}
}
tf=getTimer()-t;
tbox.text="copia immagine eseguita in "+(tf/1000)+" secondi";
var bitmapclone:Bitmap = new Bitmap(imgclone);
this.addChild(bitmapclone);
bitmapclone.y=bmp.y+bmp.height-2;
}
loader.contentLoaderInfo.addEventListener(Event.CO MPLETE, setupStage);
-----fine----
Questo codice così com'è funziona. Si possono notare nel ciclo primario e nel setPixel32 agginte di +1 al fine di evitare problemi di bordi ecc..
Ma se proviamo a caricare questa immagine (sostituendo qesta parte di codice):
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg");
Si può notare come i pixel molto scuri, non sono sicuro se solo quelli neri, prendono la massima trasparenza anche se non dovrebberi portando ad un risultato direi abbastanza brutto (cioè l'immagine con dei buchi)..Provate con altre immagini, magari anche in locale, dove la percentuale di nero sia considerevole e vedrete ancor meglio l'effetto.
Si potrebbe usare come rimedio un MovieClip con un quadratro che sfuma dal nero al trasparente da mettere sotto l'immagine. L'ho provato...il risultato è accettabile ma se si riuscisse a risolvere da codice sarebbe meglio.
Ho cercato su internet e non sono l'unico che ha riscontrato tale problema il fatto è che tutti i codici erano per as2 e le risposte vage, lunghe e tutte in inglese..
Grazie mille in anticipo..
Ciao tia,
per cortesia, potresti riscrivere il codice all' interno dei tags [code] ?
Altrimenti quando lo si copia su Flash è tutto dritto e tradurlo è un bel da fare...
grazie :)
Dunque,
a quanto pare ho risolto :)
Il problema è nelle logiche condizioni che applichi a perc_alfa.
Lasciala scorrere in base al valore della i, in questo modo:
il risultato è questo:Code:perc_alfa=(i*200)/loader.height; alfa='0x'+perc_alfa.toString(16);
Adesso è pulito ;)Code:import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.filters.DisplacementMapFilter; import flash.net.URLRequest; import flash.utils.getTimer; import flash.events.*; import flash.text.TextField; var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image3.jpg"); loader.load(url); var i:Number; var k:Number; var z:Number; var perc_alfa:Number; var t:uint; var tf:uint; var alfa:String; var colore:String; var col:uint; function setupStage(event:Event):void { var myBitmapData:BitmapData = new BitmapData(loader.width, loader.height); myBitmapData.draw(loader.content); var bmp:Bitmap = new Bitmap(myBitmapData); this.addChild(bmp); var imgclone:BitmapData =new BitmapData(loader.width, loader.height); t=getTimer(); for (i=0; i<=loader.height+1; i++) { for (k=0; k<=loader.width; k++) { perc_alfa=(i*200)/loader.height; alfa='0x'+perc_alfa.toString(16); colore=alfa+(myBitmapData.getPixel(k,i).toString(16)); col=uint(colore); imgclone.setPixel32(k, (loader.height-i+1), col); } } tf=getTimer()-t; tbox.text="copia immagine eseguita in "+(tf/1000)+" secondi"; var bitmapclone:Bitmap = new Bitmap(imgclone); this.addChild(bitmapclone); bitmapclone.y=bmp.y+bmp.height-2; } loader.contentLoaderInfo.addEventListener(Event.COMPLETE,setupStage);
In'effetti così è molto meglio..grazie mille..ma il problema dei pixel neri che scompaiono rimane..
hai provato a caricare "http://www.helpexamples.com/flash/images/image1.jpg" ???
..
a me con questa foto una parte dei pixel della parte più scura in alto a destra non si vedeno lasciando un'area vuota all'interno dell'immagine con i bordi sgranati...:(
Eh si... hai ragione, il nero lo riporta bianco.
Sembra che un valore vada troppo alto.
Comunque, secondo me in questo caso ci vorrebbe un piccolo algoritmo per poterlo fare perfetto,proprio come un algoritmo che usano i photo editors come fireworks o photoshop.
Entriamo in un discorso troppo complesso, è da ingegnere con le cosìdette :)
...ahh ecco..pensavo fosse una di quelle cose che si risolvevano con una variabile in più e una funzione di quelle strane..
comunque...io continuo a provare..già dei miglioramenti li ho fatti facendo un test su che colore va a settare..appena ci riesce lo scrivo qui così da poter dare anche io un contributo..;D..ciaoooo
Perfetto tia grazie :)
Forse bisognerebbe provare a dividere i colori bit a bit bOh
Bookmarks