Форум 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=142416)

Dr_Bra 20.07.2010 18:56

програмное сглаживаение растрового изображения
 
Добрый день, друзья!
Я сделал пример, в котором гружу из библиотеки 2 иконки, к которым прям в библиотеке и применил сглаживание. А третью иконку грузим лоадером, задаем ей параметры сглаживания, но увы ничего не получается. При движении одна иконка по прежнему "трясется" . Кому интересно, выкладываю исходник.
вот такой код:
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private static const SPEED_X:Number=30;
                private static const SPEED_Y:Number=60;
                private var _w:Number;
                private var _l1xpos:Number;
                private var _layer1;
                private var _stage;
                private var _p2;
                private var _p3;
                private var _sprite:Sprite;
                private var _iconLoader:Loader;
                private var _bitmap:Bitmap;
 
                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);
 
                        _stage = stage;
                        _w=_stage.stageWidth;
 
                        _layer1=new Full_tree();
                        _stage.addChild(_layer1);
                        _layer1.x=stage.stageWidth/2;
                        _layer1.y=stage.stageHeight;
 
                        startMove();// начинаем движение объектов
 
                        _sprite=new Sprite();
                        _layer1.i1.iIn.addChild(_sprite);
                        _iconLoader=new Loader();
                        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
                        _iconLoader.load(new URLRequest("persons/1/icon.jpg"));
 
                        _p2=new P2();
                        _layer1.i2.iIn.addChild(_p2);
 
                        _p3=new P3();
                        _layer1.i3.iIn.addChild(_p3);
                }       
                private function theSmoothing(evt:Event):void
                        {
                                _bitmap = Bitmap(_iconLoader.content);
                                _bitmap.smoothing = true;
                                _sprite.addChild(_bitmap);
                        }
 
                private function startMove():void
                {
                        _stage.addEventListener(Event.ENTER_FRAME, checkMouse);
                }               
                private function checkMouse(evt:Event):void
                {
                        _l1xpos = _w/2-(_stage.mouseX-_w/2);
                        _layer1.x +=(_l1xpos-_layer1.x)/SPEED_X;
                }
        }
}

Подскажите, в чем дело?

hartman 20.07.2010 19:56

Интересно. Даже так не работает:
Код AS3:

                private function theSmoothing(evt:Event):void {
                        _bitmap = Bitmap(_iconLoader.content);
                        var bData:BitmapData = new BitmapData(100,100);
                        bData.draw(_bitmap);
                        var bitmap:Bitmap = new Bitmap(bData, "never", true);
                        _sprite.addChild(bitmap);
                        addEventListener(Event.ENTER_FRAME, checkMouse);
                }

Может поможет фильтрами воспользоваться.

Этот smoothing только для изменения размеров годится, но не для анимации.

gloomyBrain 20.07.2010 21:31

Попробуйте с pixelSnapping = PixelSnapping.NEVER. А вдруг =)

Mur4ik 20.07.2010 22:10

вот так правильнее
Код AS3:

                private function theSmoothing(evt:Event):void
                {
                        _bitmap = _iconLoader.content as Bitmap;
                        _sprite.graphics.beginBitmapFill(_bitmap.bitmapData, null, false, true);
                        _sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
                        _sprite.graphics.endFill();
                }


hartman 21.07.2010 03:24

pixelSnapping я пробовал выше: new Bitmap(bData, "never", true);
А вот способ, который предложил Mur4ik, действительно работает. Как и обещано в описании метода beginBitmapFill:
smooth:Boolean (default = false) — If false, upscaled bitmap images are rendered by using a nearest-neighbor algorithm and look pixelated. If true, upscaled bitmap images are rendered by using a bilinear algorithm. Rendering by using the nearest neighbor algorithm is usually faster.
smoothing помогает только при масштабировании битмапа.

Dr_Bra 21.07.2010 11:16

Спасибо, очень помогли!
Только появилась другая проблема, первые иконки не загружаются, а загружается только самая последняя
Код AS3:

