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

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Вытащить изображение из Loader как ByteArray

Собственно, клиент отправляет на сервер два изображения, одно, которое пользователь в него загрузил, второе - которое пользователь в клиенте обработал. Отправка идет классом MultipartURLLoader, которому оба изображения скармливаются как ByteArray. Со вторым изображением все понятно. Есть желание первое изображение отдавать без обработки.

В случае, когда загрузка идет с компьютера пользователя - вопросов тоже нет. FileReference.data - там как раз изображение в виде ByteArray. Попробовал аналогично решить в лоб с лоадером, но оказалось, что loader.contentLoaderInfo.bytes дает мне битую картинку. Отправляю на сервер, но там она не читается, хотя файл сохраняется.

Как по простому отправить изображение транзитом сквозь клиент? Передать на сервер ссылку не подходит, нужно именно грузить изображение.

Старый 16.08.2013, 04:39
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 2  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Битую картинку?

Код AS3:
new CrossLoader('http://www.flasher.ru/forum/images/russian/flasher_logo_2013.gif').addEventListener(Event.COMPLETE, loadComplete);
 
private function loadComplete(event:Event):void {
 
	(event.target as CrossLoader).bitmapData; // psevdo original bitmap data
 
}
CrossLoader.as
Код AS3:
package me.inpictures.net{
 
	import flash.net.URLRequest;
 
	import flash.display.Loader;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
 
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
 
	import flash.system.Security;
	import flash.system.LoaderContext;
 
	public class CrossLoader extends Bitmap {
 
		private var _loader : Loader = null;
		private var _loaderContent : DisplayObject = null;
 
		public function CrossLoader(url:String):void {
 
			Security.allowDomain("*");
			Security.allowInsecureDomain("*");
 
			_loader = new Loader();
 
			_loader.addEventListener(Event.ADDED, _onAddedToLoader, true, int.MAX_VALUE);
			_loader.addEventListener(Event.ADDED, _onAddedToLoader, false, int.MAX_VALUE);
 
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onPicLoaded);
			_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _errorHandler);
 
			_loader.load(new URLRequest(url));
 
		}
 
		private function _onAddedToLoader( e:Event ) : void
		{ 
			if (e.target)
			{
				_loaderContent = e.target as DisplayObject;
			}
		}
 
		private function _onPicLoaded( e:Event ) : void
		{ 
			var bd:BitmapData = (_loaderContent as Bitmap).bitmapData;
 
			var bdCopy:BitmapData = new BitmapData(bd.width, bd.height, true, 0x0);
				bdCopy.draw(bd);
 
			this.bitmapData = bdCopy;
 
			try {
				_loaderContent = _loader.content;
			} catch (exception:Error) {
				trace("exception: " + exception);
			}
 
			dispatchEvent(new Event(Event.COMPLETE));
		}
 
		private function _errorHandler(info:IOErrorEvent):void {
			trace("errorHandler...\n");			
		}
	}
}
__________________
return this...


Последний раз редактировалось AlexCooper; 16.08.2013 в 05:07.
Старый 16.08.2013, 11:00
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Нет, в битмапдате у меня изображение прекрасно грузится.
Там проблем именно с загрузкой вообще нет. Все на одном сервере.

Вот фрагмент кода. Мне нужна функция getImageAsByteArray().
Но, естественно, не через PNGEncoder.encode() или JPGEncoder.encode().

Код AS3:
public function load(imageFileURL:String):void 
{
	loader = new Loader();			
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
	loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	loader.load(new URLRequest(imageFileURL), new LoaderContext(true));
}
 
private function imageLoaded(e:Event):void 
{	
	loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, imageLoaded);
	loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
 
	// вот тут все в порядке
	imageBitmap = Bitmap(loader.content);
 
	// вот эта функция работает неправильно, возвращаемый 
	// ByteArray не является картинкой
	imageByteArray = getImageAsByteArray(loader.content);
 
	dispatchEvent(new Event(BITMAP_READY));	
}
 
 
private function getImageAsByteArray(image:DisplayObject) : ByteArray
{
	return image.loaderInfo.bytes;
}
Добавлено через 21 минуту
Собственно, судя по всему, там в массиве bytes лежит что-то еще:

Код AS3:
var bytesTotal1:int = loader.contentLoaderInfo.bytesTotal;
var bytesTotal2:int = loader.contentLoaderInfo.bytes.length;
var bytesTotal3:int = loader.content.loaderInfo.bytes.length;
 
trace(bytesTotal1,bytesTotal2,bytesTotal3);
 
// 43187 43253 43253
Поэтому картинка и не получается обратно из bytes...

Добавлено через 40 минут
Короче, решение оказалось таким:

1. Грузим не через Loader, а через URLLoader как URLLoaderDataFormat.BINARY - получаем картинку в ByteArray
2. Грузим этот массив данных в Loader через loader.loadBytes() - получаем изображение в дисплейлист


Последний раз редактировалось mikhailk; 16.08.2013 в 11:55.
Создать новую тему Ответ Часовой пояс GMT +4, время: 19:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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