2011-02-03 266 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;

在字典中,指針仍然可能沒有被垃圾收集器刪除。 訪問處理位圖數據似乎給出了所述的錯誤消息。