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

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

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

Регистрация: Jan 2006
Сообщений: 179
По умолчанию Скорость декодирования BitMap

Собственно вопрос поднимался, хотелось бы кое-что выяснить и внести ясность.

Опять же вопрос стоит по загрузщик фото (на примере Вконтакте).
Собственно получилось сделать такое же, но не совсем главная проблема в декодировании Bitmap в byteArray. Сейчас наверно все закричать ты чего, тысячу раз уже обсуждали и пошлют смотреть JPGEncoder ну кто-то подскажет про Live JPEG Encoder (который даёт ещё event). Кто-то скажет что же ещё ? Опять же берём пример Вконтакте, там сделано декодирование на КЛИЕНТЕ !!! Проверено скачивал флешку и декодировал. причём сделано с помощью С (alchemy). Можно почитать ветку форума.
Причём почитав, что пишут, можно скачать оттуда пример, в котором уже всё скомпилировано, причём в загрузщике ВКонтакте всё тоже самое (конечно куски кода там побиты, иначе бы я взял оттдуа работающий код).

Собственно главный вопрос, скачав этот пример, у меня не получилось его запустить, но ВКонтакте он уже используется, может гуру подскажут как же его использовать, в этом примере как раз показывается разница скорости обработки путём alchemy и JPGEncoder.

Я думаю что эта нужная штука, которая реально в разу увеличивает скорость обработки графических файлов. Жду Ваших мыслей.

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

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
ИМХО сохраниние несложных векторных рисунков, которые можно накалякать вконтакте легче созранять в каком-нибудь своем векторном формате. Во вконтакте рисуются только линии. Линия имеет начало и конец, отлщину, цвет и прозрачность. Запомнить эти несколько параметров проще чем jpg рисунок этой линии.

ПС: танком по мухам это, конечно дааа... круто блин(эот я про alchemy).

