2011-04-04 121 views
0

我試圖從網絡攝像機拍攝圖像並將其存儲爲位圖。 我發現閃光燈不支持MJPEG,所以我發現有人寫過的課程可以與相機對話並在屏幕上輸出。然後我編輯它,以便我可以隨時請求當前圖像並將其存儲在ByteArray中。 我已經設法加載一個加載器類的ByteArray並將其放置在舞臺上,但我不知道如何將它保存爲位圖? 感謝拍攝裝載機的快照

編輯:對不起,是清楚,我想裏面存放它FLA,這樣我就可以操縱它

回答

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

我是在第一次遇到麻煩,因爲我不知道該加載程序未分派complete事件,但的LoaderInfo。

感謝大家的幫助。

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

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訪問二進制數據將在您保存時爲您提供損壞的數據。這是因爲閃存虛擬機實際上會稍微修改二進制數據以在加載器對象內以圖形方式顯示它。如果你想加載和顯示你的圖像+能夠保存它,你需要使用普通的URLLoader對象加載原始的二進制數據,並將URLLoader.data的內容作爲字節數組來轉換,然後使用Loader.loadBytes(bytes,LoaderContext ),同時將提供給第二個參數的LoaderContext對象中的allowLoadBytesCodeExecution設置爲TRUE(僅當您從字節數組中加載swf時)。希望這可以幫助。