2011-02-03 175 views
1

我有一个非常复杂的Flash应用程序(想想Flash中的Photoshop)。检查BitmapData是否有效

有很多图像处理,并且除了一个bug之外,所有工作都很好。

该应用程序具有撤消/重做功能,有时会引发错误。有太多的代码粘贴在这里,但问题解决此行代码牯:

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

跟踪语句显示:

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循环得到所有属性的...没有前甚至出现错误出现。

任何建议将不胜感激。

谢谢!

+0

你尝试过使用尝试{...你的普通方法...} catch(error:ArgumentError){... alternative method ...}? – 2011-02-03 14:51:55

回答

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实例的所有引用,要它首先。

+0

优秀的提示!谢谢。 – drpelz 2012-02-22 22:44:56

0

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

我猜想问题的原因是内存不足。为每个撤销步骤保留完整的画布克隆的速度相当快。 Invalid BitmapData最常见的原因是尝试在任一方向创建大于2880像素的位图(fp9,fp10稍微高一些),但如果这种情况也发生在内存相关问题中,我不会感到惊讶。

0

你试过draw()还是copyPixels()而不是clone()?反正grapefrukt是正确的关于try

0

以防万一这可能是有用的:我已经看到了这个错误出现在明年情况: 使用字典,以保持弱引用BitmapData对象中使用(剖析 目的)。 然后,在某些时间点,访问该字典中这些BitmapData对象的width和heigth属性,以计算分配的BitmapData的总大小。与代码中的其他位置一样,bitmapData通过以下位置取消引用: bitmapData.dispose(); bitmapData = null;

在字典中,指针仍然可能没有被垃圾收集器删除。 访问处理位图数据似乎给出了所述的错误消息。