Форум 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 15.12.2006 01:20

Изменение разрешения картинок
 
Вот такая штука: мне надо чтобы было возможно изменять разрешение картинки подгружаемой,условной весит она 100 мб,а надо чтобы можно было её загрузить весящей 10мб,изменив разрешение (например уменшив в 10 раз). Нужно это для панорамы,чтобы при увеличении панорамного снимка,увеличивалось и разрешение.

ALiEN_2OO6 15.12.2006 17:03

Подгрузка куда? На сервер с клиента, с сервера в клиент?

etc 15.12.2006 18:00

Читаем мануал к GD в php.

CorC 15.12.2006 18:40

создавай несколько фоток: маленькие иконки и описательные картины

Grrr13 18.12.2006 11:58

Фишка в том,что должна быть именнно одна фотка,разрешение которой мы меняем! Она лежит на сервере,а клиент сам выбирает с каким разрешением её подгружать

ALiEN_2OO6 18.12.2006 18:05

Есть классная идея. Если хранить фотку в формате с интерлейсом, то думаю, можно на AS 3.0 сделать то о чем ты говоришь.

Grrr13 19.12.2006 20:09

А как в АС3 это сделать,хоть думать в какую сторону?)

etc 19.12.2006 20:19

ByteArray, алгоритмы сжатия JPEG, PNG, GIF и проч.
Только зачем, если все-равно нужно будет грузить всю панораму и уменьшать.

ALiEN_2OO6 19.12.2006 21:55

Я немного не то хотел сказать. Идея следущая:

Берем фотку interlaced, и смотрим как она грузится.

Progressive and Interlace
An option for both GIF's and JPEG's is to have a rough picture download before the whole file comes across. This gives your audience something to look at while they're waiting. They don't load any faster than regular images, but at least the viewer can quickly get an idea of what's coming. GIFs can be interlaced, which means that every other line gets drawn before the browser fills in the missing lines. Progressive JPEGs serve a similar function.

Progressive нам не интересен, а вот Interlaced - грузит пикселы по очереди, с определенным шагом и сразу отображает.

Вот пример (интересует правая фотка): http://lab.orangeflash.eu/flex2/exam...alImageloader/

Теперь сама идея, т.к. загрузка идет с шагом в n пикселов, то соответственно после первой загрузки мы имеем фотку уменьшенную в n раз. После этого обрываем загрузку, и вуаля, у нас есть фотка с определенно меньшим размером чем на сервере.

Если идея понятна, и есть умения, то сделать можно.

Это тоже в помощь: http://blog.orangeflash.eu/?p=13

Grrr13 20.12.2006 01:49

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

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. Распарсить полученный байтовый массив.

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

ALiEN_2OO6 21.12.2006 16:00

Тема не актуальна?

etc 21.12.2006 16:17

Ну я же говорю — GD и Flash 8 всё ещё актуален.


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

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