首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查BitmapData是否有效

检查BitmapData是否有效
EN

Stack Overflow用户
提问于 2011-02-03 14:43:37
回答 4查看 2.3K关注 0票数 1

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

有很多图像处理,除了一个错误之外,所有的操作都很好。

应用程序具有撤消/重做功能,有时会引发错误。这里有太多的代码无法粘贴,但问题主要围绕在这一行代码上:

代码语言:javascript
运行
复制
trace("UNDO BMD: " + BeautyGlobal.undoArray[_undoSteps].bitmapData);
var newUndoData:BitmapData = BeautyGlobal.undoArray[_undoSteps].bitmapData.clone()

跟踪语句显示:

代码语言:javascript
运行
复制
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()

所以那里有位映射数据,但是它是无效的。这个问题本身并不总是预设的。如果我能够检测到位图数据是否有效,我可以阻止它破坏整个应用程序。我试过几件事:

  • 检查BM数据的高度(以相同的错误崩溃应用程序)
  • 循环通过BMD获得所有属性.即使在错误出现之前,任何事情都不会出现。

如有任何建议,将不胜感激。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-03 16:14:20

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

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

代码语言:javascript
运行
复制
try {
  var newBitmapData:BitmapData = oldBitmapData.clone();
} catch (e:Error) {
  if (e.errorID == 2015) {
    // handle it
  } else {
    throw e;
  }
}

如果您一直遇到此错误,并且能够确认内存使用量的增加确实存在相关性,那么您首先要做的一件事是确保正确地处理任何丢弃的BitmapData对象:

代码语言:javascript
运行
复制
// dispose first
myBitmapData.dispose();

myBitmapData = null;

在丢失对BitmapData实例的所有引用之前,首先要对其进行dispose()

票数 1
EN

Stack Overflow用户

发布于 2011-02-03 14:56:09

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

我猜问题的原因是内存不足。为每个撤销步骤保留一个画布的完整克隆非常昂贵。Invalid BitmapData最常见的原因是试图在两个方向上创建大于2880 me的位图(fp9,fp10要高一点),但是如果这也发生在内存相关的问题上,我也不会感到惊讶。

票数 0
EN

Stack Overflow用户

发布于 2011-02-03 15:18:10

你试过draw()copyPixels()而不是clone()吗?无论如何,关于try块,葡萄柚是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4887523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档