Flash Player或AIR中是否还有同步 loadBytes()方法?
更多信息:
我正在尝试加载一个字节数组并将其同步转换为位图数据(非异步)。它不能是异步的。 PNG被编码为base64数据。
现在我将从base64解码为字节数组,然后尝试将该字节数组解码为位图数据。没有加载器就无法从字节数组转到位图数据,loader.loadBytes()
是异步的。
我想我可以将字节数组传递给JavaScript,如果有一个类,但这是最后的手段。
仅供参考我正在运行AIR 23.
看起来有一个同步解码提到here,但它似乎不起作用。好吧,似乎我仍然需要添加事件监听器并等待一个框架:
让我再说一遍,它不能是异步的。我的问题是,如果可能的话。
这是我编码数据的示例代码。我正在使用此call:
var base64ImageData:String = DisplayObjectUtils.getBase64ImageDataString(displayObject, DisplayObjectUtils.PNG, null, true);
我想在下一行解码它,但loadBytes()
似乎不允许这样做。我正在使用此call:
var bitmapData:BitmapData = DisplayObjectUtils.getBitmapDataFromBase64(bitmapDataString);
让我再说一遍,我正在寻找同步行动。它不能是异步的。我的问题是,如果可能的话。
答案 0 :(得分:0)
正如reference所说:
complete:Event - 在操作完成时由contentLoaderInfo对象调度。始终在init事件之后调度complete事件。
因此,您可以执行Event.COMPLETE
处理程序中的依赖代码。
答案 1 :(得分:0)
您正在寻找同步的BitmapData.setPixels()。对于源字节数组中的像素,您需要32位未经过相乘的ARGB值。考虑从测试图像打印BitmapData.getPixels()以查看应存储像素的方式。
将字节数组转换为像素数据的矩形区域。对于每个像素,调用ByteArray.readUnsignedInt()方法并将返回值写入像素。如果字节数组在写入完整矩形之前结束,则函数返回。字节数组中的数据预计为32位ARGB像素值。在读取像素之前或之后,不对字节阵列执行搜索。
更新: getBase64ImageDataString()
使用BitmapData.encode()
(适用于Flash播放器11.3及更高版本)或mx.graphics.codec.PNGEncoder/JPEGEncoder
课程(来自Flex)将您的图片转换为PNG或JPG SDK)。然后它将生成的二进制数据编码为base64。
您可以与BitmapData.setPixels()
同步使用的唯一格式是上面提到的格式:没有标题的纯行ARGB像素行。不允许使用PNG,JPG或其他格式。
当您使用Loader.loadBytes()
时,它会完成所有繁重工作,解码文件标题,查找图像大小,颜色设置以及将数据转换为内部格式。如果您确实想要将序列化图像数据同步转换为BitmapData,则必须手动完成所有操作。解码base64字符串,获取ByteArray,然后使用第三方类将图像数据转换为ActionScript中的像素。至少可以说,这在绩效方面是次优的。解码器是easily found on the net,但无论如何我都认为这是一个坏主意。