3

我正在尝试扩展 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'

那么有没有办法解决这个问题,或者根本不可能扩展类?

谢谢。

4

5 回答 5

15

您不能从 Bitmap 派生,因为它是密封的。

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

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

然后像这样使用它:

Bitmap bitmap = ...;
bitmap.ToBlackAndWhite();
于 2009-04-20T04:55:56.653 回答
3

+1 犹大的回答。

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

于 2009-04-20T05:38:42.337 回答
1

密封类意味着作者明确规定任何类都不能从它继承。真的没有办法解决。如果您希望向 Bitmap 类添加功能,您可以查看扩展方法

当然,您可以编写一个包装类或实用程序类,但扩展方法会给您提供最类似于从Bitmap.

于 2009-04-20T04:54:04.097 回答
1

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

如果您真的打算用您自己的方法覆盖 Bitmap 的某些方法,我会再次仔细查看您要完成的工作 - 对于像图像处理这样复杂的事情,您可能会更好地通过提供与原始方法一起提供的功能而不是来取代他们。

于 2009-04-20T05:51:57.407 回答
1

如果您移至 WPF,则可以扩展 BitmapSource 类,并且添加一个 toblackandwhite 方法很容易 - 但代价是必须使用 WPF 来读取位图。请参阅自定义 BitmapSource

于 2010-05-24T10:13:30.043 回答