2009-11-16 2 views
1

Je charge un fichier swf dans mon application principale en utilisant URLLoader, je veux obtenir la couleur d'arrière-plan du fichier swf chargé. (J'ai entendu dire qu'une solution serait de lire le code d'octet du swf chargé)Comment puis-je obtenir la couleur d'arrière-plan d'un fichier swf chargé?

+0

Êtes-vous le charger par '' URLLoader' ou Loader'? Je ne sais pas comment le faire de toute façon - en attendant une réponse. – Amarghosh

Répondre

5

Oui, vous devez regarder dans les données swf binaires. Here est une brève description du format swf. Et this est un petit détail sur les différents types de tags. Votre exigence est de trouver la balise SetBackgroundColor (tag type = 9), qui est généralement la première ou la deuxième balise du swf.
Les octets dans le fichier swf suivent peu l'ordre endian, donc vous devez faire attention en lisant les données. Et surtout ils seront compressés (les trois premiers octets seront "CWS") donc à partir de 9 octets (y compris le 9ème), toutes les données doivent être décompressées (ByteArray.decompress) avant le traitement.
code SomeExample :)

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.utils.*; 
    public class Test1 extends Sprite{ 
    private var stream:URLStream; 
    public function Test1():void { 
     stream = new URLStream(); 
     stream.load(new URLRequest("some.swf")); 
     stream.addEventListener(Event.COMPLETE, onComplete); 
    } 
    private function onComplete(e:Event):void { 
     var bytes:ByteArray = new ByteArray(); 
     bytes.endian = Endian.LITTLE_ENDIAN; 
     stream.readBytes(bytes, 0, 8); 
     var sig:String = bytes.readUTFBytes(3); 
     trace("SIG = " + sig); 
     trace("ver = " + bytes.readByte()); 
     trace("size = " + bytes.readUnsignedInt()); 
     var compBytes:ByteArray = new ByteArray(); 
     compBytes.endian = Endian.LITTLE_ENDIAN; 
     stream.readBytes(compBytes); 
     if (sig == "CWS") { 
     compBytes.uncompress(); 
     } 
     var fbyte = compBytes.readUnsignedByte(); 
     var rect_bitlength = fbyte >> 3; 
     var total_bits = rect_bitlength * 4; 
     var next_bytes = Math.ceil((total_bits - 3)/ 8); 
     for(var i=0; i<next_bytes; i++) { 
     compBytes.readUnsignedByte(); 
     } 
     trace("frameRate = " + compBytes.readUnsignedShort()); 
     trace("frameCount = " + compBytes.readUnsignedShort());

while(true) { 
    var tagcodelen:Number = compBytes.readUnsignedShort(); 
    var tagcode:Number = tagcodelen >> 6; 
    var taglen:Number = tagcodelen & 0x3F; 
    trace("tag code = " + tagcode + "\tlen = " + taglen); 
    if (taglen >=63) { 
     taglen = compBytes.readUnsignedInt(); 
    } 
    if(tagcode == 9) { 
     trace("found background color"); 
     trace("color is: RED=" + compBytes.readUnsignedByte() +", GREEN = " + compBytes.readUnsignedByte() + ", BLUE = " + compBytes.readUnsignedByte()); 
     break; 
    } 
    compBytes.readBytes(new ByteArray(), 0, taglen); 
    //break; 
    } 
} 

}}

+0

Réponse impecable et exemple! Je vous remercie. – Radu

-2

Votre fichier SWF doit le transmettre à une page Web avec JS.

getURL ("javascript: setColour (" + DESIRED COLOR + ")");

La fonction "setColour" doit bien sûr faire ce que vous voulez qu'elle fasse.

+0

OP veut obtenir la couleur, pas le définir. Même si la question était de définir la couleur, comment le feriez-vous via javascript? Le fichier SWF est chargé sur un autre fichier SWF, pas directement sur une page Web. – Amarghosh

Questions connexes