【问题标题】:Screen capture (sorta) in FlashFlash 中的屏幕截图(排序)
【发布时间】:2011-04-03 15:12:55
【问题描述】:

我正在寻找一种方法来创建和显示多达 200 个舞台屏幕截图。目前,我将每个屏幕截图记录在 BitmapData 对象中,然后播放所有屏幕截图。这种方法有效,但它占用了太多内存 - 导致某些浏览器崩溃。

解决此问题的最佳方法是什么?我可以创建 .png、.flv 电影或以某种方式压缩 BitmapData 吗?

谢谢!

【问题讨论】:

  • 你拍摄的内容是什么?你不能用更“矢量”的模式轻松重建它吗?
  • 即使您可以将它们转换为 png,您仍然试图以非常大的内存占用来显示数据。也许一次只加载一些(分页),甚至重新考虑 Flash 是否是适合这项工作的工具......
  • 无法转换为矢量,但认为编译 FLV 可能是最佳选择。几个例子undefinedcreations.com/Blog/?p=9zeropointnine.com/blog/…

标签: flash actionscript


【解决方案1】:

解决方案不止一种,但您可以尝试其中一种(并结合使用):

  • 制作较低分辨率的屏幕截图(缩放,见下文)

  • 将您的 BitmapData 转换为 ByteArray(通过 BitmapData.getPixels())并调用 ByteArray.compress()(无损压缩)

  • 将图像压缩到JPEG ByteArray 并根据您将要执行的捕获次数、分辨率和可用内存空间定义质量比(我不确定您是否知道,这是最后一个)-我认为是一种更好的方法

  • 为第一个和其余部分制作完整尺寸,仅捕获更改和位置(查看 FlashPlayer 调试器功能“显示重绘区域”的工作原理)

  • 如果您使用 Air 应用程序,请将 BitmapData 保存在临时文件中

  • 如果可能,请用户为 LocalSharedObject 解锁大量空间并将数据写入其中

这里是使用比例进行捕获的示例代码(例如:100x200 DispObj -> 50x100 BitmapData)

var displayObject:DisplayObject;
var scale:Number = 0.5;
var bounds:Rectangle = displayObject.getBounds(displayObject);
var bitmapData:BitmapData = new BitmapData(uint((bounds.width + 0.5) * scale), uint((bounds.height + 0.5) * scale), true, 0);
bitmapData.draw(displayObject, new Matrix(scale, 0, 0, scale, -bounds.x * scale, -bounds.y * scale));

【讨论】:

  • 谢谢@mems!我会试试这个解决方案,让你知道它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多