Russian Qt Forum
Ноябрь 01, 2024, 18:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QPixmap blur effect  (Прочитано 9933 раз)
andrew.k
Гость
« : Декабрь 18, 2010, 18:29 »

С рисованием плохо знаком. У меня есть QPixmap на нем граб главной формы, мне нужно применить к нему эффект размытия или в принципе любой другой, но чтобы содержимое стало нечитаемым.
Qt 4.4.3 поэтому QGraphicsBlurEffect там нет.
Вторая проблема, я не могу понять, как полученным пиксмапом зарисовать форму.
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.
Записан
Drafter
Гость
« Ответ #1 : Декабрь 19, 2010, 00:02 »

Цитировать
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.

Эта проблема решается написанием своего виджета (с нужной полупрозрачностью), который размещается поверх других (и включается-выключается по необходимости). Что же касается эффектов - боюсь, Вам придётся "размывать" ручками, если нет возможности перейти на более современную версию Qt.
« Последнее редактирование: Декабрь 19, 2010, 00:04 от Drafter » Записан
andrew.k
Гость
« Ответ #2 : Декабрь 19, 2010, 02:37 »

Цитировать
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.

Эта проблема решается написанием своего виджета (с нужной полупрозрачностью), который размещается поверх других (и включается-выключается по необходимости). Что же касается эффектов - боюсь, Вам придётся "размывать" ручками, если нет возможности перейти на более современную версию Qt.
Так зачем мне делать свой виджет, если все что от него требуется это отобразить картинку. С этим прекрасно справляется QLabel. Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Так что вопрос в том, каким образом теперь разместить этот QLabel "поверх других" и чтобы он растягивался по размеру формы, как будто в лэйауте?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 19, 2010, 13:02 »

Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Все размывают Гауссом и никому от этого плохо не стало. Два и более прохода не нужно, просто возьмите больше соседей для осреднения. А самое главное - не "каждый пиксель" (долго) а сначала "по строкам" а затем "по столбцам" (ну или наоборот, дело вкуса)
Записан
andrew.k
Гость
« Ответ #4 : Декабрь 19, 2010, 21:49 »

Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Все размывают Гауссом и никому от этого плохо не стало. Два и более прохода не нужно, просто возьмите больше соседей для осреднения. А самое главное - не "каждый пиксель" (долго) а сначала "по строкам" а затем "по столбцам" (ну или наоборот, дело вкуса)
Я знаю, про размытие Гаусса, я думал, что его реализация не тривиальная, а так как для меня качество результата вообще не имеет значения, то сделал как пришло в голову. Сейчас посмотрел алгоритм Гаусса, в принципе не на много сложнее реализовать, так что сейчас буду пробовать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 20, 2010, 18:22 »

Повторюсь: блюрьте сначала строки, потом столбцы (а не всех соседей - это медленно)
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 20, 2010, 21:43 »

Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Сделал через т.н. быстрый блюр. Центральный пиксел игнорируется, берется среднее значение 8 пикселов вокруг центрального.
Работает очень быстро. 10 проходов изображение 1280х1024 (4Метра РГБА) фильтруется за 0.5 сек.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 21, 2010, 10:36 »

Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Проход 1: создаете новый имедж (по размерам такой же). Каждый пиксель нового имеджа вычисляется как среднее по строке старого имеджа. (напр сумма 4 слева и 4 справа, итого 9). Новый имедж будет заблюрен "по строкам"

Проход 2: используя имедж первого прохода повторяете все то же по столбцам (напр 4 сверху и 4 снизу)

Итого каждый пиксель потребовал 9 + 9 = 18 сложений. Если же Вы просто "осредняете всех соседей", то надо 9 * 9 = 81 сложений

Записан
andrew.k
Гость
« Ответ #8 : Декабрь 21, 2010, 10:58 »

Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Проход 1: создаете новый имедж (по размерам такой же). Каждый пиксель нового имеджа вычисляется как среднее по строке старого имеджа. (напр сумма 4 слева и 4 справа, итого 9). Новый имедж будет заблюрен "по строкам"

