【问题标题】:Is there a syncronous load bytes method yet for Flash or AIR?Flash 或 AIR 是否有同步加载字节方法?
【发布时间】:2023-04-07 08:07:02
【问题描述】:

在 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);

让我再说一遍,我正在寻找一个同步动作。它不能是异步的。我的问题是这是否可能。

【问题讨论】:

  • 你的意思是你必须在loader.loadBytes()完成后严格地继续你的代码执行?
  • 是的。我不能使用异步,因为它之后的代码直接依赖它。
  • 为什么不能异步?这很可疑——实际上 as3 中的所有内容都是异步的。
  • 我同意@Brian。对设备 RAM 中保存的字节进行异步解码有什么不好?尝试更好地解释你真正的问题 / 最终目标,否则你的担心会显得多余。
  • “我正在尝试加载一个字节数组并将其同步转换为位图数据” 那么您希望接收到的总字节数中的多少是可见的?例如:如果将 50% 的字节传递给loader.loadBytes(),它会生成一半图像?如果是,那么为什么要涉及 base64,因为这会迫使您正确解码完整的 base64 字节,然后才能从中提取 PNG 数据。解码前 10% 的 base64 不会给出前 10% 的 PNG 字节,因此您不能将这些解码后的字节传递给 loader 期待 10% 的图像....

标签: javascript actionscript-3 flash air


【解决方案1】:

正如reference 所说:

complete:Event — 在操作完成时由 contentLoaderInfo 对象调度。 complete 事件总是在 init 事件之后调度。

因此您可以执行来自 Event.COMPLETE 处理程序的依赖代码。

【讨论】:

  • 那个方法是异步的。我问的是同步。
【解决方案2】:

您正在寻找BitmapData.setPixels(),它是同步的。对于源字节数组中的像素,您需要 32 位未相乘的 ARGB 值。考虑从测试图像中打印BitmapData.getPixels() 以查看像素的存储方式。

将字节数组转换为像素数据的矩形区域。对于每个像素,调用 ByteArray.readUnsignedInt() 方法并将返回值写入像素。如果字节数组在整个矩形写入之前结束,则函数返回。字节数组中的数据预计为 32 位 ARGB 像素值。在读取像素之前或之后不对字节数组执行搜索。

更新: getBase64ImageDataString() 使用 BitmapData.encode()(适用于 flash player 11.3 及更高版本)或 mx.graphics.codec.PNGEncoder/JPEGEncoder 类(来自 Flex SDK)将您的图像转换为 PNG 或 JPG。然后它将生成的二进制数据编码为 base64。

您可以与BitmapData.setPixels() 同步使用的唯一格式是上面提到的一种:ARGB 像素的普通行,没有标题。不允许使用 PNG、JPG 或其他格式。

当您使用Loader.loadBytes() 时,它会完成所有繁重的工作,包括解码文件头、查找图像大小、颜色设置以及将数据转换为内部格式。如果您真的想将序列化的图像数据同步转换为 BitmapData,您将不得不手动完成所有这些操作。解码 base64 字符串,得到一个 ByteArray,然后使用第三方类将图像数据转换为 ActionScript 中的像素。至少可以说,这将是次优的性能。解码器是easily found on the net,但无论如何我认为这是个坏主意。

【讨论】:

  • 嗨@NoxNocts。我会看看我是否可以使这种方法起作用。我没有使用 setPixels() 对数据进行编码,而是编码为 base 64 字符串。我认为这种方法的问题是您必须设置 BitmapData 大小,并且以后无法更改大小。我有来自服务器的 base 64 位图数据,但 base 64 没有大小。
  • 在将图像数据序列化为 base 64 之前,您的服务器使用哪种格式进行编码?
  • 我正在用这个函数getBase64ImageDataString()github.com/monkeypunch3/flexcapacitor/blob/master/MainLibrary/…对数据进行编码。我可以在一行代码中轻松对其进行编码,但如果我想在下一行对其进行解码,我必须使用加载器并等待一帧?我需要在同一个代码块中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2010-12-24
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多