2009-04-20 18 views
3

イメージに自分のエフェクトを適用できるように、Bitmapクラスを拡張しようとしています。Bitmapクラスを拡張するには

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から派生することはできません。

あなたは、Bitmapクラスにメソッドを追加する拡張メソッドを書きたい場合:

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

次に、このようにそれを使用します。ユダの答えのための

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

これはthreatsaveになりますを参照してください。? – WiiMaxx

+0

ビットマップは、ネイティブ実装がGDIであるクラスです。 AFAIK、GDIは一般にスレッドセーフではありません。 –

0

封印されたクラスとは、作成者がクラスを継承しないことを明示的に指示したことを意味します。その周りに本当に方法はありません。 Bitmapクラスに関数を追加する場合は、extension methodsをご覧ください。

もちろん、ラッパークラスやユーティリティクラスを書くこともできますが、拡張メソッドはBitmapから継承するような動作を提供します。

2

+1。

また、オリジナルを変更するのではなく、フィルタを適用して新しいビットマップを返すことを検討してください。これにより、アプリの長期的な選択肢が増えます(元に戻すなど)

0

これまでの回答は良好でした。ここでの拡張方法はうまく適用されます。また、私が最初に考えたのは、継承は、別の種類のビットマップ(実際には関係)を作成しているわけではないので、継承は素晴らしい選択ではないということでした。言い換えれば、ビットマップ派生クラスを何かに渡す必要はありません。オリジナルの代わりに変更されたビットマップを渡すことができます。

Bitmapのメソッドの一部を自分でオーバーライドしようとしていたのなら、達成しようとしているものをもう一度見直してみましょう。イメージ操作のように複雑なものは、元の方法ではなく、元の方法に置き換えます。

1

あなたがWPFに移動してtoblackandwhiteメソッドを追加するのは簡単だろう場合は、たBitmapSourceクラスを拡張することができます - しかし、ペナルティがビットマップを読み込むためにWPFを使用する必要がされてCustom BitmapSource

関連する問題