ActionScript-C#間でデータのやり取りをおこなってみた 前編

chakemiです。先日購入したMacBook airですが、無線LAN部分に若干バグではないかと思う 挙動があり気になってますが、BootCampも無事、設定出来、これからシャレオツな毎日の予感がしておりますw

本日は、前回の続きで、ActionScript-C#間でデータのやり取りをおこなってみたいと思います。 というか、元々コレを検証したくて「Shockwave Flash Object」を触ってみたのですが。。。

ActionScriptには、ExternalInterfaceクラスというものがあり ActionScript と Flash Player のコンテナとの間で直接通信できるようにするアプリケーションプログラミングインターフェイスが用意されてます。 2.0と3.0で一部違いがあるようですが、3.0しか触ったことがないのでよくわかりません。。。

実際、どんなデータをやり取りさせようかと考えたとき、単純にテキストデータではつまらないと 思ったのでC#からFlashでアタッチしたUSBカメラの画像データを取得しようと思います。

なので、データのやり取りと書きましたが単一方向の呼び出しになります。

開発環境

  • WindowsXP SP3
  • FlashDevelop3
  • VisualStudio2008
  • Flashplayer 10.3.185.5

まずFlash側の全体のコードからですが

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package
{
     import flash.display.Sprite;
     import flash.media.Camera;
     import flash.media.Video;
     import flash.display.BitmapData;
     import flash.external.ExternalInterface;



     [SWF(backgroundColor=0xFFFFFF, width="320", height="240")]
     public class  Cam extends Sprite
     {
          private var camera:Camera;
          private var video:Video;
          private var bmd:BitmapData;


          function Cam()
          {
               camera = Camera.getCamera();

               if (camera != null)
               {
                    camera.setMode(320, 240, 30);
                    video = new Video(camera.width, camera.height);
                    video.attachCamera(camera);
                    bmd = new BitmapData(camera.width, camera.height, false, 0000);

                    addChild(video);
                    video.x = 0;
                    video.y = 0;
               }

               ExternalInterface.addCallback("capture", capture);
          }

          private function capture (x:int, y:int):uint
          {
               bmd.draw(video);

               var pixelData:uint = bmd.getPixel(x, y);

               return pixelData;
          }

     }

}

以前にもメモったカメラを扱うコードに外部API部分を盛っていきます。

1
ExternalInterface.addCallback("capture", capture);

addCallbackメソッドの説明

  • 第一引数:外部からActionScript関数を参照する際に使用する名前
  • 第二引数:呼び出されるActionScriptメソッド

次に、C#側から呼び出す関数を実装します。

FlashでアタッチしたUSBカメラデバイスの画像をビットマップに描画し、 C#で指定した座標のカラー情報を返すような関数を作成してみました。

1
2
3
4
5
6
7
8
private function capture (x:int, y:int):uint
{
     bmd.draw(video);

     var pixelData:uint = bmd.getPixel(x, y);

     return pixelData;
}

当初は、getPixels()メソッドを使ってバイト配列で取得しようとしておりましたが、 色々ツボにハマって、画像のカラー情報を取り出す形で良しとしてしまいました。

次回はツボにハマった部分と、実際にC#からcapture関数を呼び出して画像をとりだすとこまで書きたいと思います。

Comments