package { import flash.display.*; import flash.media.Video; import flash.media.Camera; import flash.events.*; import flash.filters.ColorMatrixFilter; import flash.geom.Rectangle; import flash.geom.Matrix; import flash.text.*; import flash.utils.ByteArray; import flash.net.*; import com.adobe.images.JPGEncoder; public class PosterGenerator extends Sprite { private var _cam:Camera; private var _video:Video; private var _buttonReset:SimpleButton; private var _buttonDl:SimpleButton; [Embed(source='ButtonReset.swf')] private var ButtonReset:Class; [Embed(source='ButtonResetOver.swf')] private var ButtonResetOver:Class; [Embed(source='ButtonDl.swf')] private var ButtonDl:Class; [Embed(source='ButtonDlOver.swf')] private var ButtonDlOver:Class; private var _title:Sprite; private var _textField:TextField; private var _format:TextFormat; private var _bitmapData:BitmapData; private var _bitmap:Bitmap; private var _camWidth:int = 240; private var _camHeight:int = 320; private var _camFps:int = 15; private var _encoder:JPGEncoder; private var _bytesArray:ByteArray; private var _serverPath:String="http://connect2.jp/postr/"; private var _phpPath:String=_serverPath+"save_jpg.php"; private var _imageDir:String = _serverPath+"postimg/"; private var _fileName:String; private var _imagePath:String; private var _fileReference:FileReference; private var _urlVariables:URLVariables; //微妙かも? private var _upRequest:URLRequest; private var _upLoader:URLLoader; private var _downRequest:URLRequest; private var _delRequest:URLRequest; private var _delLoader:URLLoader; //グレースケールとコントラスト調整 private var _matrix:Array = [0.38575,0.76175,0.1025,0,-15.875,0.38575,0.76175,0.1025,0,-15.875,0.38575,0.76175,0.1025,0,-15.875,0,0,0,1,0]; public function PosterGenerator() { initStage(); _cam = Camera.getCamera(); if ( _cam != null){ _cam.setMode(_camWidth*2,_camHeight*2,_camFps); _cam.setMotionLevel(40,1500); _cam.addEventListener(ActivityEvent.ACTIVITY, activityHandler); _video = new Video(_camWidth,_camHeight); _video.attachCamera(_cam); _video.filters = [ new ColorMatrixFilter(_matrix)]; addChild(_video); } //title setTitleArea(); setResetButton(); setDlButton(); } private function activityHandler(event:ActivityEvent):void{ if(!event.activating){ _bitmapData = new BitmapData(_camWidth,_camHeight); _bitmapData.draw(_video); _bitmap = new Bitmap(_bitmapData); setButtons(); } } private function resetHandler(event:MouseEvent):void{ unsetButtons(); } private function submitHandler(event:MouseEvent):void{ _textField.type = TextFieldType.DYNAMIC; _bitmapData.draw(_title); _bitmapData.draw(_textField,new Matrix(1,0,0,1,10,265),null,null,null,true); //JPEG encode _encoder = new JPGEncoder(70); _bytesArray = new ByteArray; _bytesArray = _encoder.encode(_bitmapData); //loader _upRequest = new URLRequest(_phpPath); _upLoader = new URLLoader(); _upRequest.contentType = "application/octet-stream"; _upRequest.method = URLRequestMethod.POST; _upRequest.data = _bytesArray; _upLoader.load(_upRequest); _upLoader.addEventListener(Event.COMPLETE,download); } //ダウンロード private function download(event:Event):void{ _fileName = _upLoader.data; _imagePath = _imageDir + _fileName; _downRequest = new URLRequest(_imagePath); _fileReference = new FileReference; _fileReference.download(_downRequest,"poster.jpg"); _fileReference.addEventListener(Event.CANCEL,onCancelDownload); _fileReference.addEventListener(Event.COMPLETE,onCompleteDownload); } private function onCancelDownload(event:Event):void{ deleteTempImage(); unsetButtons(); } private function onCompleteDownload(event:Event):void{ deleteTempImage(); unsetButtons(); } //一時データの削除 private function deleteTempImage():void{ _urlVariables = new URLVariables(); _urlVariables.mode = "delTmpFile"; //trace("mode : "+_urlVariables.mode); _urlVariables.filename = _fileName; _delRequest = new URLRequest(_phpPath); _delRequest.data = _urlVariables; _delRequest.method = URLRequestMethod.POST; _delLoader = new URLLoader(); _delLoader.load(_delRequest); //debugに使ってた //_delLoader.addEventListener(Event.COMPLETE,onCompleteDelete); } private function initStage():void{ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.frameRate = 30; } private function setTitleArea():void{ _title = new Sprite; _title.graphics.beginFill(0xff5500); _title.graphics.drawRect(0,250,240,70); _title.graphics.endFill(); addChild(_title); _textField = new TextField; _textField.text = "TrainsXXtting"; _textField.type = TextFieldType.INPUT; _textField.textColor = 0xffffff; _textField.x = 10; _textField.y = 265; _textField.width = 220; _format = new TextFormat; _format.font = "Arial" _format.size = 28; _format.bold = true; _textField.setTextFormat(_format); addChild(_textField); } private function setResetButton():void{ _buttonReset = new SimpleButton; _buttonReset.upState = new ButtonReset; _buttonReset.overState = new ButtonResetOver; _buttonReset.downState = _buttonReset.overState; _buttonReset.hitTestState = _buttonReset.upState; _buttonReset.x = 80; _buttonReset.y = 120; _buttonReset.addEventListener(MouseEvent.CLICK, resetHandler); } private function setDlButton():void{ _buttonDl = new SimpleButton; _buttonDl.upState = new ButtonDl; _buttonDl.overState = new ButtonDlOver; _buttonDl.downState = _buttonDl.overState; _buttonDl.hitTestState = _buttonDl.upState; _buttonDl.x = 80; _buttonDl.y = 160; _buttonDl.addEventListener(MouseEvent.CLICK, submitHandler); } private function setButtons():void{ addChildAt(_bitmap,1); addChild(_buttonReset); addChild(_buttonDl); _cam.removeEventListener(ActivityEvent.ACTIVITY, activityHandler); } private function unsetButtons():void{ removeChild(_bitmap); removeChild(_buttonReset); removeChild(_buttonDl); _cam.addEventListener(ActivityEvent.ACTIVITY, activityHandler); } //debug用かな private function onCompleteDelete(event:Event):void{ var field:TextField = new TextField; field.text = _delLoader.data; addChild(field); } } }