AIRを使うと、flash.filesystemやflash.desktopなどのデスクトップアプリ用のクラス群が使えるようになるので、やってみた。
Air beta3で開発する環境を作って、前からやってみたかった
- 半透明で変な形をしたウィンドウ
- USBカメラで撮影してJPEGにエンコードしてファイル出力
-
を作った。
撮影した写真はプログラムと同じフォルダに保存される。
できたもの => CameraSaveJpeg.air (Adobe AIR beta3)、Archive
なお、半透明ウィンドウにするとスクリーンショットに写らなくなるので、デジカメで撮った。
■開発環境を整える
・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で書くには、ドキュメントクラス名を指定してやればいい
・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;
}
}
}