AIRを使うと、flash.filesystemやflash.desktopなどのデスクトップアプリ用のクラス群が使えるようになるので、やってみた。

Air beta3で開発する環境を作って、前からやってみたかった

  • 半透明で変な形をしたウィンドウ
  • USBカメラで撮影してJPEGにエンコードしてファイル出力
    • を作った。

      撮影した写真はプログラムと同じフォルダに保存される。

      できたもの => CameraSaveJpeg.air (Adobe AIR beta3)Archive

      Air app

      なお、半透明ウィンドウにするとスクリーンショットに写らなくなるので、デジカメで撮った。

      ■開発環境を整える

      Adobe Labs – Downloads: Adobe AIR

      AIRの実行環境

      AIR:Flash CS3 Professional Update – Adobe Labs

      Japaneseを選んでインストール

      Jinten Blog Blog Archive FlashDevelop Beta5

      FlashDevelp3.0 Beta5で、AIRとmx系クラスのコード補完を有効にする方法

      [Project]→[Properties]→[Compiler Options]→[Intrinsic Libraries]に

      Library\AS3\frameworks\Flex3

      Library\AS3\frameworks\AIR

      を追加する

      で、普通にFlashDevelopでFlash IDE用のプロジェクトを作成。

      さらにFlashCS3からもAIRプロジェクトを作成。FlashDevelopと同じフォルダを指定する。

      Flex3.0のコンパイラはとりあえず必要ない。

      ■証明書を作る

      AIR Beta2でWEBCAMの画像をjpgに保存するサンプル – hatayanlog

      が詳しい。AIR Beta2から証明書を作らないとならなくなった。



      ■プログラム書く

      普通にAS3書いてflaからリンクさせてコンパイルする。

      JPEG圧縮はas3corelib – Google Codeを使った。

      memo 006 Adobe AIR Beta2でデスクトップアプリケーションを作ってみる – やっぱギークでナイト!

      FlashCS3上でAIRプロジェクトを作って、新しいNativeWindowを開いたり閉じたりする。

      コードだけFlashDevelopで書くには、ドキュメントクラス名を指定してやればいい

      document class

      Adobe Edge: 2007年9月 Flash CS3 でゼロからはじめよう AIRアプリケーション作成講座 Vol.1

      NativeWindowを変な形のウィンドウにする方法

      AIR Beta2でWEBCAMの画像をjpgに保存するサンプル – hatayanlog

      カメラで撮影、MovieClip→BitmapData→JPEGEncoder→ByteArray→FileStreamで保存

      あと、beta2から3でまた変わったのか、Fileまわりは

      var file:File = new File();

      var now:Date = new Date();

      file.nativePath = File.applicationDirectory.nativePath + File.separator + now.time + “.jpg”;

      これでアプリケーションと同じディレクトリに保存できた。

      ■ソースコード

      CameraSaveJpeg.as


      /**
      * Capture Image by USB-Camera then Save it as JPEG file.

      * @author Sho Hashimoto
      * @version 1.1
      * http://shokai.org
      * FlashCS3 + AIR beta3
      * 2008/01/12
      */
      package {
          import fl.controls.*;
          import flash.display.*;
          import flash.filesystem.*;
          import flash.media.*;
          import flash.events.*;
          import flash.utils.*;
          import com.adobe.images.JPGEncoder;
          public class CameraSaveJpeg extends MovieClip{
              var cam:Camera;
              var video:Video;
              var _buttonShot:Button;
              var _textAreaLog:TextArea;
              var _buttonClose:Button;
              var _bg:MovieClip;
              
              public function CameraSaveJpeg() {
                  
                  stage.scaleMode = StageScaleMode.EXACT_FIT; // 伸縮する
                  // stage.scaleMode = StageScaleMode.NO_SCALE; // 伸縮しない
                  stage.align = StageAlign.TOP_LEFT; // 左上から
                  
                  link_ide_obj() // IDEが生成したオブジェクトを関連づけ
                  
                  cam = Camera.getCamera();
                  cam.setMode(800,600,24,true);// 24FPS
                  cam.setQuality(0, 100);
                  video = new Video(cam.width, cam.height);
                  video.attachCamera(cam);
                  this.addChild(video);
                  video.width = 200;
                  video.height = 150;
                  
                  _bg.alpha = 0.5;
                  
                  _buttonShot.addEventListener(MouseEvent.CLICK, savePicture);
                  _buttonClose.addEventListener(MouseEvent.CLICK, window_onClose);
                  _bg.addEventListener(MouseEvent.MOUSE_DOWN, window_onMove);
              }
              
              /* IDEが生成したオブジェクトを関連づけ */
              public function link_ide_obj() {
                  this._buttonShot = buttonShot;
                  this._textAreaLog = textAreaLog;
                  this._bg = bg;
                  this._buttonClose = buttonClose;
              }
              
              /* 現在の表示をファイルに保存 */
              public function savePicture(e:Event) {
                  _buttonShot.enabled = false;
                  var bmd:BitmapData = new BitmapData(cam.width, cam.height);
                  bmd.draw(video);
                  var encoder:JPGEncoder = new JPGEncoder(95);
                  try{
                      var bytes:ByteArray = encoder.encode(bmd);
                      var file:File = new File();
                      var now:Date = new Date();
                      file.nativePath = File.applicationDirectory.nativePath + File.separator + now.time + ".jpg";
                      var fs:FileStream = new FileStream();
                      fs.open(file, FileMode.UPDATE);
                      fs.writeBytes(bytes, 0, bytes.length);
                      fs.close();
                      trace("saved! => " + file.nativePath);
                  }
                  catch (e:Error) {
                      trace(e.message);
                  }
                  _buttonShot.enabled = true;
              }
              
              public function window_onClose(e:Event) {
                  stage.nativeWindow.close();
              }
              
              public function window_onMove(e:Event) {
                  stage.nativeWindow.startMove();
              }
              
              
              public function trace(message:String) {
                  _textAreaLog.text = message + "¥n" + _textAreaLog.text;
              }
          }
      }