拍摄装载机的快照

问题描述:

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

编辑:对不起,是清楚,我想里面存放它FLA,这样我就可以操纵它

感谢所有的回应,但这些似乎都没有为我想要做的事情工作,但我不能说这不是我的缺乏经验。这是对我工作:

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); 
} 

我是在第一次遇到麻烦,因为我不知道该加载程序未分派complete事件,但的LoaderInfo。

感谢大家的帮助。

如果您的应用程序在线,您将需要一个服务器端脚本来创建和保存携带图片。

基本上代码可能如下:

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; 
} 
+0

对不起,我不是很清楚,我现在不需要输出它,我想将它存储到FLA作为位图,以便我可以继续操作它 – 2011-04-04 11:16:13

+0

看看编辑的答案 – goliatone 2011-04-04 12:59:24

+0

是啊,只是'Bitmap.draw()'它。如果您想稍后保存它,请使用'FileReference.save()'与as3corelib中的'JPEGEncoder'或'PNGEncoder'类:https://github.com/mikechambers/as3corelib – divillysausages 2011-04-04 13:18:12

通过“把它存储在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访问二进制数据将在您保存时为您提供损坏的数据。这是因为闪存虚拟机实际上会稍微修改二进制数据以在加载器对象内以图形方式显示它。如果你想加载和显示你的图像+能够保存它,你需要使用普通的URLLoader对象加载原始的二进制数据,并将URLLoader.data的内容作为字节数组来转换,然后使用Loader.loadBytes(bytes,LoaderContext ),同时将提供给第二个参数的LoaderContext对象中的allowLoadBytesCodeExecution设置为TRUE(仅当您从字节数组中加载swf时)。希望这可以帮助。