GDI + прокрутка за пределами экрана - PullRequest
2 голосов
/ 07 апреля 2009

Я создаю пользовательский элемент управления, используя C # GDI +.

Быстрое объяснение ... элемент управления будет, скажем, 500 пикселей на экране, но будет содержать, возможно, 500000 пикселей информации. Поэтому, хотя я показываю только 500px за раз, мне, очевидно, нужно прокрутить в горизонтальной плоскости (влево и вправо). Сложность состоит в том, что каждый фрагмент растрового изображения размером 500px занимает некоторое время (от 100 мс до 1000 мс) для визуализации.

Так что мой план - сохранить растровое изображение 1500px в памяти. то есть видимая часть размером 500 пикселей и 500 пикселей по обе стороны от видимой области и асинхронное рисование частей вне экрана при прокрутке пользователя.

Мне бы хотелось, чтобы некоторые отзывы, советы, критика или примеры кода помогли мне достичь этого. Это кажется довольно простым, но после нескольких первоначальных попыток его тестирования оказалось сложнее, чем можно себе представить.

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 апреля 2009

У меня была похожая проблема несколько лет назад. Как упоминает dommer, если вы обрабатываете фрагменты изображения перед их отображением, лучше всего показать что-то и улучшить его позже. Если у вас проблемы с перетаскиванием исходного изображения, у вас что-то не так с вашим методом. GDI + очень требователен к глубине пикселя (вам нужно 32 бит на пиксель с альфа-каналом).

В нашем случае мы обработали плитки размером 500px и разложили плитку вокруг видимого изображения. Если пользователь прокрутил за пределы области, которую мы обработали, мы слили кусочки исходного изображения с темным полупрозрачным прямоугольником, наложенным поверх их. Эти куски были поставлены в очередь на обработку. Когда мы обработали куски изображения (по центру), их полупрозрачные прямоугольники исчезли бы.

Он работал достаточно хорошо, был очень отзывчивым и очень быстрым. Очень быстро перетащить оригинальное растровое изображение на экран, и в нашем случае обработка обычно была очень близка. Эффект от осветления плитки на самом деле был довольно симпатичным.

1 голос
/ 20 июля 2010

Нарисуйте только видимую область. Построить метод

Bitmap DrawGraph(leftMargin, rightMargin) {...}

и затем в OnPaint() до

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right);

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);
1 голос
/ 08 апреля 2009

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

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

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