Страница 2 из 3

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

Добавлено: 2011.09.03, 05:58
haiflive
вот мы и выяснили что флеш плеер 10 может обрабатывать изображения немного более чем с камер в 15 мегапикселей.. в принципе не плохо..

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

Добавлено: 2011.09.03, 13:36
andrew911
На самом деле есть трюки - можно разрезать изображение на меньшие части.
Вот, например, класс для работы с большими изображениями http://www.bit-101.com/blog/?p=1199

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

Добавлено: 2011.09.03, 15:43
Ekstazi
Зачем ? есть hxformats , он уже умеет.

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

Добавлено: 2011.09.03, 15:56
andrew911
Я с хаком только начал разбираться. Кстати если зашла тема - как можно удобно работать в хаксе с ресурсами? (встраивать картинки и тп)?

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

Добавлено: 2011.09.03, 20:58
Ekstazi
swc вам в помощь. По-моему теперь можно прям из flashdevelop его создавать.

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

Добавлено: 2011.09.03, 22:10
andrew911
Плагин уже давно установлен. Если haxe тоже понимает свц то гут.
Спасибо

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

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

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

Выкладывать своё творчество пока не буду, там полный хаос, выложу к концу недели, щас пока некогда переписать нормально..

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

Добавлено: 2011.09.04, 15:17
andrew911
Где-то так
Советую использовать библиотеку http://www.blooddy.by/ru/crypto/
Там есть тесты скорости кодировщиков (http://www.blooddy.by/ru/crypto/benchmark/)

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

Добавлено: 2011.09.10, 15:39
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, спасибо за библиотеку действительно в разы производительнее.

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

Добавлено: 2011.09.10, 16:40
Ekstazi
А чем haxe плох ? )

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

Добавлено: 2011.09.10, 17:01
haiflive
Ekstazi писал(а):А чем haxe плох ? )
Я просто не увидел, чем он лучше AS3. Мне почему-то показалось, что это всего лишь надстройка на AS. AS3 в отличии от предыдущих версий доработали(хотя я только познакомился с AS), и он стал более менее похож на нормальный язык программирования с типизацией, хотя недостатки всё таки есть, а у кого их нет.
Даже не знаю.. вот выбрал AS3..

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

Добавлено: 2011.09.10, 18:44
Ekstazi
Просто смотри, haxe компилирует в байт код flash машины. Причем оптимизирует его намного лучше чем стандартный adobe flash. И имеет гораздо больше возможностей в языке. Тем более что flash платный, и вы обрекаете других программистов использовать платную среду разработки. Я бы выбрал haxe, ну да право ваше. Я писал и на as3 и на haxe, уж поверьте мне на слово.

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

Добавлено: 2011.09.11, 08:45
haiflive
Насколько лучше оптимизирует, прирост производительности в разы?.

Насчёт платности, flash develop + flex sdk разве не бесплатно?. что-то я никак не разибрусь в этих лицензиях..

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

Добавлено: 2011.09.11, 11:31
Ekstazi
flex sdk тянет за собой яву и еще кучу всяких зависимостей если не ошибаюсь + скорость компиляции очень низкая. Вы можете сами поискать обзоры и тесты. В интернете их полно.

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

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

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

Главный плюс haxe - кроссплатформенность.

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

Добавлено: 2011.09.11, 15:35
Ekstazi
Дело не только в байт коде. С помощью jeash и nme вполне реально этот же код портировать на моб. устр-ва или js.

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

Добавлено: 2011.09.11, 22:15
andrew911
Ну я про кроссплатформенность и написал, только не уверен, что тут получится
Врядли удастся нормально перегнать бибилиотеку для конвертирования в js, например.
try {
loader.load(jpgURLRequest);
} catch (error:Error) {
trace("Unable to load requested document.");
}
Вместо try лучше подписаться на ошибку
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

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

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

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

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

Добавлено: 2011.09.14, 00:43
andrew911
Да, там асинхронная ошибка получается.

Флеш можно сделать прозрачным и поместить над кнопкой видимо (используя z-index или что-то типа, я в верстке не силен). А в чем проблема сделать флеш кнопку?

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

Добавлено: 2011.09.14, 17:17
RSol
Вот накопал на днях:

http://pixlr.com/

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