Как объединить два растровых изображения в одно растровое изображение и сохранить его на локальном диске - PullRequest
1 голос
/ 01 июня 2011

Я много искал, но у меня ничего не получается. Помощь кого-то очень ценится в этом отношении. Большое спасибо. Я новичок в AS3. Я использую FlashDevelop. Ниже приведен код, который я использовал,

пакет {

import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.utils.ByteArray;
import flash.net.FileReference;
import com.adobe.images.JPGEncoder;
import flash.geom.Rectangle;

public class Main extends Sprite 
{
    private var modelBmp : BitmapData;
    private var alphaBmp : BitmapData;
    private var destPoint : Point = new Point(0, 0);
    private var mask1:Loader = new Loader();
    private var mask2:Loader = new Loader();
    private var f:Bitmap;
    private var fileReference:FileReference = new FileReference();
    private var movie:MovieClip = new MovieClip();
    private var loadedimage:Bitmap;
    private var loadedimage1:Bitmap;
    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {

        if (loadAssets()) {
            trace('merge loaded');
        modelBmp = new BitmapData(loadedimage.width, loadedimage.height);
        modelBmp.draw(loadedimage);
        alphaBmp = new BitmapData(loadedimage1.width, loadedimage1.height);
        alphaBmp.draw(loadedimage1);

        var rect:Rectangle = new Rectangle(0, 0, 200, 200);
        var pt:Point = new Point(20, 20);
        var mult:uint = 0x80; // 50% 
        modelBmp.merge(alphaBmp, rect, pt, mult, mult, mult, mult);

        var bm1:Bitmap = new Bitmap(modelBmp);
        addChild(bm1);
        bm1.x = 400;
        var bm2:Bitmap = new Bitmap(alphaBmp);
        addChild(bm2);
        bm2.x = 200;}
                }

        private function loadAssets():void
        {
        mask2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete1);
        mask1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        mask2.load(new URLRequest("Photo.png"));
        mask1.load(new URLRequest("back.png"));
        trace('asset loaded');
        }

        private function loadComplete(event:Event):void 
        {
        loadedimage = Bitmap(mask1.content)
        var bitmap:BitmapData = new BitmapData(loadedimage.width, loadedimage.height, false, 0xffffffff);
        bitmap.draw(loadedimage, new Matrix())
        var image:Bitmap = new Bitmap(bitmap);
        //addChild(image);
        trace('image1 loaded');
        }

        private function loadComplete1(event:Event):void 
        {
        loadedimage1 = Bitmap(mask2.content)
        var bitmap:BitmapData = new BitmapData(loadedimage1.width, loadedimage1.height, false, 0xffffffff);
        bitmap.draw(loadedimage1, new Matrix())
        var image:Bitmap = new Bitmap(bitmap);
        //addChild(image);
        trace('image2 loaded');
        }

}

}

Ответы [ 2 ]

5 голосов
/ 01 июня 2011

Как использовать Bitmap.merge ():

var bitMapData1:BitmapData = new BitmapData(100,100); //or embedded item
var bitMapData2:BitmapData = new BitmapData(100,100); // "

var bitmap:Bitmap = new Bitmap(bitMapData1);
this.addChild(bitmap);

bitmap.merge(bitMapData2, new Rectangle(0, 0, 100, 100), new Point(0, 0), 128, 128, 128, 128);

Как отмечали другие, Flash запрещается создавать, изменять, изменять, сохранять или иным образом манипулировать файлами. Есть несколько способов вытащить эти данные из флэш-памяти и использовать технологию, обладающую такими возможностями (например, PHP), или вы можете использовать пакет flash.filesystem в Air (как уже отмечалось).

Надеюсь, это поможет =

= обновление =

Ваш код проблематичен тем, что вы пишете свой urlRequest, а затем воздействуете на загруженный контент в одной функции. Запрос URL просто не успел сработать, а остальные функции не выполняются, потому что Mask2.content == undefined or null ... Я удивлен, что не выдает ошибку.

Кроме этого, похоже, что оно должно работать.

Попробуйте это:

private var _mask1:Loader; // _lowerCase naming convention

//constructor... call init()
//init.. call loadAssets()

