Границы области маски, Как нарисовать границы области маскирования |
Здравствуйте, гость ( Вход | Регистрация )
Границы области маски, Как нарисовать границы области маскирования |
wiz29 |
29.7.2010, 8:39
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Нужна помощь. Есть маска выбранной области, с помощью нее я получаю QPainterPath объект для ее (маски) границы, затем отображаю, для оч сложных границ это жрет уйму ресурсов, тк оч много точек в QPainterPathе. Может кто сталкивался с такой проблемой (подскажите как делать правильно)
|
|
|
Litkevich Yuriy |
29.7.2010, 11:06
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
если процесс рисования потребляет много времени, то обычно используют кэширование.
Где-то заранее рисуют на QPixmap или QImage, а потом отрисовывают этот кэшированный рисунок. Кэшированый рисунок отрисовывается быстрее. |
|
|
wiz29 |
29.7.2010, 12:46
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Да провблема не в том, что можно закэшировать. С этим все понятно. Проблема вообще, как не используя QPainterPath, нарисовать границу маски изображения (имеется ввиду маска выбранной части изображения, например, magic wandом), я думаю в фотошопе это решено не кэшированием, ну и в др граф редакторах тоже. Вот и хотел узнать может кто то делал нечто подобное...
|
|
|
Алексей1153 |
29.7.2010, 18:39
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
по-моему, такое умеет делать BitBlt, но почему то не могу найти во встроенной справке, а в инет лезть лень )
|
|
|
Litkevich Yuriy |
29.7.2010, 22:06
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
по-моему, такое умеет делать BitBlt, но почему то не могу найти во встроенной справке это было в поддержке Qt3:Цитата Related Non-Members ссылка
void bitBlt ( QImage * dst, int dx, int dy, const QImage * src, int sx = 0, int sy = 0, int sw = -1, int sh = -1, Qt::ImageConversionFlags flags = Qt::AutoColor ) Copies a block of pixels from src to dst. The pixels copied from source (src) are converted according to flags if it is incompatible with the destination (dst). sx, sy is the top-left pixel in src, dx, dy is the top-left position in dst and sw, sh is the size of the copied block. The copying is clipped if areas outside src or dst are specified. If sw is -1, it is adjusted to src->width(). Similarly, if sh is -1, it is adjusted to src->height(). Currently inefficient for non 32-bit images. Use copy() or QPainter::drawImage() instead. |
|
|
wiz29 |
4.8.2010, 10:51
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Спасибо всем , за активность, нашел простое и элегантное решение... (теперь рисование не хавает ресурсов практически совсем)
тему можно закрыть |
|
|
Алексей1153 |
4.8.2010, 11:02
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
wiz29, решение в студию
|
|
|
wiz29 |
4.8.2010, 15:57
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
решение очень простое, вкратце опишу идею, думаю код тут не уместен...
Вобщем все основано на QRegion(QBitmap&). Создаем регион на основании битмапа, в битмапе "лежит" маска нужного нам контура. Получать битмап можно несколькими способами, но самый простой как мне кажется это свернуть маску селекшина с ядром оператора лапласа, получим четкие границы маски контура, ну, а далее дело техники: устанавливаем полученный регион в качестве clipRegion в QPainter и делаем QPainter::drawTiledPixmap... Надеюсь доступно, обращайтесь с вопросами, если не понятно. |
|
|
Текстовая версия | Сейчас: 19.4.2024, 7:32 |