我在flash中生成一个带有两个jpeg的透明位图。一个是黑白用于读取BitmapDataChannel,另一个是实际图像。
这是我的代码:
private var sourceBitmap:BitmapData;
private var alphaBitmap:BitmapData;
private var outputBitmap:BitmapData;
private var bitmap:Bitmap;
//Updated Code:
private var sourceByteArray:ByteArray = new ByteArray(), outputByteArray:ByteArray = new ByteArray(), alphaByteArray:ByteArray = new ByteArray();
private var jpegencoderoptions = new JPEGEncoderOptions(0);
//get image from library
this.sourceBitmap = new imageFromLibrary();
//Updated: encode sourceBitmap
this.sourceBitmap.encode(this.sourceBitmap.rect, jpegencoderoptions, this.sourceByteArray);
//create new bitmapData with dimensions of sourcimage.
this.outputBitmap = new BitmapData(this.sourceBitmap.width, this.sourceBitmap.height, true, 0x00000000);
//Updated: encode outputBitmap
this.outputBitmap.encode(this.outputBitmap.rect, jpegencoderoptions, this.outputByteArray);
this.outputBitmap.lock();
//copy the pixels from source to output
this.outputBitmap.copyPixels(this.sourceBitmap, this.sourceBitmap.rect, new Point());
//free memory and dispose source
this.sourceBitmap.dispose();
//Updated: clear sourceByteArray
this.sourceByteArray.clear();
//get alphamap from library
this.alphaBitmap = new alphamapFromLibrary();
//Updated: encode alphaBitmap
this.alphaBitmap.encode(this.alphaBitmap.rect, jpegencoderoptions, this.alphaByteArray);
//copy the channel from alpha to output
this.outputBitmap.copyChannel(this.alphaBitmap, this.alphaBitmap.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
//free memory and dispose alpha
this.alphaBitmap.dispose();
//Updated: clear alphaByteArray
this.alphaByteArray.clear();
this.bitmap = new Bitmap(this.outputBitmap);
代码效果很好,它为我生成一个透明的图像。但我现在的问题是RAM负载很重。在较旧的智能手机上,它超过了RAM并且游戏正在关闭。
主要问题是: 我加载了sourceBitmap,这需要RAM,然后生成新的BitmapData“outputBitmap”。有了这个,我在RAM中有两次相同尺寸的BitmapData。
我现在的问题是:我可以跳过一些步骤并加载我的sourceBitmap,将transparent设置为true并将通道复制到此源而不是加载源,创建输出等等吗?
修改
我现在用BitmapData.encode()
更新了我的代码,将我的BitmapDatas编码为JPEG。但内存使用并不总是有变化。有时,编码后内存使用量会增加,有时会减少,有时候也没有变化。