2011-07-07 35 views
1

以下代碼會導致訪問衝突異常 - 爲什麼會這樣?我可以從unsafe區塊內呼叫AForge濾波器嗎?爲什麼調用AForge庫函數在C#中導致AccessViolationException?

unsafe 
{ 
    BitmapData bmd = ThresholdedImage.LockBits(boundingR, ImageLockMode.ReadWrite, ThresholdedImage.PixelFormat); 
    BitmapData bmda = intersectResult.LockBits(
     new Rectangle(0, 0, intersectResult.Width, intersectResult.Height), 
     ImageLockMode.ReadWrite, 
     intersectResult.PixelFormat); 


    intersectResult = intersectFilter.Apply(bmd); //causes exception here 
    ImageStatistics st = new ImageStatistics(intersectResult); 
    area = st.PixelsCountWithoutBlack; 

    intersectResult.UnlockBits(bmda); 
    ThresholdedImage.UnlockBits(bmd); 
} 
+0

不會引起異常或訪問衝突?它不可能都是 – sehe

+0

@sehe:它說「AccessViolationException未處理」,所以它必須是可能的。 – Lukas

+0

Thx。那將意味着:你會得到例外。在處理非託管代碼時,訪問衝突是完全可能的,並且看起來像** [this](http://img262.imageshack.us/img262/7761/mediamonkeyerror.png)** – sehe

回答

0

我試圖追查這個問題。

你能確認你的boundingR區域確實不代表整個圖像嗎?

你會得到這個異常,因爲在AForge的某一點有一個非託管的字節副本,它錯誤地使用了圖片的Stride值。

我認爲從BaseInPlacePartialFilter派生的過濾器將與圖像區域一起使用,但基於BaseInPlaceFilter的過濾器很可能會遇到問題。

如果它是可行的,你可以申請在整個圖像上的過濾器,然後copy回去只是你有興趣......該地區

+0

感謝您的回答。我找到了另一種方法來解決問題,而且問題似乎不再出現。但我會嘗試測試你的建議。 – Lukas

相關問題