Старый 02.04.2009, 10:23
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 3  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Хм... Прикол. Действительно этот враппер весит в скомпиленной флешке 4 килобайта и кодирует быстрее разов в 5. Простой тест загрузка картинки изменение размера и кодирование всем известным енкодером и этим новым враппером. При использовании енкодера флешка зависайт (думает) около секунды и враппером (вообще не думает) моментально.
http://www.murmadillo.tut.su/m/my_jpg.swf
Код:
package  
{
	import flash.display.*;
	import flash.text.*;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.*;
	import com.adobe.images.JPGEncoder;
	import flash.geom.*;
	import flash.filters.*;
	
	
	import hurlant.jpeg.as3_jpeg_wrapper;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class DocJpgEncoder extends Sprite
	{
		private var loader:Loader,
		file:FileReference,
		txt:TextField,
		sender:ByteArray,
		i:int,
		bmd550x400:BitmapData;

		public function DocJpgEncoder() 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			txt=new TextField;
			file = new FileReference;
			
			
			// file.browse(getTypes());
			file.addEventListener(Event.COMPLETE,onComplete);
			file.addEventListener(Event.SELECT,onSelectFile);
			//onShowloadDialog();
			txt.htmlText = "<a href=\'event:load\'><u>[Загрузить файл]</a>" +
			" <a href=\'event:save\'><u>[Сохранить файл JPGEncoder 550х400]</a> " +
			" <a href=\'event:saveWrap\'><u>[Сохранить файл as3_jpeg_wrapper 550х400]</a>";
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);//добавить на рабочее поле
			txt.filters = [new GlowFilter(0xffffff, 1, 3, 3, 3)];
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);
			txt.addEventListener(TextEvent.LINK, txtLinkFunc);
			
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			var seed:int = int(Math.random() * int.MAX_VALUE);
			var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
			bmd550x400.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);
		}

		private function txtLinkFunc(evt:TextEvent):void {
			if (evt.text == 'load') {
				onShowloadDialog();
			}
			if (evt.text == 'save') {
				onShowSaveDialog();
			}
			//saveWrap
			if (evt.text == 'saveWrap') {
				onShowSaveWrapDialog();
			}
		}

		//отображение диалога открытия файла
		private function onShowloadDialog(event:Event=null):void {
			var fileFilter:FileFilter=new FileFilter("Images","*.jpg");
			try {
				file.browse([fileFilter]);
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save файла
		private function onShowSaveDialog(event:Event=null):void {
			var jpgEncoder:JPGEncoder = new JPGEncoder(100);//100 качество
			var jpgStream:ByteArray = jpgEncoder.encode(bmd550x400);
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(jpgStream,"lexJPGEncoder.jpg");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save Wrapper файла
		private function onShowSaveWrapDialog(event:Event = null):void {
			var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0,0,550,400));
			var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2);
			
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(retByteArray,"lex_as3_jpeg_wrapper.jpg");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//при выборе файла загружаем его
		private function onSelectFile(event:Event):void {
			try {
				file.load();
			}
			// catch(illegalOperation:IllegalOperationError) 
			catch (e:Error) {
			}
		}
		private function onComplete(event:Event):void {
			//addChild(loader = new Loader);
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderContentHandler);
			loader.loadBytes(file.data);
			loader.y = 20;
		}
		private function loaderContentHandler(evt:Event):void {
			var bitmapData:BitmapData = Bitmap(loader.content).bitmapData.clone();
			var sp:Sprite = new Sprite;
			var image:Bitmap = new Bitmap(bitmapData);

			var myMatrix:Matrix = new Matrix();
			var scale:Number;
			var scalXY:Object = new Object;

			trace('hi');

			
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			scalXY = getAutoScale(bitmapData, 550, 400);
			myMatrix.createBox(scalXY.scale, scalXY.scale, 0, 0, 0);//scaleX,scaleY,rotation,x,y
			bmd550x400.draw(image, myMatrix);
			sp.addChild(image = new Bitmap(bmd550x400));
			image.x = scalXY.x;
			image.y = scalXY.y;
			bmd550x400 = new BitmapData(550, 400, false, 0xffffff);
			bmd550x400.draw(sp);
			addChild(image = new Bitmap(bmd550x400));
			addChild(txt);
		}

		private function getAutoScale(_bm:BitmapData,_w:Number,_h:Number):Object {
			var sizeX:Number = _bm.width;
			var sizeY:Number = _bm.height;
			var scale:Number;
			var scalXY:Object = new Object;
			var tv:Number = sizeX / sizeY;
			trace(tv);
			if (tv > 1||tv < 1.3) {//квадрат
				scale = _w / sizeX;
				scale = scale / tv;
			}
			if (tv < 1) scale = _h / sizeY;//вертикаль
			if (tv >= 1.3) scale = _h / sizeY;//горизонт

			scalXY.x = (_w - sizeX * scale) / 2;
			scalXY.y = (_h - sizeY * scale) / 2;
			scalXY.scale = scale;
			return scalXY;
		}

	}
	
}
PS: Я думаю это связано еще и с тем, что JPGEncoder на выходе выдает jpg (100 - качество) с весом 550х400 около 200-300 кБт, а wrapper 550х400 (качество пофигу) 12-30 кБт


Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 10:26.
Старый 02.04.2009, 11:29
motoroller вне форума Посмотреть профиль Отправить личное сообщение для motoroller Найти все сообщения от motoroller
  № 4  
Ответить с цитированием
motoroller

Регистрация: Jan 2006
Сообщений: 179
Скажите как быть ? В итоге свой пример сделал а он не работает, может кто-то помочь его подправить, чтобы он заработал.

Добавлено через 9 минут
Да и ещё я не устанавливал ничего кроме flash cs4, может из-за этого не идёт ?

Добавлено через 19 минут
В итоге я вставил твой код во flash:

