检查BitmapData是否有效

时间:2011-02-03 14:43:37

标签: flash actionscript-3

我有一个非常复杂的Flash应用程序(想想Flash中的Photoshop)。

有很多图像处理,除了一个bug外,一切都运行良好。

应用程序具有撤消/重做功能,有时会抛出错误。这里有太多的代码要粘贴,但问题围绕着这行代码:

trace("UNDO BMD: " + BeautyGlobal.undoArray[_undoSteps].bitmapData);
var newUndoData:BitmapData = BeautyGlobal.undoArray[_undoSteps].bitmapData.clone()

trace语句显示:

UNDO BMD: [object BitmapData]
ArgumentError: Error #2015: Invalid BitmapData.
    at flash.display::BitmapData/clone()
    at Main/undoAction()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at com.beautyCanvas.ui::Toolbar/undoClick()

那里有bitmapdata,但它无效。此问题并非始终预设。如果我能检测到位图数据是否有效,我可以阻止它崩溃整个应用程序。我尝试了一些事情:

  • 检查BM数据的高度(崩溃应用程序时出现相同的错误)
  • 循环通过BMD获取所有属性......即使在错误出现之前也没有任何内容出现。

任何建议都将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

这很可能是因为您的应用程序使用了太多内存并且达到了极限。检查Flash Player的内存使用情况。

捕获和处理此错误的一种方法是简单地使用try..catch块:

try {
  var newBitmapData:BitmapData = oldBitmapData.clone();
} catch (e:Error) {
  if (e.errorID == 2015) {
    // handle it
  } else {
    throw e;
  }
}

如果你一直遇到这个错误,并且可以确认确实存在与内存使用量增加的关联,那么你首先想要做的就是确保你正确处理任何丢弃的BitmapData个对象:

// dispose first
myBitmapData.dispose();

myBitmapData = null;

在丢失对BitmapData实例的所有引用之前,您需要先dispose()它。

答案 1 :(得分:0)

使用try {} catch (e:Error){}包装您的克隆代码似乎会阻止您对应用程序进行崩溃。

我猜这个问题的原因是内存不足。为每个撤消步骤保持画布的完整克隆变得相当昂贵。 Invalid BitmapData最常见的原因是尝试在任一方向上创建大于2880px的位图(fp9,fp10稍微高一点),但如果在内存相关问题中也会出现这种情况,我也不会感到惊讶。

答案 2 :(得分:0)

您是尝试draw()还是copyPixels()而不是clone()?无论如何,grapefrukt对于try区块是正确的

答案 3 :(得分:0)

以防这可能会有所帮助:我在下一种情况下看到了这个错误: 使用字典来保持对正在使用的BitmapData对象的弱引用(用于分析 目的)。 然后,在某些时间点,访问该字典中这些BitmapData对象的width和heigth属性,以计算分配的BitmapData的总大小。

与代码中的其他地方一样,bitmapData通过以下方式解除引用: bitmapData.dispose(); 位图数据= NULL;

在字典中,垃圾收集器可能还没有删除指针。 访问处理的bitmapData似乎给出了上述错误消息。