Flash 拍摄加载程序的快照

Flash 拍摄加载程序的快照,flash,actionscript-3,flash-cs5,Flash,Actionscript 3,Flash Cs5,我正在尝试从网络摄像头中获取图像并将其存储为位图。 我发现flash不支持MJPEG,所以我找到了一个有人编写的类,可以与相机对话并在屏幕上输出。然后我编辑了它,这样我可以随时请求当前图像并将其存储在ByteArray中。 我已经用一个loader类加载了ByteArray,并将其放在舞台上,但我不知道如何将其保存为位图? 谢谢 编辑:很抱歉澄清,我想将其存储到FLA中,以便我可以继续操作它如果您的应用程序处于联机状态,您将需要服务器端脚本来创建和保存图像 基本上,代码可以如下所示: var r

我正在尝试从网络摄像头中获取图像并将其存储为位图。 我发现flash不支持MJPEG,所以我找到了一个有人编写的类,可以与相机对话并在屏幕上输出。然后我编辑了它,这样我可以随时请求当前图像并将其存储在ByteArray中。 我已经用一个loader类加载了ByteArray,并将其放在舞台上,但我不知道如何将其保存为位图? 谢谢


编辑:很抱歉澄清,我想将其存储到FLA中,以便我可以继续操作它

如果您的应用程序处于联机状态,您将需要服务器端脚本来创建和保存图像

基本上,代码可以如下所示:

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 );
您可以选择阅读此项以获取更多信息:

[编辑] 捕获位图数据:

//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;
}
通过“将其存储在FLA中”,如果您的意思是要从加载程序中提取位图图像,以便访问位图数据等,那么我们开始:

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
   }       
}
此处有非常重要的信息:


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

感谢所有的回复,但这些似乎都不适用于我正在尝试的工作,但我不能说这不是因为我缺乏经验。这就是我的工作原理:

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);
}
一开始我遇到了麻烦,因为我没有意识到加载器没有发送完整的事件,而是发送了加载器信息


谢谢大家的帮助。

对不起,我不是很清楚,我现在不需要输出它,我想把它作为位图存储在FLA中,这样我就可以继续操作它了是的,只需
bitmap.draw()
it。如果您想稍后保存它,请使用as3corelib中的
JPEGEncoder
PNGEncoder
类使用
FileReference.save()
:只是想让你们知道,我目前远离相机,无法进行测试,一旦我对它进行排序,我将用有效的方法回复。谢谢你的回答