2009-04-20 50 views
3

我想擴展位圖類,以便我可以將自己的效果應用於圖像。當我使用此代碼:如何擴展位圖類

namespace ImageEditor 
{ 
    public class Effects : System.Drawing.Bitmap 

    { 
     public void toBlackAndWhite() 
     { 
      System.Drawing.Bitmap image = (Bitmap)this; 
      AForge.Imaging.Filters.Grayscale filter = new AForge.Imaging.Filters.Grayscale(); 
      this = filter.Apply(this); 
     } 
    } 
} 

我得到以下錯誤:

'ImageEditor.Effects': cannot derive from sealed type 'System.Drawing.Bitmap' 

那麼,有沒有辦法來解決這個問題或者是它根本不可能進行擴展的類?

謝謝。

回答

13

您不能從位圖派生,因爲它是密封的。

如果你想添加一個方法Bitmap類,寫一個擴展方法:

// Class containing our Bitmap extension methods. 
public static class BitmapExtension 
{ 
    public void ToBlackAndWhite(this Bitmap bitmap) 
    { 
     ... 
    } 
} 

然後使用它是這樣的:

Bitmap bitmap = ...; 
bitmap.ToBlackAndWhite(); 
+0

這將是threatsave? – WiiMaxx 2013-07-23 10:03:54

0

密封類意味着作者明確規定沒有類可以繼承它。真的沒有辦法繞過它。如果您正在尋找將函數添加到Bitmap類,您可以查看extension methods

當然,您可以編寫一個包裝類或實用程序類,但擴展方法會給您最像繼承自Bitmap的行爲。

2

+1猶大的答案。

另外,考慮返回一個新的位圖與應用過濾器,而不是修改原來的。這將爲您的應用程序提供更多的選擇(撤消等)

0

以前的答案很好 - 擴展方法在這裏很好地應用。另外,我的第一個想法是繼承不是一個很好的選擇,因爲你並沒有真正創建一個不同類型的位圖(是一種關係),你只是想打包一些代碼來操縱它。換句話說,不需要將位圖派生類傳遞給某個東西,只需傳遞修改後的位圖來代替原始位置。

如果你真的打算用你自己的方法重寫一些Bitmap的方法,我會再次仔細看看你想完成什麼 - 對於像圖像處理這樣複雜的事情,你可能更好地通過提供功能原來的方法,而不是取代它們。

1

可以擴展的BitmapSource類,如果你移動到WPF和添加toblackandwhite方法很容易 - 但處罰必須使用WPF來讀取位圖見Custom BitmapSource