private function loadAssets():void
{
_mask1 = new Loader(); //generally not a good idea to create objects when declaring variable
    _mask1.addEventListener(Event.COMPLETE, onCompleteFunction);
    _mask1.load(new URLRequest("Dress04.png"));

    private function onCompleteFunction(e:Event):void
    { ...

Обратите внимание, что, поскольку вы выполняете несколько загрузок, вам нужно проверить, загружены ли оба, прежде чем действовать на загруженный контент. Вы можете сделать это с помощью простой логической проверки или ... как угодно. Вы также можете проверить что-то вроде LoaderMax, в котором встроена очередность загрузки.

Обратите внимание, что для правильной загрузки ресурсов обычно используется оператор try ... catch и обработка нескольких событий - например, IOErrorEvent.IO_ERROR.

= обновление 2 =

Хорошо - сейчас мы только начинаем программировать логику.

Это проблема:

 private function init(e:Event = null):void 
        {

            if (loadAssets()) {
                trace('merge loaded');
//...
//...
 private function loadAssets():void
        {...

По сути, вы просите loadAssets () вернуть значение, но его тип возвращаемого значения - void, и, таким образом, он потерпит неудачу. Кроме того, loadAssets () только запускает загрузчик, а не отслеживает, была ли загрузка успешной.

Позволяет разбить его на несколько шагов и настроить очень простую очередь загрузки:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;

    public class Main extends Sprite 
    {
        private var modelBmp    : BitmapData;
        private var alphaBmp    : BitmapData;
        private var destPoint   : Point;
        private var mask        : Loader;
        private var f           : Bitmap;
        private var movie       : MovieClip;
        private var loadedImages: Array;
        private var imageQueue      : Array;

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

        //initialize variables
        private function init(e:Event = null):void 
        {
            //just set up a simple queue of images to load
            imageQueue      = ['Photo.png', 'back.png'];
            loadedImages    = [];

            destPoint       = new Point(0, 0);
            mask            = new Loader();
            movie           = new MovieClip();

            loadAsset( imageQueue[0] );
        }

        private function loadAsset(target:String):void
        {
            mask.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);  
            mask.load(new URLRequest(target));
        }

        private function loadComplete(event:Event):void 
        {
            loadedimage = Bitmap(mask.content);

            var bitmap:BitmapData = new BitmapData(loadedimage.width, loadedimage.height, false, 0xffffffff);
            bitmap.draw(loadedimage, new Matrix())
            var image:Bitmap = new Bitmap(bitmap);
            loadedImages.push(image);
            mask.unload();

            trace(imageQueue[0] + " loaded");
            imageQueue.splice( 0, 1); //remove the first index

            if (imageQueue.length > 0){
                loadAsset(imageQueue[0]);
            }else{
                mergeImages(); //if the queue is empty, then merge
            }
        }

        private function mergeImages():void
        {
            modelBmp = new BitmapData(Bitmap(loadedImages[0]).width, Bitmap(loadedImages[0]).height);
            modelBmp.draw(loadedimage);
            alphaBmp = new BitmapData(Bitmap(loadedImages[1]).width, Bitmap(loadedImages[1]).height);
            alphaBmp.draw(loadedimage1);

            var rect:Rectangle = new Rectangle(0, 0, 200, 200);
            var pt:Point = new Point(20, 20);
            var mult:uint = 0x80; // 50% 
            modelBmp.merge(alphaBmp, rect, pt, mult, mult, mult, mult);

            var bm1:Bitmap = new Bitmap(load);
            addChild(bm1);
            bm1.x = 400;
            var bm2:Bitmap = new Bitmap(alphaBmp);
            addChild(bm2);
            bm2.x = 200;}

        }

    }

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

Надеюсь, это поможет -

0 голосов
/ 01 июня 2011

Это может показаться немного странным, но вы можете использовать метод merge () класса BitmapData , чтобы объединить два растровых изображения в одно.В этих ссылках есть пример использования метода merge ().

Что касается сохранения на локальный диск, Flash Player разрешает доступ к файловой системе, используя класс FileReference .Класс FileReference имеет метод save () , который предлагает пользователю найти местоположение в своей файловой системе.

Для приложений Air вы можете получить доступ к файловой системе с помощью классовв пакете flash.filesystem .

...