Код AS3:
 
	import flash.display.*;
	import flash.text.*;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.*;
	import com.adobe.images.JPGEncoder;
	import flash.geom.*;
	import flash.filters.*;
 
	import hurlant.jpeg.as3_jpeg_wrapper;
 
 
 
		 var loader:Loader,
		file:FileReference,
		txt:TextField,
		sender:ByteArray,
		i:int,
		bmd550x400:BitmapData;
 
		DocJpgEncoder();
 
		 function DocJpgEncoder() 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			txt=new TextField;
			file = new FileReference;
 
 
			// file.browse(getTypes());
			file.addEventListener(Event.COMPLETE,onComplete);
			file.addEventListener(Event.SELECT,onSelectFile);
			//onShowloadDialog();
			txt.htmlText = "<a href=\'event:load\'><u>[Загрузить файл]</a>" +
			" <a href=\'event:save\'><u>[Сохранить файл JPGEncoder 550х400]</a> " +
			" <a href=\'event:saveWrap\'><u>[Сохранить файл as3_jpeg_wrapper 550х400]</a>";
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);//добавить на рабочее поле
			txt.filters = [new GlowFilter(0xffffff, 1, 3, 3, 3)];
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);
			txt.addEventListener(TextEvent.LINK, txtLinkFunc);
 
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			var seed:int = int(Math.random() * int.MAX_VALUE);
			var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
			bmd550x400.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);
		}
 
		 function txtLinkFunc(evt:TextEvent):void {
			if (evt.text == 'load') {
				onShowloadDialog();
			}
			if (evt.text == 'save') {
				onShowSaveDialog();
			}
			//saveWrap
			if (evt.text == 'saveWrap') {
				onShowSaveWrapDialog();
			}
		}
 
		//отображение диалога открытия файла
		 function onShowloadDialog(event:Event=null):void {
			var fileFilter:FileFilter=new FileFilter("Images","*.jpg");
			try {
				file.browse([fileFilter]);
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save файла
		 function onShowSaveDialog(event:Event=null):void {
			var jpgEncoder:JPGEncoder = new JPGEncoder(100);//100 качество
			var jpgStream:ByteArray = jpgEncoder.encode(bmd550x400);
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(jpgStream,"lexJPGEncoder.jpg");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save Wrapper файла
		 function onShowSaveWrapDialog(event:Event = null):void {
			var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0,0,550,400));
			var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2);
 
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(retByteArray,"lex_as3_jpeg_wrapper.jpg");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//при выборе файла загружаем его
		 function onSelectFile(event:Event):void {
			try {
				file.load();
			}
			// catch(illegalOperation:IllegalOperationError) 
			catch (e:Error) {
			}
		}
		 function onComplete(event:Event):void {
			//addChild(loader = new Loader);
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderContentHandler);
			loader.loadBytes(file.data);
			loader.y = 20;
		}
		 function loaderContentHandler(evt:Event):void {
			var bitmapData:BitmapData = Bitmap(loader.content).bitmapData.clone();
			var sp:Sprite = new Sprite;
			var image:Bitmap = new Bitmap(bitmapData);
 
			var myMatrix:Matrix = new Matrix();
			var scale:Number;
			var scalXY:Object = new Object;
 
			trace('hi');
 
 
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			scalXY = getAutoScale(bitmapData, 550, 400);
			myMatrix.createBox(scalXY.scale, scalXY.scale, 0, 0, 0);//scaleX,scaleY,rotation,x,y
			bmd550x400.draw(image, myMatrix);
			sp.addChild(image = new Bitmap(bmd550x400));
			image.x = scalXY.x;
			image.y = scalXY.y;
			bmd550x400 = new BitmapData(550, 400, false, 0xffffff);
			bmd550x400.draw(sp);
			addChild(image = new Bitmap(bmd550x400));
			addChild(txt);
		}
 
		 function getAutoScale(_bm:BitmapData,_w:Number,_h:Number):Object {
			var sizeX:Number = _bm.width;
			var sizeY:Number = _bm.height;
			var scale:Number;
			var scalXY:Object = new Object;
			var tv:Number = sizeX / sizeY;
			trace(tv);
			if (tv > 1||tv < 1.3) {//квадрат
				scale = _w / sizeX;
				scale = scale / tv;
			}
			if (tv < 1) scale = _h / sizeY;//вертикаль
			if (tv >= 1.3) scale = _h / sizeY;//горизонт
 
			scalXY.x = (_w - sizeX * scale) / 2;
			scalXY.y = (_h - sizeY * scale) / 2;
			scalXY.scale = scale;
			return scalXY;
		}

Все пути к библиотекам правильно, файл "as3_jpeg_wrapper.swc", лежит там же где и флешка.

По клику jpeg encoder as3 - вcё ок, когда кликаю по wrapper

VerifyError: Error #1014: Не удалось найти класс cmodule.as3_jpeg_wrapper::CLibInit.

at test_fla::MainTimeline/onShowSaveWrapDialog()
at test_fla::MainTimeline/txtLinkFunc()

