如何扩展Bitmap类

时间:2009-04-20 04:45:19

标签: c# inheritance 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'

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

感谢。

5 个答案:

答案 0 :(得分:15)

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

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

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

然后像这样使用它:

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

答案 1 :(得分:2)

+1为犹大的回答。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

当然你可以写一个包装类或实用程序类,但是扩展方法会给你最像从Bitmap继承的行为。

答案 4 :(得分:0)

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

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