Пользовательский элемент управления для отображения изображений - PullRequest
0 голосов
/ 17 октября 2011

У меня есть свои собственные классы, которые представляют данные изображения. Они имеют различную базовую структуру, но все имеют индексированное свойство, которое возвращает i, j-й элемент изображения. Мне нужно отображать такие изображения в форме. Прямо сейчас я предварительно конвертирую их в System.Drawing.Bitmap и затем отображаю их в стандартном Winforms PictureBox. Моя идея заключается в создании пользовательского элемента управления, который будет иметь свойство моего типа изображения и будет отображать изображение без предварительного преобразования его в System.Drawing.Bitmap или System.Drawing.Image.

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

protected override void  OnPaint(PaintEventArgs e)
    {
        for(int i=e.ClipRectangle.Left; i<=e.ClipRectangle.Right; i++)
        {
            for (int j = e.ClipRectangle.Top; j <= e.ClipRectangle.Bottom; j++)
            {
                //do something with i and j here
                //calculate the corresponding k and l indices
                //assign _myCustomClassImage[k,l] somewhere
            }
        }

    }

Да, я понимаю, что могу создать растровое изображение размера прямоугольника клипа и использовать SetPixel для назначения его элементов, но SetPixel работает очень медленно.

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

Есть ли какие-либо предложения в каком направлении мне продолжать свою работу?

1 Ответ

1 голос
/ 17 октября 2011

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

Я знаю, что SetPixel работает медленно, и я не уверен, что вы имеете в виду, когда используете 'marshalling для назначения пикселей растрового изображения'но есть быстрая альтернатива, использующая класс System.Drawing.Imaging.BitmapData и метод Bitmap.LockBits.См. Пример использования здесь .

Кстати, зачем вам нужно создавать объект Bitmap в методе OnPaint?Не достаточно ли создать и назначить его один раз?

...