C# 如何扩展位图类

C# 如何扩展位图类,c#,inheritance,bitmap,C#,Inheritance,Bitmap,我正在尝试扩展位图类,以便可以将自己的效果应用于图像。当我使用此代码时: namespace ImageEditor { public class Effects : System.Drawing.Bitmap { public void toBlackAndWhite() { System.Drawing.Bitmap image = (Bitmap)this; AForge.Imaging.Fi

我正在尝试扩展位图类,以便可以将自己的效果应用于图像。当我使用此代码时:

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'
那么有没有办法绕过这个问题,或者根本不可能扩展这个类


谢谢。

一个密封的类意味着作者明确规定任何类都不能从中继承。真的没办法。如果希望向位图类添加函数,可以查看


当然,您可以编写包装器类或实用程序类,但扩展方法将为您提供最类似于从位图继承的行为,因为位图是密封的,所以无法从位图派生

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

// Class containing our Bitmap extension methods.
public static class BitmapExtension
{
    public static void ToBlackAndWhite(this Bitmap bitmap)
    {
        ...
    }
}
然后像这样使用它:

Bitmap bitmap = ...;
bitmap.ToBlackAndWhite();
+1犹大的回答


也可以考虑使用一个新的位图,而不是修改原始的应用程序。从长远来看,这将为你的应用程序提供更多选项(撤销等)

前面的答案很好-扩展方法在这里很好地应用。另外,我的第一个想法是继承并不是一个很好的选择,因为你并没有真正创建一个不同类型的位图(is-a关系),你只是想打包一些代码来操作一个。换句话说,不需要将位图派生类传递给其他对象,只需传递修改后的位图来代替原始位图即可


如果您真的打算用自己的方法覆盖位图的某些方法,我会再次仔细看看您试图完成的任务-对于像图像处理这样复杂的任务,您最好在原始方法旁边提供功能,而不是取代它们。

如果您移动到WPF并添加toblackandwhite方法,您可以扩展BitmapSource类,这将很容易-但惩罚是必须使用WPF在中读取位图。请参见

这是threatsave吗?位图是一个本机实现为GDI的类。好吧,GDI通常不是线程安全的。必须添加write“public static void ToBlackAndWhite”而不是“public void”才能工作。