Как сглаживать динамически загружаемый PNG во Flash - PullRequest
1 голос
/ 22 октября 2010

У меня есть файл Flash, который я использую для загрузки в прозрачных PNG (штриховые рисунки), и использую Flash, чтобы позволить пользователю выбрать цвет рисунка и мгновенно изменить цвет.

Этовсе работает так, как должно быть.Я использую компонент UILoader для загрузки изображения, получаемого с помощью flashvars, а затем меняю цвет при необходимости.

Единственное, что изображение иногда выглядит не очень плавным.Я видел различные статьи, в которых люди говорят об использовании сглаживания = true в растровом изображении.Но я не уверен, где это установить или как это работает.

Я новичок в Flash и ActionScript, кто-нибудь может мне помочь?Ниже мой код (main.as).Я пропустил функции changeColor () и getFlashvars () и строки импорта.потому что я не думаю, что это уместно здесь, и чтобы все было как можно проще и короче.

Большое спасибо за любую помощь и / или указатель, который вы можете мне дать!

package  {
public class Main extends MovieClip {
    public function Main() {
        init();

        if(getFlashvars().img != undefined) {
            if(getFlashvars().clr != undefined) {
                loadImage(getFlashvars().img, getFlashvars().clr);
            } else {
                loadImage(getFlashvars().img);
            }
        } else {
            loadImage('example.png', 'FFFFFF');
        }
    }

    private function init() {
        ExternalInterface.addCallback('changeColor', this.changeColor);

        progressBar.visible = false;
        progressBar.mode = 'manual';
        progressBar.source = uiLoader;

        uiLoader.scaleContent = true;
        uiLoader.addEventListener(ProgressEvent.PROGRESS, eventImageProgress);
        uiLoader.addEventListener(Event.COMPLETE, eventImageLoaded);
    }

    /**
     * Load a new image from the given url. Replace the color in it with newColor
     */
    public function loadImage(url:String, newColor:String='') {
        //progressBar.visible = true;
        uiLoader.load(new URLRequest(url));

        if(newColor.length > 0) {
            changeColor(newColor);
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 22 октября 2010

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

myBitmap.smoothing = true;

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

var myBitmap:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true);
                      //where the last boolean represents the smoothing property

Вы также можете попробовать установить фильтр размытия света на экранном объекте, если считаете, что сглаживания недостаточно.

2 голосов
/ 26 февраля 2011

почти есть Ларс, решение

Bitmap(UILoaderTarget.content).smoothing = true;
0 голосов
/ 23 октября 2010

Но я не уверен, что установить это

Я бы сказал, что в простейшей форме вы можете установить сглаживание в true для загруженного изображения (растрового изображения) в вашем обработчике для Event.COMPLETE, так что eventImageLoaded в вашем случае.

Примерно так:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
loader.load(new URLRequest("http://www.google.com/images/logos/ps_logo.png"));

function imageLoaded(e:Event):void {
    e.target.content.smoothing = true;
    // Or Bitmap(e.target.content).smoothing = true; if you prefer.
}
0 голосов
/ 22 октября 2010

Если у вас возникли проблемы с этим кодом сглаживания, он работает только в том случае, если вы получаете изображение из того же домена или домена, который добавил вас в свой файл crossdomain.xml.

В вашем полном обработчике вы можете сделать что-то вроде этого

// First, you need to copy the loaded image.
var displayObject :DisplayObject = uiLoader.content;
var bitmapData    :BitmapData    = new BitmapData(displayObject.width, displayObject.height);
bitmapData.draw(displayObject);

// Then create a new image from the loaded image.
var bitmap :Bitmap = new Bitmap(bitmapData);
bitmap.smoothing = true; // This is what actually does the anti-aliasing.

addChild(bitmap);
0 голосов
/ 22 октября 2010

В Flex я создал новый компонент, который, если возможно, установил свойство сглаживания на его внутреннем растровом изображении.Нечто подобное может быть выполнимо во Flash.

public class SmoothImage extends Image
{

    override protected function updateDisplayList(w:Number, h:Number):void
    {
      super.updateDisplayList(w, h);
      if (content is Bitmap)
      {
        var bitmap : Bitmap = content as Bitmap;

        if (bitmap != null &&
            bitmap.smoothing == false)
        {
            bitmap.smoothing = true;
        }
      }
    }
}

Тогда вы можете использовать это как:

image = new SmoothImage();
image.source = url;

Может помочь!Основная идея заключается в том, чтобы получить доступ к самому компоненту растрового изображения, чтобы установить атрибут сглаживания, независимо от того, происходит ли это в вашем файле или в отдельном компоненте. Это то, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...