Как я могу получить цвет фона загруженного SWF-файла? - PullRequest
1 голос
/ 16 ноября 2009

Я загружаю SWF-файл в основное приложение с помощью URLLoader, я хочу получить цвет фона загруженного SWF-файла. (Я слышал, что одним из решений будет чтение байтового кода загруженного SWF)

Ответы [ 2 ]

5 голосов
/ 16 ноября 2009

Да, вам нужно просмотреть двоичные данные SWF. Здесь - краткое описание формата swf. И это - маленькая деталь о различного рода тегах. Вам необходимо выяснить тег SetBackgroundColor (тип тега = 9), который обычно является первым или вторым тегом swf.
Байты в файле swf следуют в порядке следования байтов, поэтому вам следует соблюдать осторожность при чтении данных. И в основном они будут сжаты (первые три байта будут «CWS»), поэтому начиная с 9-го байта и далее (включая 9-й), все данные должны быть распакованы (ByteArray.decompress) перед обработкой.
SomeExample code :)

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());</p>

<pre><code>  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 голосов
/ 16 ноября 2009

Ваш SWF-файл должен передавать его на веб-страницу с помощью JS.

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

Функция "setColour", конечно, должна делать то, что вы хотите.

...