拍摄装载机的快照

时间:2011-04-04 10:47:41

标签: flash actionscript-3 flash-cs5

我正在尝试从联网相机拍摄图像并将其存储为位图。 我发现flash不支持MJPEG,所以我发现有人写过一个可以与摄像头对话并在屏幕上输出的课程。然后我编辑它,以便我可以随时请求当前图像并将其存储在ByteArray中。 我已经设法使用加载器类加载ByteArray并将其放在舞台上,但我不确定如何将其保存为位图? 感谢

编辑:很抱歉要清楚我想把它存放到FLA中,以便我可以继续操作它

3 个答案:

答案 0 :(得分:0)

如果您的应用在线,则需要服务器端脚本来创建和保存图像。

基本上代码可以如下:

var request:URLRequest = new URLRequest( mailLoc );
request.contentType = 'application/octet-stream';
request.method = URLRequestMethod.POST;
request.data = bArray;

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, MailCompleteHandler);
loader.addEventListener( IOErrorEvent.IO_ERROR, _onImageError );
try
{
    loader.load(request);
}
catch(error:Error)
{
    trace("Unable to load URL");
}


private function _onImageError(e:IOErrorEvent):void {
    trace("IOErrorEvent: ",e.type," : ",e.text) 
}

在服务器端,php代码:

//bindary data.
$image_bytes = $GLOBALS["HTTP_RAW_POST_DATA"];
//change to whatever works for you
$file_name = "testfile.jpg";
$file_path = "../uploads/$file_name";

$file = fopen( $file_path, 'w+' );

if ( !fwrite( $file, $image_bytes ) ) {
    return "Error writing to file: $file";
}

fclose( $file );

您可以查看阅读本文以获取更多信息:

[编辑] 捕获bitmapdata:

//loader should be your loader instance displaying your graphic.
var snapshot:BitmapData = capture(loader);
var result:Bitmap = new Bitmap( snapshoot );

public function capture( target:DisplayObject ):BitmapData {
    var rect:Object = target.getBounds( target );
    var width:Number = rect.width;
    var height:Number = rect.height;
    var bitmap:BitmapData = new BitmapData( width+1 , height+1, true, 0x00000000 );
    var matrix:Matrix = new Matrix();
    matrix.translate( -rect.x , -rect.y );
    bitmap.draw( target , matrix );
    return bitmap;
}

答案 1 :(得分:0)

通过“将其存储在FLA中”,如果您想要从Loader中提取该位图图像以便可以访问位图数据等,那么我们在这里:

var myLoader:Loader = new Loader();

myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
myLoader.load(new URLRequest("http://somewhere.com/picture.jpg"));

private function onLoaded(e:Event):void
{
   try{
      //We do this in a try/catch statement just in case we accidentally load a SWF and try to cast it as a bitmap or something of this nature.
      var myBitmap:Bitmap = LoaderInfo(e.currentTarget).content as Bitmap;
   }catch (e:Error){
      //Do something about the error
   }       
}

此处非常重要的信息:

如果要在使用加载程序对象加载图像后将图像保存到磁盘或其他任何位置,请注意,通过LoaderInfo()。bytes访问二进制数据将在您保存时为您提供已损坏的数据。这是因为Flash VM实际上稍微修改了二进制数据,以便在加载器对象中以图形方式显示它。如果要加载并显示图像+能够保存它,则需要使用普通的URLLoader对象加载原始二进制数据并将URLLoader.data的内容作为字节数组转换,然后使用Loader.loadBytes(bytes,LoaderContext) ),将提供给第二个参数的LoaderContext对象中的allowLoadBytesCodeExecution设置为TRUE(仅当您从bytearray加载swf时)。希望这会有所帮助。

答案 2 :(得分:0)

感谢所有的回复,但这些似乎都不适用于我想做的事情,我不能说这不是因为我的经验不足。这对我有用:

var ldr:Loader = new Loader;
ldr.loadBytes(snapshot);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

private function onComplete(e:Event):void {
    var loader:Loader = (e.target as LoaderInfo).loader;
trace(loader);
var bmp:Bitmap = Bitmap(loader.content);
addChild(bmp);
}

起初我遇到了麻烦,因为我没有意识到加载器没有发送完整的事件,而是发送了loaderinfo。

感谢大家的帮助。