Flash 10. Сжатие изображений на стороне клиента

Выкладываем свои наработки
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

вот мы и выяснили что флеш плеер 10 может обрабатывать изображения немного более чем с камер в 15 мегапикселей.. в принципе не плохо..
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

На самом деле есть трюки - можно разрезать изображение на меньшие части.
Вот, например, класс для работы с большими изображениями http://www.bit-101.com/blog/?p=1199
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

Зачем ? есть hxformats , он уже умеет.
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Я с хаком только начал разбираться. Кстати если зашла тема - как можно удобно работать в хаксе с ресурсами? (встраивать картинки и тп)?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

swc вам в помощь. По-моему теперь можно прям из flashdevelop его создавать.
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Плагин уже давно установлен. Если haxe тоже понимает свц то гут.
Спасибо
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

Уфф наконец-то раскрыл секрет фирмы, совсем не сложно)
Решение оказалось так нелепо и неожиданно.. оказвается картинку загружают в флеш ролик, потом ресайзят, показвают на холсте(незаметно), отображённое изображение записывают в память(спец массив), тут же стирают его со сцены, перекодируют(с помошью класса JPGEncoder из сторонней билиотеки com) и потом отсылают как метаданные на сервер. как всё хитро сделанно.. но работает же!

Библиотека com вот эта: http://code.google.com/p/as3corelib/

Выкладывать своё творчество пока не буду, там полный хаос, выложу к концу недели, щас пока некогда переписать нормально..
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Где-то так
Советую использовать библиотеку http://www.blooddy.by/ru/crypto/
Там есть тесты скорости кодировщиков (http://www.blooddy.by/ru/crypto/benchmark/)
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

Ну вот, проект в зачаточном виде готов
Исходники, как обещал
Main.as

Код: Выделить всё

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import imgResizer;
    
    /**
     * ...
     * @author HaifLive
     */
    public class Main extends Sprite 
    {
        private var imgR:imgResizer;
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            imgR = new imgResizer();
            addChild(imgR);
        }
        
    }
    
} 
imgResizer.as

Код: Выделить всё

package  
{
    import flash.display.Sprite;
    import flash.events.TextEvent;
    import flash.text.TextField;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.display.Loader;
    import flash.net.FileReference;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    
    import flash.net.URLRequest;
    import flash.net.URLRequestHeader;
    import flash.net.URLRequestMethod;
    import flash.net.URLLoader;
    
    import flash.utils.ByteArray;
    
    import by.blooddy.crypto.image.JPEGEncoder;
    import by.blooddy.crypto.image.PNG24Encoder;
    
    /**
     * ...
     * @author HaifLive
     */
    public class imgResizer extends Sprite 
    {
        private static const _MAX_WIDTH        : Number = 1600;
        private static const _MAX_HEIGHT    : Number = 1200;
        
        private var _myFileRef:            FileReference;
        private var _imgTypeFilter:        FileFilter;
        private var _otherTypeFilter:    FileFilter;
        private var _loader:            Loader;
        private var _bitmap:            Bitmap;
        
        public function imgResizer():void
        {
            super();
            _myFileRef = new FileReference();
            /* setup file's filters */
            _imgTypeFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
            _otherTypeFilter = new FileFilter("Other files(*)", "*");
            
            var tf:TextField = new TextField();
            tf.text = "Select";
            tf.addEventListener(MouseEvent.CLICK, showWindowSelectFile);
            addChild(tf);
        }
        
        public function showWindowSelectFile(event:Event):void
        {
            trace("start select");
            _myFileRef.browse( [_imgTypeFilter, _otherTypeFilter] );
            _myFileRef.addEventListener ( Event.SELECT, imageSelected );

        }
        
        private function imageSelected(event:Event):void
        {
            trace("File selected");
            _myFileRef.load ( );
            _myFileRef.addEventListener ( Event.COMPLETE, fileSelected );
            trace("file name" + event.target.name );
        }
        
        private function fileSelected(event:Event):void
        {
            var tempFileRef : FileReference = FileReference ( event.target );
            _loader = new Loader ( ) ;
            _loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, fileLoaded );
            _loader.loadBytes ( tempFileRef.data ) ;
        }
        
        private function fileLoaded(event:Event):void
        {
            _bitmap = Bitmap ( event.target.content ) ;
            _bitmap.smoothing = true;
            
            if ( _bitmap.width > _MAX_WIDTH || _bitmap.height > _MAX_HEIGHT )
                resizeBitmap ( _bitmap );

            addChild ( _bitmap );
            
            var jpgSource:BitmapData = new BitmapData (_bitmap.width, _bitmap.height);
            jpgSource.draw(this);
            removeChild( _bitmap );

            var jpgStream:ByteArray = by.blooddy.crypto.image.JPEGEncoder.encode(jpgSource);
            
            /* Send file */
            var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
            var jpgURLRequest:URLRequest = new URLRequest("http://test1.ru/jpegencoder/loadFile.php");
            var loader:URLLoader = new URLLoader();
            jpgURLRequest.requestHeaders.push(header);
            jpgURLRequest.method = URLRequestMethod.POST;
            jpgURLRequest.data = jpgStream;
            
            //loader.addEventListener ( ProgressEvent.PROGRESS, progressHandler ) ;
            //navigateToURL(jpgURLRequest, "_blank");
            try {
                loader.load(jpgURLRequest);
            } catch (error:Error) {
                trace("Unable to load requested document.");
            }
        }
        
        private function resizeBitmap( target : Bitmap ) : void
        {
            if ( target.height > target.width ) {
                target.width = _MAX_WIDTH;
                target.scaleY = target.scaleX;
            } else if ( target.width >= target.height ) {
                target.height = _MAX_HEIGHT;
                target.scaleX = target.scaleY;
            }

        }
        
    }

} 
loadFile.php

