actionscript-3 - 如何将 BitmapData 保存到 Bitmap *.bmp 文件,或者更快的 JPE 编码方法

标签 actionscript-3 flash jpeg bitmapdata

我有一个基于 Flash/Actionscript 3 的桌面应用程序,使用 Zinc 4.0 封装在 *.exe 中。我使用的是 Flash Pro CS5。

我需要开始在本地保存非常大的图像文件。在通过 Zinc 将这些图像保存到本地文件之前,我对这些图像进行了 JPG 编码。我使用 This "asyncronous like" method 解决了 actionscirpt 超时问题。编码 1.5 MP 图像大约需要 5 秒,这还可以,但编码 8 MP 图像文件大约需要 40 秒,这是 Not Acceptable 。

我的一个想法是将 BitmapData 本地保存到临时位图文件 (*.bmp),而无需最终用户等待 Flash 中的 JPG 编码,然后使用我现有的图像处理器(用 C# 编写)读取位图文件并对其进行编码,而无需等待 Flash 执行此操作,从而有效地减轻了用户的负担。

我用过BitmapData.getPixels()尝试将字节数组直接写入文件,使用与我成功处理编码 JPG 相同的 Zinc 方法,但 *.bmp 文件不可读。除了 BitmapData getPixel() 的字节数组之外,是否还需要包含一些文件头才能成功保存位图图像?如果是这样,我如何在写入文件之前成功地将它们添加到字节数组中?

非常感谢任何指导、澄清或其他解决方案。

最佳答案

我已经找到了适合我的需求的解决方案,以防万一其他人有类似的需求:

要保存实际的位图 (*.bmp) 文件,工程师建议Btimap encoder class太棒了。实际编码速度非常快;然而,由于我在 Zinc 中的文件写入调用是同步的,并且位图文件比 JPG 大得多,它实际上只是将我的瓶颈从编码转移到文件保存,所以我决定寻找其他地方。如果 Zinc 有一个异步二进制文件写入方法,不会锁定 GUI,我会很高兴,但在那之前,这不是我的解决方案。

我偶然发现了 Flash Alchemy 解决方案,效果很好。现在只需要几秒钟,而不是等待大约 40 秒来编码 8 MP 图像。这就是我所做的:

  1. this page 下载 jpegencoder.swc并将其保存在我的项目目录中
  2. 添加了 swc:发布设置 > Flash(选项卡)> 脚本:Actionscript 3.0“设置...”按钮 > 库路径(选项卡)> 并添加了链接类型 =“合并到代码中”的 .swc
  3. 然后使用它:

(下面是我修改后的代码,仅包含基础知识)

import flash.utils.ByteArray;
import flash.display.BitmapData;
import cmodule.aircall.CLibInit; //Important: This namespace changed from previous versions

var byteArrayResults:ByteArray; //Holds the encoded byte array results

public static function startEncoding(bitmapData:BitmapData):void {

    var jpeginit:CLibInit = new CLibInit();     // get library
    var jpeglib:Object = jpeginit.init();       // initialize library exported class to an object

    var imageBA:ByteArray = bitmapData.getPixels(bitmapData.rect);  //Getpixels of bitmapData
    byteArrayResults = new ByteArray();
    imageBA.position = 0;
    jpeglib.encodeAsync(encodeComplete, imageBA, byteArrayResults, bitmapData.width, bitmapData.height, 80);
}

private static function encodeComplete(thing:*):void
{
    // Do stuff with byteArrayResults
}

您可能会发现此链接也很有用: http://last.instinct.se/graphics-and-effects/using-the-fast-asynchronous-alchemy-jpeg-encoder-in-flash/640

关于actionscript-3 - 如何将 BitmapData 保存到 Bitmap *.bmp 文件,或者更快的 JPE 编码方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999734/

相关文章:

javascript - 为什么 IE 拒绝在我的网站上呈现 swf?

python - 调整图像大小时解码器 JPEG 错误

flash - ActionScript 3 : How to get host name from URL?

apache-flex - 缺少 [mx.rpc]::IResponder

flash - 取消渲染影片剪辑帧会导致性能下降吗?

javascript - 如何预加载 .swf 文件并将其缓存以供将来的页面请求使用?

c - 具有 300x300 分辨率的 jpeg 到 bmp 输出失真的灰度图像

java - 如何使用 JAVA 将带有 alpha 的 PNG 转换为保留颜色的 JPEG

actionscript-3 - 从Flash导出动态音频

actionscript-3 - ActionScript 3's " move “关键字 : does it exist?