Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
274 / 200 / 33
Регистрация: 18.04.2009
Сообщений: 177

Запаздывание при рисовании в PictureBox большого размера

24.06.2009, 02:40. Показов 8575. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я создал в pictureBox'е объект класса Image размером 1500 х 1500 пикселей. Далее рисую карандашом в событии pictureBox1_MouseMove(...), но при рисовании линия на pictureBox'e появляется с запаздыванием, чего нет например при рисовании на холсте большого размера в PhotoShop. Можно ли это как-то исправить? Может нужно обновлять не весь pictureBox1 (кстати, обновляю я его через pictureBox1.Invalidate()), а только то, что видно без полос прокрутки. Если да, то как?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.06.2009, 02:40
Ответы с готовыми решениями:

Сохранение изменений при рисовании на PictureBox
Доброго времени суток, Проблема в следующем: Пишу графический редактор. Готовые вещи использовать не хочу. Хочу сделать так,...

Ошибка переполнения при рисовании на PictureBox
Всем привет, помогите разобраться с кодом. Постоянно выдает ошибку overflow. Заранее спасибо! Private Sub Command1_Click() ...

Изменение цвета Pen и Brush при рисовании в PictureBox
Доброго времени суток. У меня есть код: g.DrawLine(Pens.Black, 0, z, PictureBox2.Width, z) g.FillRectangle(Brushes.Green, j * cx +...

29
15 / 14 / 2
Регистрация: 15.01.2009
Сообщений: 55
28.08.2009, 08:00
Лучший ответ Сообщение было отмечено как решение

Решение

Студворк — интернет-сервис помощи студентам
Добавь в код пару строк:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
  if(can_draw_pen == true) {
    Graphics g = Graphics.FromImage(pictureBox1.Image);
    g.DrawLine(pen, start_point, e.Location);
 
    Point     lt = new Point(Math.Min(start_point.X, e.Location.X) - 1, Math.Min(start_point.Y, e.Location.Y) - 1);
    Size      sz = new Size(Math.Abs(start_point.X - e.Location.X) + 2, Math.Abs(start_point.Y - e.Location.Y) + 2);
    Rectangle r  = new Rectangle(lt, sz);
        
    start_point = e.Location;
    pictureBox1.Invalidate(r);
  }
}
3
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
28.08.2009, 12:33
Работает чуть быстрее, но запаздывание всё ещё ощутимое. А как делать отрисовку в событии Paint, как ты предлагал?
0
15 / 14 / 2
Регистрация: 15.01.2009
Сообщений: 55
28.08.2009, 15:03
Цитата Сообщение от lekha2009 Посмотреть сообщение
А как делать отрисовку в событии Paint
Отрисовка в Paint делается при наличии векторных данных. Когда при каждом малейшем изменении данных приходится отрисовывать все элементы заново. Сам имел дело с отрисовкой векторных карт.
Здесь же за отрисовкой следит сам PictureBox автоматически.

Странно, что у тебя всего лишь чуть быстрее работает. У меня при рисовании линия не отрывается от курсора.
0
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
28.08.2009, 16:31
А ты пробовал развернуть форму на весь экран и на ней рисовать? Тут уже говорили о том, что GDI+ медленнее, чем GDI, но мне кажется, что проблема в железе или ПО. У меня XP SP3, 2 Гб ОЗУ, 512 Мб ВИДЕО, процессор AMD Athlon64 X2 c 512 Кб кэша L2. Я сам сталкивался с тем, что AMD процессоры хуже работают со стеком, чем Intel, но лучше с очередью, может быть я ошибаюсь, но для меня это факт - производительное железо для .Net - это как вода для рыбы.
А как отрисовывать слоями?
0
 Аватар для snake32
3599 / 1730 / 236
Регистрация: 26.02.2009
Сообщений: 8,789
Записей в блоге: 5
28.08.2009, 18:03
Цитата Сообщение от lekha2009 Посмотреть сообщение
Tут уже говорили о том, что GDI+ медленнее, чем GDI, но мне кажется, что проблема в железе или ПО. У меня XP SP3, 2 Гб ОЗУ, 512 Мб ВИДЕО, процессор AMD Athlon64 X2 c 512 Кб кэша L2.
Скорее проблема в GDI и его методе рисования. Ты в игры наверняка играешь или хотя бы видел их, скажи, как же тогда, даже на твоём железе, умудряются нарисовать столько? Это не учитывая того что кроме графики есть ещё звук, AI, физика. А тут какая-то линия тормозит.

