Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Потеря качества при загрузке изображения и его уменьшения (http://www.flasher.ru/forum/showthread.php?t=154087)

fish_r 14.04.2011 19:17

А событие Event.INIT слушаете? Вообще, swf слушают по INIT, потому, что это момент когда первый кадр загружен. Впрочем и комплете тоже должно быть. Попробуйте в файлах политик открыть полный доступ, то есть указать :
Код:

<allow-access-from domain="*"/>
чтобы убедиться в том, что проблема не в имени домена

если нужный файл, для загрузки, находится не в корне сайта crossdomain.xml поправьте:

Код:

<?xml version="1.0" encoding="utf-8" ?>
<cross-domain-policy>
        <site-control permitted-cross-domain-policies="all"/>
        <allow-access-from domain="www.mySite.com"/>
</cross-domain-policy>


Bgg 14.04.2011 19:21

Может так?
Код AS3:

loader.load(url, new LoaderContext(true));


FlashWizard 14.04.2011 19:43

Цитата:

loader.load(url, new LoaderContext(true));
Вот это сейчас попробую.

fish_r, всё это делал. Всё равно тормозит и не диспатчится.

Ещё один вопрос: Когда грузится второй раз - SWF берётся из кэша, что не очень хорошо. Не знаете как решить данную проблему?

fish_r 14.04.2011 20:15

Не уверен, что swf повторно берётся из кеша. Но чтобы избежать кеширования, обычно, немного видоизменяют запрос, например, добавляют случайные аргументы. Тогда точно не закешируется.

GBee 14.04.2011 20:15

Добавитьк урл рендомный параметр.

djyamato 15.04.2011 06:14

была же открывашка файлов в обход кроссдомена где-то на форуме, картинки грузятся откуда угодно, поищите на форуме, работает железно.
А про потерю качества при траннсформации картинки - всю плешь проел, так и не нашел решения может, плохо искал...
Можно попробовать фильтрами пикселбендера, но визуально потеря все равно есть

fish_r 15.04.2011 07:01

Картинки через Loader и так грузятся откуда угодно. Доступ к пикселям, только, через кроссдомен. Или нет?

djyamato 15.04.2011 07:24

ой, не получается вложить as файл
так напишу

Код AS3:

package{
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
        import flash.system.*;
        import flash.display.*;
        import flash.geom.Matrix;
        import flash.text.TextField;
 
        public class picLoaderNoCrossdomain extends MovieClip {
 
                private var ThisLoader;
                private var picPath:String;
                private var loader:Loader;
                private var req:URLRequest;
 
                private var par:*;
                private var DrawedBitmap:Bitmap;
                private var BD:BitmapData;
                private var BoundsObject:Object;
                private var Preloader:*;
                private var scaleMatrix:Matrix;
 
                private var BMP:Bitmap;
 
 
                public function picLoaderNoCrossdomain (path:String,main:*,bObject,preload:*) {
                        ThisLoader=this;
                        par=main;
                        picPath=path;
                        BoundsObject=bObject;
                        Preloader=preload;
                        loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPicLoaded);
                        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.handler_progress);
                        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
 
                        //trace("loader load "+picPath);
                        var lc:LoaderContext = new LoaderContext();
                        lc.checkPolicyFile = true;
                        loader.load(new URLRequest(picPath),lc);
                }
 
                public function loadPicture(path:String):void{
                        picPath=path;
 
                        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onPicLoaded);
                        loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, ThisLoader.handler_progress);
 
                        loader=null;
                        loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPicLoaded);
                        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, ThisLoader.handler_progress);
 
 
                        var lc:LoaderContext = new LoaderContext();
                        lc.checkPolicyFile = true;
 
                        req=new URLRequest(picPath);
                        loader.load(req,lc);
                }
 
                public function destroyLoad():void{
                        loader.unload();
                        try{
                                loader.close();
                        }catch(someError:Error){
                                trace("no need to close");
                        }
                        ThisLoader.loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onPicLoaded);
                        loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
                        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onPicLoaded);
                        loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, ThisLoader.handler_progress);
                }
 
                private function onPicLoaded (e:Event):void{
                        ThisLoader.loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onPicLoaded);
                        ThisLoader.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handler_complete);
                        this.loader.loadBytes(this.loader.contentLoaderInfo.bytes, new LoaderContext(false, ApplicationDomain.currentDomain));
                }
                private function handler_complete(event:Event):void {
                        //trace("PIC loaded "+BoundsObject);
                        var bitmap:BitmapData = new BitmapData(loader.width, loader.height, true);
                        bitmap.draw(loader);
                        DrawedBitmap = new Bitmap(bitmap);
                        if(Preloader!=null){
                                if(Preloader is TextField){
                                        Preloader.text="";
                                }
                        }
                        ThisLoader.loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, this.handler_complete);
                        if(BoundsObject!=null){
                                resizePicture();
                        }else{
                                par.dispatchEvent(new CustomEvent("fotoOpened",DrawedBitmap,null,null));
                        }
 
                }
                private function handler_progress(event:ProgressEvent):void{
 
                        if(Preloader!=null){
                                if(Preloader is TextField){
                                        Preloader.text=Math.round(event.bytesLoaded/event.bytesTotal*100)+"%";
                                }else{
 
                                }
                        }
                }
                private function errorHandler(event:IOErrorEvent):void{
                        //eventsReceiver.dispatchEvent(new CustomEvent("ioError",event.text,null,null));
                        trace("!!!!  IOErrorHandler "+event.text);
                        if(Preloader!=null){
                                if(Preloader is TextField){
                                        Preloader.text="";
                                }else{
 
                                }
                        }
                }
 
                private function resizePicture() {
                        var tmpBitmap:Bitmap=new Bitmap();
                        var CountedWidth:Number=DrawedBitmap.width;
                        var CountedHeight:Number=DrawedBitmap.height;
 
                        var ScaleRatio:Number=1;
 
 
                        var tmpMatrix:Matrix=new Matrix();// матрица ресайза по ширине
                        var ConcatMatrix=new Matrix(); // матрица ресайза по высоте (если понадобится)
 
                        if (DrawedBitmap.width>BoundsObject.w) {
                                ScaleRatio=DrawedBitmap.width/BoundsObject.w;
                                tmpMatrix.scale(1/ScaleRatio,1/ScaleRatio);
                                CountedWidth=Math.round(DrawedBitmap.width/ScaleRatio);
                                CountedHeight=Math.round(DrawedBitmap.height/ScaleRatio);
                        }
 
                        if (CountedHeight>BoundsObject.h) {
                                ScaleRatio=CountedHeight/BoundsObject.h;
                                CountedWidth=Math.round(CountedWidth/ScaleRatio);
                                CountedHeight=Math.round(CountedHeight/ScaleRatio);
                                ConcatMatrix.scale(1/ScaleRatio,1/ScaleRatio);
                        }
                        tmpMatrix.concat(ConcatMatrix);
                        var tmpBitmapData:BitmapData=new BitmapData(Math.round(CountedWidth),Math.round(CountedHeight),true,0xFF0000);
                        //var tmpBitmapData:BitmapData=new BitmapData(604,300,false,0xFF0000);
                        tmpBitmapData.draw(DrawedBitmap,tmpMatrix);
                        BMP=new Bitmap(tmpBitmapData);
                        trace("BMP w="+BMP.width+" h="+BMP.height);
                        BMP.smoothing=true;
                        /////////////////////////////////////////////////////////
                        par.dispatchEvent(new CustomEvent("fotoOpened",BMP,null,null));
 
                }
        }
}

Это я чуть переделал класс, для загрузки XML-я, кажется, выложенный на форуме (автора не помню, к сожалению) , картинки грузит откуда угодно и ресайзит
Чуши в нем много (моей), простите.

GBee 15.04.2011 08:14

Цитата:

была же открывашка файлов в обход кроссдомена где-то на форуме
http://www.flasher.ru/forum/showthread.php?p=800092

FlashWizard 15.04.2011 14:04

Ребята, вот эта штука реально помогла:
Код AS3:

loader.load(url, new LoaderContext(true));

И событие complete диспатчится и картинка не теряет качество.
Спасибо, всем. Проблема решена.


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

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