AS3でWebカメラの映像をJPEGで保存
Webカメラ楽しいー!とかって5年遅れぐらいですかね。
デモ
※白黒画像ですがカメラを許可して画面をクリックすると画像が保存されます。
動作サンプルはこちら
成果物
ステージをクリックするとWebカメラに表示されている内容が白黒でサーバ上に保存されます。
パーマリンクとかつけてあげると普通に便利なサイトが出来上がりそうです。

コード
-
package
-
{
-
import flash.display.Bitmap;
-
import flash.display.BitmapData;
-
import flash.display.Sprite;
-
import flash.events.Event;
-
import flash.events.EventDispatcher;
-
import flash.events.MouseEvent;
-
import flash.geom.Point;
-
import flash.geom.Rectangle;
-
import flash.media.Camera;
-
import flash.media.Video;
-
import flash.net.*;
-
import flash.text.TextField;
-
import flash.utils.ByteArray;
-
-
import com.adobe.images.JPGEncoder;
-
-
public class Main extends flash.display.Sprite
-
{
-
private var camera_width:int = 200;
-
private var camera_height:int = 150;
-
private var video:Video = new Video(camera_width, camera_height);
-
private var tfView:TextField;
-
-
private var urlRequest:URLRequest;
-
private var urlLoader:URLLoader;
-
private var fileReceiver:String = "http://www.jamboree.jp/tmp/cam2jpeg/receive.php";
-
-
public function Main():void
-
{
-
-
tfView = addTextField(220, 0, 200, 150);
-
tfView.appendText("start\n");
-
var camera:Camera = Camera.getCamera();
-
if (camera == null) {
-
//error
-
tfView.appendText("cant get camera!\n");
-
return;
-
}
-
video.attachCamera(camera);
-
addChild(video);
-
video.x = 0;
-
video.y = 0;
-
stage.addEventListener(MouseEvent.CLICK, onClick);
-
}
-
-
private function onClick(event:MouseEvent):void {
-
tfView.appendText("click!\n");
-
var s:BitmapData = new BitmapData(camera_width, camera_height)
-
s.draw(video);
-
-
var d:BitmapData = new BitmapData(camera_width, camera_height)
-
-
var r:Rectangle = new Rectangle(0, 0, camera_width, camera_height);
-
d.fillRect(r, 0xFFFFFFFF);
-
-
d.threshold(s, r, new Point(0, 0), "<=", 90, 0xFF000000, 255, false);
-
-
var img:Bitmap = new Bitmap(d);
-
addChild(img);
-
img.x = 0;
-
img.y = 160;
-
-
//送信
-
var jpgEncoder:JPGEncoder = new JPGEncoder(80);
-
var byteArr:ByteArray = jpgEncoder.encode(d);
-
urlRequest = new URLRequest(fileReceiver);
-
urlLoader = new URLLoader();
-
urlRequest.contentType = "application/octet-stream";
-
urlRequest.method = URLRequestMethod.POST;
-
urlRequest.data = byteArr;
-
urlLoader.load(urlRequest);
-
urlLoader.addEventListener(Event.COMPLETE,onUpload);
-
}
-
-
private function onUpload(event:Event):void {
-
tfView.appendText("uploaded!\n");
-
}
-
-
private function addTextField(x:Number, y:Number, w:Number, h:Number):TextField {
-
var textField:TextField;
-
textField = new TextField();
-
addChild(textField);
-
textField.x = x;
-
textField.y = y;
-
textField.width = w;
-
textField.height = h;
-
textField.text ="";
-
textField.selectable=true;
-
textField.border =true;
-
-
return textField;
-
}
-
}
-
}
receive.php
解説
as3corelibのJPGEncoderクラスというのをBitmapからJpegへの変換に使用しているのでhttp://code.google.com/p/as3corelib/source/checkoutからチェックアウトして下図の様に配置しておいてください。

まとめ
勉強会とかもみんなWebCamでバシバシとったら面白いんじゃないかと思った。いまどきは動画もいけるんだけどやっぱ写真の面白さはまた別にありますよね。

