Реализация эффективного класса изображений - PullRequest
1 голос
/ 19 января 2012

У меня есть вопрос о дизайне ...

Я хочу создать свой собственный класс изображений под названием EfficientImage, который будет включать в себя Load, которая будет принимать System.Drawing.Bitmap и использовать биты блокировки для преобразования его в2D байтовый массив.

class EfficientImage
{

    private byte[,] image;
    private int width;
    private int height;

    public Load(System.Drawing.Bitmap inImage)
    {
    }

    //etc...

}

, поэтому у меня может быть

EfficentImage ef = new EfficientImage();
ef.Load(myBitmap);

Каков наилучший способ получить доступ к массиву изображений внутри объекта, не теряя прирост производительности при использовании LockBits в первомместо?Я полагаю, что наличие метода доступа или свойства будет реплицировать GetPixel / SetPixel в обычном растровом объекте, который неэффективен, а установка поля изображения для public нарушит инкапсуляцию

Возможно, этот дизайн совершенно неправильныйпуть, но я был бы очень рад узнать о лучшем / правильном пути.

Спасибо за вашу помощь

1 Ответ

3 голосов
/ 19 января 2012

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

Если это так, я бы назвал ваш класс чем-то вроде ImageFilter, например:

public abstract class ImageFilter
{
    protected abstract void ApplyFilter(byte[,] imageData);

    public Bitmap Apply(Bitmap image)
    {
        // lockbits etc
        ApplyFilter(imageData);
        // unlockbits
    }
}

public class MyFilter : ImageFilter
{
    protected override ApplyFilter(byte[,] imageData)
    {
        // work on the bits
    }
}

Bitmap newBitmap = new MyFilter().Apply(oldBitmap);

Таким образом, вы можете создавать собственные фильтры, которые работают только с необработанными данными, тогда как абстрактный класс ImageFilter занимается загрузкой изображения и его данных.

Прошу прощения, если я упустил пункт:)

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