_sprite=new Sprite();
                        _layer1.i1.iIn.addChild(_sprite);
                        _iconLoader=new Loader();
                        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
                        _iconLoader.load(new URLRequest("persons/1/icon.jpg"));
 
                        _sprite=new Sprite();
                        _layer1.i2.iIn.addChild(_sprite);
                        _iconLoader=new Loader();
                        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
                        _iconLoader.load(new URLRequest("persons/2/icon.jpg"));
 
                        _sprite=new Sprite();
                        _layer1.i3.iIn.addChild(_sprite);
                        _iconLoader=new Loader();
                        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
                        _iconLoader.load(new URLRequest("persons/3/icon.jpg"));

как можно поправить код, что бы загружались все иконки в свои контейнеры?

Добавлено через 41 минуту
неужели на каждую иконку необходимо создавать индивидуальный Loader и Bitmap?
Код AS3:

_sprite=new Sprite();
                        _layer1.i1.iIn.addChild(_sprite);
                        _iconLoader=new Loader();
                        _iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing);
                        _iconLoader.load(new URLRequest("persons/1/icon.jpg"));
                        function theSmoothing(evt:Event):void
                        {
                                var _bitmap:Bitmap = new Bitmap();
                                _bitmap = _iconLoader.content as Bitmap;
                                _sprite.graphics.beginBitmapFill(_bitmap.bitmapData, null, false, true);
                                _sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
                                _sprite.graphics.endFill();
                        }
 
                        var _sprite2=new Sprite();
                        _layer1.i2.iIn.addChild(_sprite2);
                        var _iconLoader2=new Loader();
                        _iconLoader2.contentLoaderInfo.addEventListener(Event.COMPLETE, theSmoothing2);
                        _iconLoader2.load(new URLRequest("persons/2/icon.jpg"));
                        function theSmoothing2(evt:Event):void
                        {
                                var _bitmap2:Bitmap = new Bitmap();
                                _bitmap2 = _iconLoader2.content as Bitmap;
                                _sprite2.graphics.beginBitmapFill(_bitmap2.bitmapData, null, false, true);
                                _sprite2.graphics.drawRect(0, 0, _bitmap2.width, _bitmap2.height);
                                _sprite2.graphics.endFill();
                        }

если иконок будет 150 ) код получится километровый..

Mur4ik 21.07.2010 13:49

Цитата:

Сообщение от Dr_Bra (Сообщение 923820)
если иконок будет 150 ) код получится километровый..

используйте один Loader и один Bitmap и один обработчик окончания загрузки
Код AS3:

                private function theSmoothing(evt:Event):void
                {
                        _bitmap = evt.currentTarget.loader.content as Bitmap;
                        _sprite.graphics.beginBitmapFill(_bitmap.bitmapData.clone(), null, false, true);
                        _sprite.graphics.drawRect(0, 0, _bitmap.width, _bitmap.height);
                        _sprite.graphics.endFill();
 
                        _bitmap.bitmapData.dispose();
                        _bitmap = null;
                }


Dr_Bra 21.07.2010 14:00

тогда подгружается самая последняя картинка

Mur4ik 21.07.2010 14:38

Цитата:

Сообщение от Dr_Bra (Сообщение 923846)
тогда подгружается самая последняя картинка

Грузите следующую после загрузки предыдущей, т.е. в том же theSmoothing запускайте загрузку следующей иконки. Или создавайте кучу лоадеров и всего одного обработчика theSmoothing последнего варианта для них будет достаточно.

Dr_Bra 29.07.2010 20:54

а если картинка не загружается с сервера, загружается из библиотеки? Вот например:
Код AS3:

_stars=new Stars();
                        _stage.addChild(_stars);
                        _stars.x=_w/2;
                        _stars.y=300;
                        _stars.contentLoaderInfo.addEventListener(Event.COMPLETE, theStars);
                        function theStars(evt:Event):void
                        {                       
                                var _bitmapStars:Bitmap=new Bitmap();
                                _bitmapStars=_stars.content as Bitmap;
                                _stars.graphics.beginBitmapFill(_bitmapStars.bitmapData, null, false, true);
                                _stars.graphics.drawRect(0, 0, _bitmapStars.width, _bitmapStars.height);
                                _stars.graphics.endFill();
                        }

только так ничего не работает (( а я хотел получить такой же эффект "сглаживания", подскажите как быть в таком случае??


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

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