Как использовать 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;}
}
}
Я не проверял, работает ли это, поэтому может потребоваться немного возиться, но основная идея должна работать для вас. Существует несколько способов справиться с загрузкой условных цепочек, это простой пример.
Надеюсь, это поможет -