Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Decoder/Encoder (http://www.flasher.ru/forum/showthread.php?t=118119)

vorbiz 14.11.2008 22:22

Decoder/Encoder
 
Друзья. Для реализации одного из скриптов мне потребовались классы для работы с изображениями. BMPEncoder, GIFEncoder, JPGEncoder, PNGEncoder, BMPDecoder, GIFDecoder, JPGDecoder, PNGDecoder. Те, что зачёркнуты я уже откопал. А вот последние два оказались проблемой. Будьте добры, подскажите, существуют ли они в природе, или мне таки придётся их портировать из Java?

†‡Paladin‡† 14.11.2008 22:39

Флэш по дефолту держит PNG и JPG. В чем проблема?

etc 14.11.2008 22:42

А смысл указанных декодеров, если вы можете просто загрузить картинку в соответствующем формате?

vorbiz 14.11.2008 22:46

Смысл вот в чем: мне нужно дать возможность пользователю загрузить картинку во флеш. Делайется это классом FileReference. Он возвращает ByteArray. Всё бы ничего, но затем мне необходимо отобразить загруженную картинку во флешке. И, я так понимаю, делается это при помощи BitmapData. Мне эти классы нужны для конвертации ByteArray <> BitmapData и обратно. Декодеры мне помогают загружать картинки, а энкодеры = сливать на сервер. В общем, графический редактор картинок.
Если я начал мыслить в неверном направлении, поправьте меня, пожалуйста.

etc 14.11.2008 22:50

А метод loadBytes у Loader вам чем не угодил?
Я понимаю, там, кодеки, все дела, но декодеры-то зачем…

vorbiz 14.11.2008 22:56

Loader умеет только забирать фалы по указанному адресу. Мне нужна возможность выбора файла с пользовательской машины. loadBytes возвращает всё тот же ByteArray, закодированный в формате файл. Для отображания на канве флешки необходимо его преодразовать в BitmapData, который, как я понимаю, просто напросто, содержит двумерный массив пикселей.

etc 14.11.2008 23:03

Божей мой. Делаем select файла, получили бинарник, делаем loadBytes, ловим COMPLETE, делаем либо draw лоадера, либо, если content является Bitmap-ом, тягаем из него BitmapData.

vorbiz 14.11.2008 23:05

Не совсем понимаю, у Loader нет методов select и draw .

etc 14.11.2008 23:08

draw есть у BitmapData. А SELECT — событие у FileReference.

vorbiz 14.11.2008 23:13

Хорошо, а что указывать в качестве параметра loadBytes? Какой ресурс? draw у BitmapData позволяет передать в BitmapData данные первого параметра, IBitmapDrawable, ByteArray не предоставляет этот интерфейс. Вот тут я и столкнулся с проблемой декодирования.

Добавлено через 11 минут
Оп, кажется я понял, спасибо огромное. Разбирусь теперь с тем, что скрипт не может найти fl.containers.UILoader.

etc 14.11.2008 23:26

Так, похоже слова плохо доносят смысл. Примерно так:

Код:


private const _ref:FileReference = new FileReference();
private const _loader:Loader = new Loader();
private var _bitmap:BitmapData;



this._ref.addEventListener(Event.SELECT, this.handler_select);
this._ref.addEventListener(Event.COMPLETE, this.handler_selectComplete);
this._loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handler_complete);

// где-то тут вызвается this._ref.browse();


private function handler_select(event:Event):void {
        this._ref.load();
}

private function handler_selectComplete(event:Event) {
        this._loader.loadBytes(this._ref.data);
}

private function handler_complete(event:Event):void {

        var content:DisplayObject = this._loader.content;

        if (content is Bitmap) {
                this._bitmap = (content as Bitmap).bitmapData;
        } else {
                var bounds:Rectangle = content.getBounds();
                this._bitmap = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
                this._bitmap.draw(content, new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y));
        }

        trace('Say Hello to BitmapData', this._bitmap)
}

Добавлено через 4 минуты
Цитата:

Сообщение от vorbiz (Сообщение 777150)
Разбирусь теперь с тем, что скрипт не может найти fl.containers.UILoader.

Господи, зачем вам левые классы какие-то? Обычный Loader и всё. Обычный BitmapData, никаких декодеров и прочей мути.

musat 14.11.2008 23:34

Код AS3:

package {
        import flash.net.FileReference;
        import flash.net.FileFilter;
        import flash.net.URLRequest;
 
        import flash.events.Event;
 
        import flash.display.Loader;
 
        import flash.display.Bitmap;
        import flash.display.BitmapData;
 
        import flash.utils.ByteArray;
 
        public class Main {
                private var fileRef:FileReference;
                private var imageLoader:Loader;
 
                public function Main() {
                        fileRef = new FileReference();
                        fileRef.addEventListener(Event.SELECT,onFileSelected);
                        var imageTypeFilter:FileFilter = new FileFilter("Изображения (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png");
                        fileRef.browse([imageTypeFilter]);
                }
 
                private function onFileSelected(evt:Event):void {
                        fileRef.addEventListener(Event.COMPLETE,onComplete);
                        fileRef.load();
                }
 
                private function onComplete(evt:Event):void {
                        var imageData:ByteArray = fileRef.data;
                        imageLoader.loadBytes(imageData);
                        addEventListener(Event.ENTER_FRAME,updateLoadingImage);                // приходится проверять по ENTER_FRAME, загружена ли картинка, т.к. при loadBytes() нет события COMPLETE
                }
 
                private function updateLoadingImage(evt:Event):void {
                        if (imageLoader.content != null) {                                                        // картинка загрузилась
                                removeEventListener(Event.ENTER_FRAME,updateLoadingImage);
                                var imageBitmap:Bitmap = imageLoader.content;
                                var imageBitmapData:BitmapData = imageBitmap.bitmapData; // результат
                        }
                }
        }
}


_etc:
Код AS3:

this._loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handler_complete);

Хм, не знал, что так можно, вешал событие Event.COMPLETE на сам лоадер, но оно не срабатывало. Я думал, что это баг)

etc 14.11.2008 23:39

musat, событие COMPLETE есть, только подписываться надо у правильного объекта.

vorbiz 14.11.2008 23:41

Все, работает, спасибо огромное.

Добавлено через 2 минуты
Да, действительно, лоадер существует. А зачем, интересно, тогда UILoader? :) В доках, просто, он указан, у меня и с ним заработало :)

etc 15.11.2008 00:28

Читайте доку по UILoader. Это нестандартный класс, как минимум.


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

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