如何扩展Bitmap类

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);
        }
    }
}

I get the following error:

'ImageEditor.Effects': cannot derive from sealed type 'System.Drawing.Bitmap'

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

谢谢。

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();

这个会是安全的吗? - WiiMaxx
位图是一个原生实现为GDI的类。据我所知,GDI通常不具备线程安全性。 - Judah Gabriel Himango
必须添加写入“public static void ToBlackAndWhite”而不是“public void”,才能使其正常工作。 - user10706046

3

+1 给 Judah 的回答。

另外,考虑返回一个添加了滤镜的新位图,而不是修改原始位图。这样可以让您的应用程序在长期运行中具有更多选项(撤销等)。


1

如果你使用WPF并且想要添加一个转换为黑白的方法,可以扩展BitmapSource类。但是代价是必须使用WPF来读取位图。请参见自定义BitmapSource


1

密封类表示作者已明确规定不允许其他类继承它。这真的是无法避免的。如果您想向位图类添加功能,可以查看扩展方法

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


1
之前的回答很好 - 扩展方法在这里非常适用。此外,我的第一个想法是继承并不是一个很好的选择,因为你并没有真正创建一种不同类型的位图(is-a关系),你只是想打包一些代码来操作它。换句话说,没有必要将一个派生自位图的类传递给某个东西,你可以只传递修改后的位图代替原始位图。
如果你真的打算用自己的方法覆盖一些位图的方法,我建议你再仔细看看你想要实现什么 - 对于像图像处理这样复杂的东西,你可能最好是在原始方法旁边提供功能,而不是取代它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接