+ Reply to Thread
Results 1 to 7 of 7

setPixel32 mi da problemi nel settare pixel neri in trasparenza

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 ...

  1. #1
    tia
    tia is offline
    Junior Member Settled In tia is on a distinguished road
    Join Date
    Jan 1970
    Posts
    25
    Rep Power
    0

    Question setPixel32 mi da problemi nel settare pixel neri in trasparenza

    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..

  2. #2
    Administrator Living At The FlepStudio! Flep is on a distinguished road
    Join Date
    Jul 2007
    Posts
    5,762
    Rep Power
    11
    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 :)

  3. #3
    Administrator Living At The FlepStudio! Flep is on a distinguished road
    Join Date
    Jul 2007
    Posts
    5,762
    Rep Power
    11
    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:

    Code:
    perc_alfa=(i*200)/loader.height;
    alfa='0x'+perc_alfa.toString(16);
    il risultato è questo:

    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);
    Adesso è pulito ;)

  4. #4
    tia
    tia is offline
    Junior Member Settled In tia is on a distinguished road
    Join Date
    Jan 1970
    Posts
    25
    Rep Power
    0
    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...:(

  5. #5
    Administrator Living At The FlepStudio! Flep is on a distinguished road
    Join Date
    Jul 2007
    Posts
    5,762
    Rep Power
    11
    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 :)

  6. #6
    tia
    tia is offline
    Junior Member Settled In tia is on a distinguished road
    Join Date
    Jan 1970
    Posts
    25
    Rep Power
    0
    ...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

  7. #7
    Administrator Living At The FlepStudio! Flep is on a distinguished road
    Join Date
    Jul 2007
    Posts
    5,762
    Rep Power
    11
    Perfetto tia grazie :)

    Forse bisognerebbe provare a dividere i colori bit a bit bOh

+ Reply to Thread

Similar Threads

  1. Usare Pixel Bender con Flash CS4
    By Flep in forum CS4 Articoli e tutorials
    Replies: 1
    Last Post: 02-11-10, 22:39
  2. Dimensioni reali del filmato (pixel)
    By alex.75 in forum Actionscript 3.0 avanzato
    Replies: 2
    Last Post: 22-05-10, 11:47
  3. Settare i font nel DataGrid AIUTOOOOO!!!!
    By ciro1919 in forum Actionscript 3.0 avanzato
    Replies: 0
    Last Post: 07-07-09, 08:00
  4. Settare gli stili del testo in Actionscript
    By Mavb52 in forum Flash Italiano
    Replies: 1
    Last Post: 02-07-09, 21:28
  5. Using Pixel Bender with Flash CS4
    By Flep in forum Flash CS4 Tutorials
    Replies: 0
    Last Post: 19-03-09, 16:50

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts