Снимок загрузчика - PullRequest
       5

Снимок загрузчика

0 голосов
/ 04 апреля 2011

Я пытаюсь взять изображение с сетевой камеры и сохранить его как растровое изображение. Я обнаружил, что вспышка не поддерживает MJPEG, поэтому я нашел класс, который кто-то написал, который мог общаться с камерой и выводить на экран. Затем я отредактировал его, чтобы в любой момент запросить текущее изображение и сохранить его в ByteArray. Мне удалось загрузить этот ByteArray с классом загрузчика и поместить его на сцену, но я не уверен, как сохранить это как растровое изображение? Спасибо

Редактировать: Извините за ясность, я хочу сохранить это внутри FLA, чтобы я мог продолжать манипулировать им

Ответы [ 3 ]

0 голосов
/ 04 апреля 2011

Под "сохранить его в 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
   }       
}

ОЧЕНЬ ВАЖНАЯ ИНФОРМАЦИЯ ЗДЕСЬ:

Если вы хотите сохранить образ на диск или куда-либо еще после загрузки его с помощью объекта загрузчика, ОСТЕРЕГАЙТЕСЬ, что при доступе к двоичным данным через LoaderInfo (). Bytes вы получите ИСПРАВЛЕННЫЕ ДАННЫЕ, КОГДА ВЫ СОХРАНИТЕ. Это происходит потому, что флэш-виртуальная машина фактически немного изменяет двоичные данные, чтобы графически отображать их в объекте загрузчика. Если вы хотите загрузить и показать свое изображение + иметь возможность сохранить его, вам необходимо загрузить необработанные двоичные данные, используя простой объект URLLoader и приведя содержимое URLLoader.data в виде байтового массива, затем используйте Loader.loadBytes (bytes, LoaderContext). ), при установке allowLoadBytesCodeExecution внутри объекта LoaderContext, переданного второму аргументу в TRUE (только если вы загружаете SWF-файл из байтового массива). Надеюсь, это поможет.

0 голосов
/ 18 апреля 2011

Спасибо за все ответы, но ни один из них, похоже, не сработал для того, что я пытался сделать, я не могу сказать, что это не моя неопытность.Вот что сработало для меня:

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

Сначала у меня были проблемы, потому что я не осознавал, что загрузчик отправлял не полное событие, а информацию loader.

Спасибо запомогите всем.

0 голосов
/ 04 апреля 2011

Если ваше приложение подключено к сети, вам потребуется сценарий на стороне сервера для создания и сохранения изображения.

В основном код может быть следующим:

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

Вы можете проверить это, чтобы получить больше информации:

[EDIT] Захват растровых данных:

//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;
}
...