Проход 2: используя имедж первого прохода повторяете все то же по столбцам (напр 4 сверху и 4 снизу)

Итого каждый пиксель потребовал 9 + 9 = 18 сложений. Если же Вы просто "осредняете всех соседей", то надо 9 * 9 = 81 сложений
Какая-то невероятно хитрая математика.
интересно откуда у пиксела 81 сосед? у тебя 5D монитор или 6D?
На моем двумерном мониторе у каждого пиксела (если не считать крайних) по 8 соседей.
Соответственно пиксел нового изображения формируется сложением из этих 8 соседей и вместо деления на 8, можно использовать сдвиг вправо <<3, для скорости.
Откуда 81? Загадка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 21, 2010, 12:00 »

Какая-то невероятно хитрая математика.
интересно откуда у пиксела 81 сосед? у тебя 5D монитор или 6D?
На моем двумерном мониторе у каждого пиксела (если не считать крайних) по 8 соседей.
Соответственно пиксел нового изображения формируется сложением из этих 8 соседей и вместо деления на 8, можно использовать сдвиг вправо <<3, для скорости.
Откуда 81? Загадка.
8 = "число ближайших" соседей, + сам пиксель, итого 9. То есть Вы осредняете матрицу 3х3. Чтобы заблюрить больше, надо взять матрицу больше, напр 9x9. Но складывать не все 81 точки а 18 как писалось выше
Записан
Kolobok
Гость
« Ответ #10 : Декабрь 21, 2010, 12:02 »

Откуда 81? Загадка.

Igors взял по 4 пикселя с каждой стороны. Это квадрат 9х9. Правда сложений будет 80 ( это я так, занудствую ). В твоем случае квадрат 3х3 = 9 пикселей - 8 сложений * 10 проходов = те же 80 сложений.
Записан
andrew.k
Гость
« Ответ #11 : Декабрь 21, 2010, 18:45 »

Тогда я вообще не понял о чем был его пост.
И так понятно, что если взять меньше точек, то будет быстрее работать, чем если взять больше точек Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 22, 2010, 11:39 »

Igors взял по 4 пикселя с каждой стороны. Это квадрат 9х9. Правда сложений будет 80
Да НЕТ же, всего 18, (9 в первом проходе и 9 во втором). Сначала (первый проход) блюрите каждый пиксель только по (одной) строке, потом, используя результат первого прохода, только по (одному) столбцу.
Устал я объяснять  Улыбающийся
Записан
andrew.k
Гость
« Ответ #13 : Декабрь 22, 2010, 12:17 »

Главное, чтобы ты понимал, что ты с чем складываешь.
В алгоритме блюра по Гауссу, делается точно так же. Сначала по строкам, потом по столбцам. Конечно матрицу никто не общитывает. Он не из-за этого медленный, а из-за коэффициентов на которые приходится умножать соседние пикселы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 22, 2010, 12:50 »

В алгоритме блюра по Гауссу, делается точно так же. Сначала по строкам, потом по столбцам. Конечно матрицу никто не общитывает.
Если не обсчитывает, то чего Вы складываете 8 соседей (хотя можете сложить 2 + 2)? И чего вы берете 3х3 и делаете 10 проходов если можно просто взять матрицу больше? Гаусс здесь значит просто "колокольчик" (ближние пиксели берутся с большим весом, дальние с меньшим). А сама техника блюра (по строкам, потом по столбцам) используется с любым типом фильтра, напр. "box" (просто осреднение).

Он не из-за этого медленный, а из-за коэффициентов на которые приходится умножать соседние пикселы.
Так может Вы их просто не предвычислили? Или натыкали классов в цикле по пикселю? Если хотите давайте посмотрим код - явно что-то не так, PShop блюрит в real-time даже на скромной машине
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.