Код: Выделить всё

<?php

$fp = fopen( 'file.jpg', 'wb' );
 fwrite( $fp, $GLOBALS[ 'HTTP_RAW_POST_DATA' ] );
 // fwrite( $fp, "test");
 fclose( $fp );
 
?>
Вобщем, буду писать API для JavaScript, наверное прийдётся пожертовать иконками перед отправкой файла.. да и вобще этот флеш не видно будет на странице.

andrew911, спасибо за библиотеку действительно в разы производительнее.
Вложения
BitmapLoader.zip
(42.58 КБ) 180 скачиваний
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

А чем haxe плох ? )
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

Ekstazi писал(а):А чем haxe плох ? )
Я просто не увидел, чем он лучше AS3. Мне почему-то показалось, что это всего лишь надстройка на AS. AS3 в отличии от предыдущих версий доработали(хотя я только познакомился с AS), и он стал более менее похож на нормальный язык программирования с типизацией, хотя недостатки всё таки есть, а у кого их нет.
Даже не знаю.. вот выбрал AS3..
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

Просто смотри, haxe компилирует в байт код flash машины. Причем оптимизирует его намного лучше чем стандартный adobe flash. И имеет гораздо больше возможностей в языке. Тем более что flash платный, и вы обрекаете других программистов использовать платную среду разработки. Я бы выбрал haxe, ну да право ваше. Я писал и на as3 и на haxe, уж поверьте мне на слово.
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

Насколько лучше оптимизирует, прирост производительности в разы?.

Насчёт платности, flash develop + flex sdk разве не бесплатно?. что-то я никак не разибрусь в этих лицензиях..
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

flex sdk тянет за собой яву и еще кучу всяких зависимостей если не ошибаюсь + скорость компиляции очень низкая. Вы можете сами поискать обзоры и тесты. В интернете их полно.
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Haxe немного оптимальнее, но поскольку он все равно компилирует в байткод flash, выигрыш будет не очень большой, если не использовать alchemy (область применения которой тоже ограничена)
http://haxe.org/doc/why?lang=ru

Компилятор быстрее, это да.

Главный плюс haxe - кроссплатформенность.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение Ekstazi »

Дело не только в байт коде. С помощью jeash и nme вполне реально этот же код портировать на моб. устр-ва или js.
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Ну я про кроссплатформенность и написал, только не уверен, что тут получится
Врядли удастся нормально перегнать бибилиотеку для конвертирования в js, например.
try {
loader.load(jpgURLRequest);
} catch (error:Error) {
trace("Unable to load requested document.");
}
Вместо try лучше подписаться на ошибку
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение haiflive »

Я так и сделал.. просто в документации был вариант try.. и притом вариант try не работает, иссключение не обрабатывается, вместо обработки исключения вызывается исключение в конструкторе объекта, которое нельзя ни как обработать..

Так же недавно узнал очень неудобное ограничение, наверное это безопасность браузеров или что.. метод FileReferenceList.browse() нельзя вызвать из JavaScript, тоесть скрыть флеш полностью на странице не удастся, как минимум должна быть флеш "кнопка", которая вызовет этот метод..
Вызов метода FileReferenceList.browse() решается 2-я способами или нарисовать флешь кнопку, или сделать невидимый флеш слой над(html) кнопкой.. никто не подскажет, как сделать этот "невидимый слой над кнопкой" ?
andrew911
Сообщения: 60
Зарегистрирован: 2011.05.30, 23:45

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение andrew911 »

Да, там асинхронная ошибка получается.

Флеш можно сделать прозрачным и поместить над кнопкой видимо (используя z-index или что-то типа, я в верстке не силен). А в чем проблема сделать флеш кнопку?
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Flash 10. Сжатие изображений на стороне клиента

Сообщение RSol »

Вот накопал на днях:

http://pixlr.com/

там есть магические 3 буквы: API
Ответить