我有一个基于 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 图像。这就是我所做的:
- 从 this page 下载 jpegencoder.swc并将其保存在我的项目目录中
- 添加了 swc:发布设置 > Flash(选项卡)> 脚本:Actionscript 3.0“设置...”按钮 > 库路径(选项卡)> 并添加了链接类型 =“合并到代码中”的 .swc
- 然后使用它:
(下面是我修改后的代码,仅包含基础知识)
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/