Как вариант, можно предположить, что прорисовка всего большого PictureBox'a, который даже на экране не помещается, не нужна в00бще. Зачем посылать команду рисования, например, левого нижнего пикселя, при экране в правом верхнем углу, если его не видно. Понятное дело что GDI сам отбракует данную команду, НО время всё равно понадобится для определение "а нужно ли его рисовать". Тем более как известно GDI сам по себе медленный, тк прежде чем что либо изобразить вызывает кучу ф-ий( проверка, преобразование и т.п....типа... сто раз проверь, один - прорисуй ) Если б ты сам указал ему какой пиксел или лучше группу пикселей и когда рисовать, то это пределённо бы увеличело скорость прорисовки. Мне кажется быстрее было бы если б вообще не создавай такого размера PictureBox, а только то что видно в данный момент на мониторе, те даже скроллы самому обрабатывать. Но это очень муторно...

Откройте для себя OpenGL или DirectX!! Самое сложное в них - это инициализация, т.е. первое с чем придётся сталкнутся. ИМХО: Рисование на OpenGL проще чем на GDI, а главное быстрее! Литературы - куча!
0
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
29.08.2009, 10:07
А можешь подсказать конкретную литературу по OpenGL, по DirectX её много, но как рисовать карандашом с его помощью мне найти не удалось, наверное нужно искать иностранные источники и литературу.
0
 Аватар для snake32
3599 / 1730 / 236
Регистрация: 26.02.2009
Сообщений: 8,789
Записей в блоге: 5
31.08.2009, 10:18
lekha2009, я начинал с книги М. Краснова "OpenGL в проектах Delphi". Простыми словами описаны общие ф-ии.
Потом ещё есть книга "OpenGL SuperBible, Third Edition" авторы: Richard S. Wright Jr., Benjamin Lipchak. Есть нормальный русскоязычный вариант. Здесь подробно расписаны почти все ф-ии стандартного OpenGL'я и закватывает пару-тройку расширений, а так же одна треть книги посвящена шейдерам. Более 1500 страниц. Примеры написаны на обычном C.
Цитата Сообщение от lekha2009 Посмотреть сообщение
но как рисовать карандашом с его помощью мне найти не удалось
На сколько я знаю, понятия карандаш, кисть в OpenGL'е отсутствует. Разве рисование точки не похоже на рисование карандашом?
C
1
2
3
4
5
6
7
glPointSize( 3.0f );    // размер точки - 3.0
glColor3f( 0.0f, 0.0f, 1.0f ); // цвет - синий (R,G,B)
glBegin( GL_POINTS );  // начать рисовать точки
glVertex2f( 0.0f, 0.0f );  // Координаты точки первой точки
...
glVertex2f( х, у );  // Координаты точки n - точки
glEnd(); // завершить рисование
1
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
31.08.2009, 12:45
Спасибо, что натолкнул в нужное направление. Как разберусь с OpenGl, выложу код рисования карандашом.
0
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101
02.09.2009, 16:47
А может кто-нибудь подсказать как вывести содержимое simpleOpenGlControl на Bitmap.
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
11.12.2009, 11:17
хотел спросить алгоритм создания прорисовки по массиву точек ,ведь, нужно иметь у каждой точки укзаатель на следующюю, так как при обновлении панели все пропадет если рисовать по 2 точккам.?или как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2009, 11:17

Рисование на PictureBox. При повторном рисовании предыдущее изображение стирается
Здравствуйте, никак не могу разобраться в чем дело. Необходимо вывести "звездное небо", раскидав на черном фоне разноцветные точки...

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

Ошибка при создании массива большого размера
Массив int m; выдает ошибку Винды в чем дела? с 5 9-ми все нормально Добавлено через 19 минут точнее выше 519999 выдает ошибку при...

Сильно зависает при открытии Excell большого размера
Сильно зависает при открытии Excell большого размера, почти на 7-8 минут откроет потом если одного слово хочешь добавить еще почти 5 минут...

Высчитывание оптимального размера буфера при копировании большого файла
Здравствуйте! Программа может копировать большие файлы(>4GB). Но немалую роль играет оптимизация самого процесса копирования. Думаю всем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru