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