Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Изменение разрешения картинок (http://www.flasher.ru/forum/showthread.php?t=89411)

Grrr13 20.12.2006 01:51

etc как раз идея в том и заключается чтобы не грузить всю панораму целиком,а общий вид,меньшего разрешения чем оригинал

etc 20.12.2006 02:30

А я и говорю, что если этим занимается AS3, т.е. клиентская часть, то придёться грузить вообще всё.
Этим должна заниматься серверная часть. В простейшем случае php с GD библиотекой.

ALiEN_2OO6 20.12.2006 16:18

Цитата:

Сообщение от Grrr13
Идею понял,но это ведь изменяется не разрешение,а качество,т.е. это что-то типа компрессии (ну сжатия),а разве нет такой штуки в экшн скрипт как задание именно разрешения?! Может это вообще невозможно сделать....

Гхм... вчитайтесь в то что я написал. То что вы называете "компрессия" это и есть маленький оригинал, растянутый на большой размер. Т.е. делаем stream.close(); после загрузки первого уменьшеного оригинала. Если будет время, и это действительно необходимо - могу написать готовый класс.

ALiEN_2OO6 20.12.2006 16:20

Цитата:

Сообщение от __etc
А я и говорю, что если этим занимается AS3, т.е. клиентская часть, то придёться грузить вообще всё.
Этим должна заниматься серверная часть. В простейшем случае php с GD библиотекой.

Не обязательно грузить все, в этом и суть.

ALiEN_2OO6 20.12.2006 17:55

Вот на скорую руку накидал:

Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete = "initApp()">
<mx:Image x="10" y="10" width="711" height="606" id="myImage"/>

        <mx:Script>
        <![CDATA[

            public function initApp():void {
                   
                   
                    var a = new StreamLoader(new URLRequest('http://lab.orangeflash.eu/flex2/examples/partialImageloader/Image2.jpg'));
                          myImage.addChild(a);
                          //myImage.scaleX = 0.1;
                          //myImage.scaleY = 0.1;
                   
            }
           
        ]]>
    </mx:Script>

       
</mx:Application>

Код:

package
{
        import flash.display.Loader;
        import flash.events.*;
        import flash.net.*;
        import flash.utils.*;
        import flash.system.LoaderContext;
       
        [Event(name = "complete", type="flash.events.Event")]
        [Event(name = "progress", type="flash.events.ProgressEvent")]
        [Event(name = "open", type="flash.events.Event")]
        [Event(name = "ioError", type="flash.events.IOErrorEvent")]
       
        public class StreamLoader extends Loader
        {
                protected var stream:URLStream = new URLStream();
                protected var bytes:ByteArray = new ByteArray();
                protected var cont:LoaderContext;
               
                import mx.core.UIComponent
                /**
                * Constructor, creates new StreamLoader
                *
                */
                public function StreamLoader(request:URLRequest = null)
                {
                        if(request != null)
                        {
                                loadStream(request);
                        }
                }
                /**
                * Method, loads images as stream
                *
                * @param        request                URLRequest
                * @param        context                LoaderContext, default value is null
                */
                public function loadStream(request:URLRequest, context:LoaderContext = null):void
                {
                        cont = context;
                       
                        stream.load(request);
                       
                        stream.addEventListener(Event.COMPLETE,onStreamComplete);
                        stream.addEventListener(ProgressEvent.PROGRESS,onStreamProgress);
                        stream.addEventListener(Event.OPEN,onStreamOpen);
                        stream.addEventListener(IOErrorEvent.IO_ERROR,onStreamIOError);
                        stream.addEventListener(HTTPStatusEvent.HTTP_STATUS,onStreamHTTPStatus);
                        stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onStreamSecurityError);
                }
                /**
                * @private
                */
                private function onStreamComplete(event:Event):void
                {
                        updateBytes();
                        dispatchEvent(new Event(event.type, event.bubbles, event.cancelable));
                       
                        setTimeout(confirmBytesLoaded,1);                       
                }
                /**
                * @private
                */
                private function onStreamProgress(event:ProgressEvent):void
                {
                        updateBytes();
                        if(bytes.length > 20000)stream.close();
                        dispatchEvent(new ProgressEvent(event.type, event.bubbles,
                                                                                        event.cancelable, event.bytesLoaded,
                                                                                        event.bytesTotal));
                       
                }
                /**
                * @private
                */
                private function onStreamIOError(event:IOErrorEvent):void
                {
                        dispatchEvent(new IOErrorEvent(event.type, event.bubbles, event.cancelable, event.text));
                }
                /**
                * @private
                */
                private function onStreamSecurityError(event:SecurityErrorEvent):void
                {
                        dispatchEvent(new SecurityErrorEvent(event.type, event.bubbles, event.cancelable, event.text));
                }
                /**
                * @private
                */
                private function onStreamHTTPStatus(event:HTTPStatusEvent):void
                {
                        dispatchEvent(new HTTPStatusEvent(event.type, event.bubbles, event.cancelable, event.status));
                }
                /**
                * @private
                */
                private function onStreamOpen(event:Event):void
                {
                        dispatchEvent(new Event(event.type, event.bubbles, event.cancelable));
                }
                /**
                * @private
                */
                private function updateBytes():void
                {
                        stream.readBytes(bytes, bytes.length);
                        if(bytes.length > 0)
                        {
                                loadBytes(bytes,cont);
                        }
                }
                /**
                * @private
                *
                * Method confirms that all bytes loaded, and closes stream
                */
                private function confirmBytesLoaded():void
                {
                        updateBytes();
                        stream.close();
                }
               
        }
}

В данном примере, я просто обрубаю поток, по достижении 20000 загруженных байт. Т.к. Евент срабатывает с разной периодичностью, рекомендую потыкать F5 в примере, и посмотреть что именно загружается в myImage. Поставленная задача решена. Единственное конечно надо это до ума довести, например, что бы четко срабатывал евент на определенном этапе, а не так как сейчас.

ALiEN_2OO6 20.12.2006 17:55

P.S. пронаблюдать работу - можно так же сниффером.

etc 20.12.2006 18:10

Понятно, добавил одну строчку в класс Nirth-а :D
А то, что при этом нужно ещё ресайзить картинку до верных размеров, а?

ALiEN_2OO6 20.12.2006 18:13

Цитата:

Сообщение от __etc
Понятно, добавил одну строчку в класс Nirth-а :D
А то, что при этом нужно ещё ресайзить картинку до верных размеров, а?

Выше смотри в коде - там есть scaleX и scaleY. А вообще не это важно если честно, а то что можно загрузить картинку, без GD и PHP. в уменьшеном варианте. =)

P.S. на счет класса - выше есть линки, именно с ресурса Nirth-a так что думаю он не расстроится.

etc 20.12.2006 18:21

Зависимость scaleX, scaleY нелинейна от кол-ва байт. Вот с этим и будут проблемы. Вообще, лучше конечно заюзать GD и Flash 8, сейчас это актуальнее.

ALiEN_2OO6 20.12.2006 18:48

Если продолжить тему, то конечно ты прав - "лучше конечно заюзать GD и Flash 8", и scaleX scaleY тут не помогут.. Это только как пример.

Ну а вообще, конечно, если делать, то делать так:

1. Четко определять необходимый размер подгружаемых данных.
2. Вовремя, закрывать поток, по загрузке колличества байт из п.1
3. Распарсить полученный байтовый массив.

Пока не понятно как это сделать, если есть идеи, поделитесь. Если вообще тема актуальна. =)))


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

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