Как вы можете расширить класс Bitmap - PullRequest
3 голосов
/ 20 апреля 2009

Я пытаюсь расширить класс 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 ]

15 голосов
/ 20 апреля 2009

Вы не можете получить из Bitmap, потому что он запечатан.

Если вы хотите добавить метод в класс Bitmap, напишите метод расширения:

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

Тогда используйте это так:

Bitmap bitmap = ...;
bitmap.ToBlackAndWhite();
2 голосов
/ 20 апреля 2009

+ 1 за ответ Иуды.

Кроме того, рассмотрите возможность возврата нового растрового изображения с примененным фильтром, а не изменения оригинала. Это даст вашему приложению больше возможностей в долгосрочной перспективе (отменить и т. Д.)

1 голос
/ 24 мая 2010

Вы можете расширить класс BitmapSource, если перейдете в WPF и добавите метод toblackandwhite будет легко - но наказание заключается в использовании WPF для чтения растрового изображения. См. Пользовательский BitmapSource

0 голосов
/ 20 апреля 2009

Предыдущие ответы хороши - здесь хорошо применяются методы расширения. Кроме того, моей первой мыслью было то, что наследование не является хорошим выбором для начала, так как вы на самом деле не создаете другой тип растрового изображения (отношения is-a), вы просто хотите упаковать некоторый код для манипулирования им. Другими словами, нет необходимости передавать класс, полученный из растрового изображения, вы можете просто передать измененное растровое изображение вместо оригинала.

Если бы вы действительно намеревались переопределить некоторые из методов Bitmap своими собственными, я бы еще раз внимательно посмотрел на то, что вы пытаетесь достичь - для чего-то более сложного, например, для манипулирования изображениями, вам лучше справиться с предоставлением функциональности наряду с оригиналом методы, а не их замена.

0 голосов
/ 20 апреля 2009

Запечатанный класс означает, что автор явно продиктовал, что никакие классы не могут наследовать от него. Там действительно нет никакого способа обойти это. Если вы хотите добавить функции в класс Bitmap, вы можете посмотреть методы расширения .

Конечно, вы можете написать класс-оболочку или служебный класс, но методы расширения дадут вам поведение, наиболее похожее на наследование от Bitmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...