如何扩展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' 

那么有没有办法绕过这个或者根本不可能扩展这个类?

谢谢。

您无法从Bitmap派生,因为它是密封的。

如果要向Bitmap类添加方法,请编写扩展方法:

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

然后像这样使用它:

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

为犹大的回答+1。

另外,请考虑返回应用了filter的新位图,而不是修改原始位图。 从长远来看,这将为您的应用程序提供更多选项(撤消等)

你可以扩展BitmapSource类,如果你转移到WPF并添加一个toblackandwhite方法很容易 – 但是必须使用WPF来读取位图。请参阅自定义BitmapSource

密封类意味着作者明确规定任何类都不能从中inheritance。 真的没办法解决它。 如果您要将function添加到Bitmap类,可以查看扩展方法 。

当然,您可以编写包装类或实用程序类,但扩展方法将为您提供最像从Bitmapinheritance的行为。

以前的答案很好 – 扩展方法很适合这里。 另外,我的第一个想法是inheritance不是一个很好的选择,因为你并没有真正创建一种不同类型的位图(is-a relationship),你只想打包一些代码来操作一个。 换句话说,不需要将位图派生类传递给某些东西,只需传递修改后的位图代替原始位图即可。

如果你真的打算用你自己的方法覆盖一些Bitmap的方法,我会仔细看看你想要完成的事情 – 对于像图像处理这样复杂的东西,你可以通过提供与原始方法相对的function来提供更好的服务。取代他们。