crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Границы области маски, Как нарисовать границы области маскирования
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  


Цитата(Алексей1153 @ 29.7.2010, 22:39) *
по-моему, такое умеет делать 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...
Надеюсь доступно, обращайтесь с вопросами, если не понятно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 7:32