Adobe AIRの開発環境を整えて、カメラで撮影してJPEGで保存するソフトを作った

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;

        }

    }

}

タグ: , , , , ,

コメントをどうぞ