Старый 02.04.2009, 13:16
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 5  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Ставим (читаем - http://racer242install.blogspot.com/)
Microsoft.NET 2.0
Java 1.6+
Выбираем последнюю версию флешдевелопа
http://www.flashdevelop.org/communit...orum.php?f=11/
Распаковуем опен соурсе флекс сдк
http://opensource.adobe.com/wiki/dis...ownload+Flex+4
Качаем последнюю версию дебуг плеера
http://www.adobe.com/support/flashplayer/downloads.html

Создаем проект во флеш девелоп кидаем п папку проекта нашу swc кликаем на правой кнопочкой, там будет добавить в проект.

Настраиваем девелопа
http://www.murmadillo.tut.su/m/InstructionFDoc.swf


А вообще-то поищите ка файлик as3corelib.swc где находится этот энкодер, и сунте в туже папку as3_jpeg_wrapper.swc, в Adobe Flash эти swc лежат не знаю где, поищите в гугле (подключение библиотек swc к Adobe Flash CS3, в СS4 наверное так-же) или в каталоге Adobe Flash CS4 (где их будет больше всего туда и сунте),


Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 13:39.
Старый 02.04.2009, 14:26
motoroller вне форума Посмотреть профиль Отправить личное сообщение для motoroller Найти все сообщения от motoroller
  № 6  
Ответить с цитированием
motoroller

Регистрация: Jan 2006
Сообщений: 179
Отчёт о проделанной работе:
1) Нашёл всё-таки куда пихать файл "as3_jpeg_wrapper.swc" в эту папку
C:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\ActionScript 3.0\libs
либо можно publish setting науськавтаь на файл


Результат стал другим он уже не ругается что не найден класс, а просто пишет:
ReferenceError: Error #1065: Переменная DocJpgEncoder не определена.

Старый 02.04.2009, 15:38
CrushYar вне форума Посмотреть профиль Отправить личное сообщение для CrushYar Найти все сообщения от CrushYar
  № 7  
Ответить с цитированием
CrushYar

Регистрация: Jul 2008
Сообщений: 5
Имхо библиотека as3_jpeg_wrapper.swc какая-то неправильная.
Я не смог её подцепить в cs4. Мне кажется, что там не хватает пары методов для полноценной работы с cs4 (cs3).
А вообще тема интересная (в плане использования С-ых библиотек), хотя и и тЁмная для меня.

Старый 02.04.2009, 15:55
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 8  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Результат стал другим он уже не ругается что не найден класс, а просто пишет:
ReferenceError: Error #1065: Переменная DocJpgEncoder не определена.

DocJpgEncoder это документ класс.
Кликаем на пустую поверхость рабочего поля нажимает ctrl+F3
Там есть поле Document Class вставляем туда DocJpgEncoder. В той же папке должен быть файл DocJpgEncoder.as с содержимым, которое я уже дал.

>>(в плане использования С-ых библиотек), Они уже не сишные, там просто с код в стиле AS3 и к сям уже не имеет никакого отношения.

Старый 02.04.2009, 16:25
motoroller вне форума Посмотреть профиль Отправить личное сообщение для motoroller Найти все сообщения от motoroller
  № 9  
Ответить с цитированием
motoroller

Регистрация: Jan 2006
Сообщений: 179
Цитата:
Сообщение от Alex Lexcuk Посмотреть сообщение
>>Результат стал другим он уже не ругается что не найден класс, а просто пишет:
ReferenceError: Error #1065: Переменная DocJpgEncoder не определена.

DocJpgEncoder это документ класс.
Кликаем на пустую поверхость рабочего поля нажимает ctrl+F3
Там есть поле Document Class вставляем туда DocJpgEncoder. В той же папке должен быть файл DocJpgEncoder.as с содержимым, которое я уже дал.

>>(в плане использования С-ых библиотек), Они уже не сишные, там просто с код в стиле AS3 и к сям уже не имеет никакого отношения.
Вот собственно всё так и сделано один в один та же ошибка

Старый 02.04.2009, 20:13
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 10  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Вот собственно всё так и сделано один в один та же ошибка

motoroller, заскриншотил код, который давал и код, который вы зачем-то вставили сюда, там нехватает пару важных слов.

И поставьте себе FlashDevelop, много ошибок Flash CS пофигу.


Последний раз редактировалось Alex Lexcuk; 02.04.2009 в 20:24.
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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