Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.02.2009, 17:12
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 1  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
По умолчанию Что можно сохранить в SharedObject

Насколько мне известно, в SharedObject можно хранить примитивные данные флеша: String, XML, Array, Boolean... и тд
Я уперся взглядом в слово String. Подумал про ByteArray. Подумал про Bitmap. И мне стало казаться реальным сохранить изображение на стороне пользователя =) (ну с учетом того, что тот предоставит пространстыво)

Что я сделал:
Код AS3:
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);
		}
	}
}
В конечном итоге суммарный вес ByteArray составил 19 кб с 42 картинок (каждая из которых на диске занимает 22 кб). Соответственно, что-то не то сохраняет в себя ByteArray. Отсюда - 2 вопроса:
1) что именно пишется в этом случае в ByteArray
2) как можно преобразовать ByteArray в строку (если можно конечно)
__________________
...вселенская грусть

Старый 11.02.2009, 17:57
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
1) Bitmap, надо полагать, и пишется, но данных у него на борту нет,
т.е. пихать туда надо bitapData этого битмапа, перекодированные в ByteArray, а проще грузить сразу URLLoader'ом как бинарные данные
2) readUTF, readUTFBytes, to String,..

Старый 11.02.2009, 18:09
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Пробовал писать BitmapData - пишет вообще по 3 байта на объект
Или способ записи неверный, или не знаю что... =)
__________________
...вселенская грусть

Старый 11.02.2009, 18:24
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
об этом и речь: так ты пишешь битмапДату, но опять же без данных
надо любым енкодером (полно на любые форматы) перекодировать в картинку
но получишь при этом тоже, что получил бы если б сразу грузил как бинарник

Старый 11.02.2009, 18:28
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Таак... спасибо, сейчас опробуем вариант с URLLoader

ЗЫ
так получается, что с помощью ByteArray.writeObject мы не превращаем данные в бинарные? те в данном случае - BitmapData - это же объект. По идее ByteArray должен понимать как его закодить в AMF...

UPD
Опробовал... Работает =) ну, вернее на данном этапе - выдает размер ByteArray близкий к рельному суммарному размеру картинок (несколько больший реального)
Самым простым способом записи в строку, на мой взгляд, тут будет toString(). При трейсе toString выдает сигнатуру PNG и, как я понял, кучу нечитаемых (невоспроизводимых?) символов (у меня это 3 строчки в Output'е)
Постараюсь причесать все это дело

silin, я Вам очень признателен

UPD 2
Почему-то захотелось побыть признательным еще раз...

С загрузкой не возникает никаких проблем:
Код AS3:
var loader = new URLLoader;
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(SOME_URL_REQUEST)
Таким образом мы сразу получаем данные в формате ByteArray, что, согласитесь, просто прелестно
особенно если учесть что после ByteArray.toString() мы можем все это сохранить на диске пользователя
НО
вознивает вопрос:
- о превращении строки обратно в ByteArray
- о конвертации ByteArray в Bitmap (BitmapData?) для дальнейшего отображения на экране

Каким образом можно это осуществить?

UPD 3
Задавать вопросы и самому же на них отвечать - на мой взгляд довольно продуктивная форма работы =)

Часть проблемы, касающаяся преобразования ByteArray в объект Bitmap - на поверку оказалась элементарной:
Код AS3:
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. Причина: я подумал и решил
Старый 12.02.2009, 10:46
gnus вне форума Посмотреть профиль Отправить личное сообщение для gnus Найти все сообщения от gnus
  № 6  
Ответить с цитированием
gnus

Регистрация: Feb 2008
Сообщений: 100
например Base64

реализация имеется например в библиотеке as3crypto
__________________
http://komimap.ru

Старый 12.02.2009, 11:46
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не вижу никаких резонов сохранять как строку
нормально все пишется как ByteArray

Код AS3:
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;
 
	}
 
}

Старый 12.02.2009, 14:03
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
А это под любой плеер так?
Я нашел решение для сохранения строки - можно ByteArray перевести в Base64-строку, и ее затем сохранить в SO

UPD
ой, а я не первый =)

UPD 2
Да, отлично пишется и ByteArray, костыли с Base64 не нужны.
Интересно, возможно ли загрузить звук бинарником?
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 12.02.2009 в 17:50.
Создать новую тему Ответ Часовой пояс GMT +4, время: 02:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.