![]() |
|
||||||||||
|
|||||
|
Насколько мне известно, в SharedObject можно хранить примитивные данные флеша: String, XML, Array, Boolean... и тд
Я уперся взглядом в слово String. Подумал про ByteArray. Подумал про Bitmap. И мне стало казаться реальным сохранить изображение на стороне пользователя =) (ну с учетом того, что тот предоставит пространстыво) Что я сделал: package{ import flash.net.*; import flash.display.*; import flash.events.*; import flash.utils.*; public class Casher extends Sprite { public static const FINISHED:String="casherFinished"; private var nowLoaded:uint; private var howManyToDownload:uint; private var loader:Loader; private var byteArr:ByteArray; public function Casher() { byteArr=new ByteArray(); nowLoaded=0; howManyToDownload=42; loader=new Loader ; loader.contentLoaderInfo.addEventListener(Event.INIT,loaderInitListener); startLoading(1); } public function loaderInitListener(e:Event) { nowLoaded+= 1; byteArr.writeObject(loader.content) trace("//____________________\nNow bites in Cash.cash: "+byteArr.length) if (nowLoaded < howManyToDownload) { startLoading(nowLoaded + 1); } else { dispatchEvent(new Event(Casher.FINISHED)); } } private function startLoading(numb:uint) { var uReq:URLRequest=new URLRequest("http://....ru/pic/.../" + numb + ".png"); loader.load(uReq); } } } 1) что именно пишется в этом случае в ByteArray 2) как можно преобразовать ByteArray в строку (если можно конечно)
__________________
...вселенская грусть |
|
|||||
|
1) Bitmap, надо полагать, и пишется, но данных у него на борту нет,
т.е. пихать туда надо bitapData этого битмапа, перекодированные в ByteArray, а проще грузить сразу URLLoader'ом как бинарные данные 2) readUTF, readUTFBytes, to String,.. |
|
|||||
|
об этом и речь: так ты пишешь битмапДату, но опять же без данных
надо любым енкодером (полно на любые форматы) перекодировать в картинку но получишь при этом тоже, что получил бы если б сразу грузил как бинарник |
|
|||||
|
Таак... спасибо, сейчас опробуем вариант с URLLoader
ЗЫ так получается, что с помощью ByteArray.writeObject мы не превращаем данные в бинарные? те в данном случае - BitmapData - это же объект. По идее ByteArray должен понимать как его закодить в AMF... UPD Опробовал... Работает =) ну, вернее на данном этапе - выдает размер ByteArray близкий к рельному суммарному размеру картинок (несколько больший реального) Самым простым способом записи в строку, на мой взгляд, тут будет toString(). При трейсе toString выдает сигнатуру PNG и, как я понял, кучу нечитаемых (невоспроизводимых?) символов (у меня это 3 строчки в Output'е) Постараюсь причесать все это дело silin, я Вам очень признателен UPD 2 Почему-то захотелось побыть признательным еще раз... С загрузкой не возникает никаких проблем: var loader = new URLLoader; loader.dataFormat = URLLoaderDataFormat.BINARY; loader.load(SOME_URL_REQUEST) особенно если учесть что после ByteArray.toString() мы можем все это сохранить на диске пользователя НО вознивает вопрос: - о превращении строки обратно в ByteArray - о конвертации ByteArray в Bitmap (BitmapData?) для дальнейшего отображения на экране Каким образом можно это осуществить? UPD 3 Задавать вопросы и самому же на них отвечать - на мой взгляд довольно продуктивная форма работы =) Часть проблемы, касающаяся преобразования ByteArray в объект Bitmap - на поверку оказалась элементарной: import flash.net.*; import flash.display.*; import flash.events.*; import flash.utils.*; public class Casher extends Sprite { public static var so:SharedObject; private var urlLoader:URLLoader; private var byteArr:ByteArray; public function Casher() { byteArr = new ByteArray(); urlLoader = new URLLoader; urlLoader.addEventListener(Event.COMPLETE, urlLoaderInitListener); urlLoader.dataFormat = URLLoaderDataFormat.BINARY; var uReq:URLRequest = new URLRequest("http://.../pic/32.png"); urlLoader.load(uReq); } public function urlLoaderInitListener(e:Event) { // Создаем массив, в который будем сохранять картинку var ba:ByteArray = new ByteArray(); // Собственно, пихаем картинку в массив байтов ba = urlLoader.data; // создаем лоадер, сейчас будет понятно, для чего var loader:Loader = new Loader(); // вот теперь понятно для чего // лоадер сам распознает массив байт как картинку loader.loadBytes(ba); // вуаля, добавляем бинарные данные на сцену =) addChild(loader); } } А именно - преобразовать ByteArray в String и обратно без потери данных Подскажите, пожалуйста, как это можно сделать?
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 11.02.2009 в 23:28. Причина: я подумал и решил |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 100
|
__________________
http://komimap.ru |
|
|||||
|
не вижу никаких резонов сохранять как строку
нормально все пишется как ByteArray public class Main extends Sprite { private var _loader:URLLoader = new URLLoader(); private var _so:SharedObject = SharedObject.getLocal("test"); public function Main():void { if (_so.data.pic) { var loader:Loader = new Loader(); loader.loadBytes(_so.data.pic); addChild(loader); }else { _loader.addEventListener(Event.COMPLETE, loaderCompleteHandler); _loader.dataFormat = "binary"; _loader.load(new URLRequest("face0.jpg")); } } private function loaderCompleteHandler(evnt:Event):void { var ba:ByteArray = _loader.data as ByteArray; _so.data.pic = ba; } } |
|
|||||
|
А это под любой плеер так?
Я нашел решение для сохранения строки - можно ByteArray перевести в Base64-строку, и ее затем сохранить в SO UPD ой, а я не первый =) UPD 2 Да, отлично пишется и ByteArray, костыли с Base64 не нужны. Интересно, возможно ли загрузить звук бинарником?
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 12.02.2009 в 17:50. |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|