AS 3 |Клонирование Png данных изображения - PullRequest
1 голос
/ 08 августа 2011

Мне нужно клонировать .png данные изображения, загруженные с сервера в AS3, чтобы мне не приходилось загружать одни и те же данные снова и снова с сервера.

После поиска по клонированию данных изображения в AS3 мне удалось найти следующий код через Интернет

clone = new Bitmap(Bitmap(this._loader.content).bitmapData.clone() )

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

Любая помощь будет оценена.


Привет, Лоран и TheDarkIn1978, Большое спасибо за быстрый возврат и ваши ценные предложения,

Позвольте мне представить вам полную картину, ребята,

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

Для отображения данных изображения я создал мувиклип, в котором непосредственно добавляю загруженный контент в качестве его дочернего элемента, вызывая функцию addChild ().

Теперь проблема возникает, когда я пытаюсь добавить те же данные изображения в другой мувиклип, что и его chil, устанавливается новый родительский элемент данных и это изображение удаляется из ранее добавленного контента. Таким образом, в конце этот значок отображается только в одной позиции мувиклипа. (из-за того, что у каждого ребенка может быть один родитель).

Поэтому я подумал клонировать данные изображения и отобразить их на экране, Когда изображение загружается с сервера, я вызываю следующую функцию, чтобы сохранить данные изображения в локальном режиме,

   private var _bmapData : BitmapData;
    _bmapData = new BitmapData(_loader.width, _loader.height );
    _bmapData.draw( this );
    isImageLoaded=true;'

Теперь, где бы я ни показывал эти данные, я использую следующий код для клонирования данных PNG

var dup : Image = new Image();
 dup.addChild(new Bitmap(_bmapData.clone()));
 return dup;

То, что я считаю транспарини, поддерживается только в формате png, а не в растровом или jpeg, поэтому мои значки фона становятся белыми.

Пожалуйста, помогите, потому что я застрял и не могу понять мои следующие шаги.

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Код, который вы разместили, должен также копировать альфа-канал.Как вы отображаете растровое изображение?

Редактировать: Я думаю, что должны быть некоторые другие проблемы с вашим кодом или способом отображения BitmapData.Я только что попробовал следующее, и он отлично работает:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener("complete", function(event) {
    // Cache the bitmap data
    var bmpData = event.currentTarget.content.bitmapData.clone();
    // Create a new Bitmap and display the bitmap data
    var bmp = new Bitmap(bmpData);
    addChild(bmp); // The PNG is displayed with transparency
});
loader.load(new URLRequest("http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png"));

Может быть, попытаться изменить ваш код так, чтобы он работал как в этом примере?

1 голос
/ 08 августа 2011

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

private var _bmapData : BitmapData;
_bmapData = new BitmapData(_loader.width, _loader.height, true, 0);
_bmapData.draw( this );

Обратите внимание на true, 0, который я добавил. true устанавливает для прозрачности значение true, а 0 говорит, что Flash не должен добавлять цвет фона.

Редактировать Поскольку это вызвало некоторые споры, я подробно остановлюсь на том, почему это необходимо (и почему некоторые из моих комментариев были немного неправильными).

Сначала вот документация для конструктора BitmapData . Если вы захотите прочитать это, то остальная часть этого ответа будет бессмысленной, потому что по большей части я просто повторю это.

Итак, конструктор BitmapData принимает 4 параметра: ширину, высоту, прозрачность и цвет фона. Давайте проигнорируем ширину и высоту и перейдем прямо к прозрачности, которая по умолчанию установлена ​​в true. Уловка в том, что для того, чтобы объект BitmapData действительно реализовал прозрачный фон, его цвет фона должен быть установлен на черный.

transparent: Boolean (по умолчанию = true) - указывает, поддерживает ли растровое изображение прозрачность для каждого пикселя. Значением по умолчанию является true (прозрачный). Чтобы создать полностью прозрачное растровое изображение, задайте для параметра прозрачного параметра значение true, а для параметра fillColor - 0x00000000 (или 0).

Удивительно, но хотя BitmapData по умолчанию установлен прозрачным, цвет фона по умолчанию равен 0xFFFFFFFF, что предотвращает какой-либо эффект прозрачного флага. Это означает, что для того, чтобы правильно создать прозрачный фон для объекта BitmapData, вы должны объявить чисто черный цвет фона.

Наконец, если вам все еще нужны доказательства, запустите это и наслаждайтесь:

package {

    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;

    public class Main extends MovieClip
    {
        private var bg          :Shape;

        private var bitmap1     :Bitmap;
        private var bitmap2     :Bitmap;

        public function Main():void
        {
            stage ? init() : addEventListener(Event.ADDED_TO_STAGE,init);
        }

        private function init(event:Event = null):void
        {
            if(event) removeEventListener(Event.ADDED_TO_STAGE,init);

            drawBackground();
            drawBitmaps();
        }

        private function drawBackground():void
        {
            //create a light colored background
            bg = addChild(new Shape()) as Shape;
            bg.graphics.beginFill(0xD0D0D0);
            bg.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
            bg.graphics.endFill();
        }

        private function drawBitmaps():void
        {
            //create a bitmap in the documented fashion
            var bmd1:BitmapData = new BitmapData(200,200,true);
            bitmap1 = addChild(new Bitmap(bmd1)) as Bitmap;
            //this time, give a background color
            var bmd2:BitmapData = new BitmapData(200,200,true,0x000000);
            bitmap2 = addChild(new Bitmap(bmd2)) as Bitmap;
            bitmap2.x = 200;
        }
    }
}
1 голос
/ 08 августа 2011

в качестве альтернативы, вы можете кэшировать загруженное растровое изображение в статический объект.поэтому вместо повторной загрузки одних и тех же данных этот подход позволяет проверить, была ли ранее загружена битовая карта, и будет просто извлекать кэшированную битовую карту на основе URL-адреса данных (например) вместо перезагрузки битовой карты.

public static var cachedImages:Object = new Object();

...

private function checkCache(imageURL:String):void
{
     if (cachedImages[imageURL])
        showImage(cachedImages[imageURL]);
        else
        loadImage(imageURL);

}

...

private function loadImageCompleteHandler(evt:Event):void
{
    cachedImages[imageURLProperty] = evt.currentTarget.content;
}
...