Russian Qt Forum
Ноябрь 01, 2024, 20:28
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QPixmap blur effect
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QPixmap blur effect (Прочитано 9940 раз)
andrew.k
Гость
QPixmap blur effect
«
:
Декабрь 18, 2010, 18:29 »
С рисованием плохо знаком. У меня есть QPixmap на нем граб главной формы, мне нужно применить к нему эффект размытия или в принципе любой другой, но чтобы содержимое стало нечитаемым.
Qt 4.4.3 поэтому QGraphicsBlurEffect там нет.
Вторая проблема, я не могу понять, как полученным пиксмапом зарисовать форму.
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.
Записан
Drafter
Гость
Re: QPixmap blur effect
«
Ответ #1 :
Декабрь 19, 2010, 00:02 »
Цитировать
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.
Эта проблема решается написанием своего виджета (с нужной полупрозрачностью), который размещается поверх других (и включается-выключается по необходимости). Что же касается эффектов - боюсь, Вам придётся "размывать" ручками, если нет возможности перейти на более современную версию Qt.
«
Последнее редактирование: Декабрь 19, 2010, 00:04 от Drafter
»
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #2 :
Декабрь 19, 2010, 02:37 »
Цитата: Drafter от Декабрь 19, 2010, 00:02
Цитировать
Пиксмап который я отрисовываю в paintEvent оказывается как бы на заднем плане. А почти все элементы управления все равно отрисовывают себя поверх.
Эта проблема решается написанием своего виджета (с нужной полупрозрачностью), который размещается поверх других (и включается-выключается по необходимости). Что же касается эффектов - боюсь, Вам придётся "размывать" ручками, если нет возможности перейти на более современную версию Qt.
Так зачем мне делать свой виджет, если все что от него требуется это отобразить картинку. С этим прекрасно справляется QLabel. Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Так что вопрос в том, каким образом теперь разместить этот QLabel "поверх других" и чтобы он растягивался по размеру формы, как будто в лэйауте?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #3 :
Декабрь 19, 2010, 13:02 »
Цитата: andrew.k от Декабрь 19, 2010, 02:37
Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Все размывают Гауссом и никому от этого плохо не стало. Два и более прохода не нужно, просто возьмите больше соседей для осреднения. А самое главное - не "каждый пиксель" (долго) а сначала "по строкам" а затем "по столбцам" (ну или наоборот, дело вкуса)
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #4 :
Декабрь 19, 2010, 21:49 »
Цитата: Igors от Декабрь 19, 2010, 13:02
Цитата: andrew.k от Декабрь 19, 2010, 02:37
Некоторое подобие размытия я сделал (для каждого пиксела посчитал среднее значение его и всех соседних). И таких три прохода. Получилось уродское подобие размытия. Пока сойдет. Другого не слишком сложного алгоритма не нашел.
Все размывают Гауссом и никому от этого плохо не стало. Два и более прохода не нужно, просто возьмите больше соседей для осреднения. А самое главное - не "каждый пиксель" (долго) а сначала "по строкам" а затем "по столбцам" (ну или наоборот, дело вкуса)
Я знаю, про размытие Гаусса, я думал, что его реализация не тривиальная, а так как для меня качество результата вообще не имеет значения, то сделал как пришло в голову. Сейчас посмотрел алгоритм Гаусса, в принципе не на много сложнее реализовать, так что сейчас буду пробовать.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #5 :
Декабрь 20, 2010, 18:22 »
Повторюсь: блюрьте сначала строки, потом столбцы (а не всех соседей - это медленно)
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #6 :
Декабрь 20, 2010, 21:43 »
Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Сделал через т.н. быстрый блюр. Центральный пиксел игнорируется, берется среднее значение 8 пикселов вокруг центрального.
Работает очень быстро. 10 проходов изображение 1280х1024 (4Метра РГБА) фильтруется за 0.5 сек.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #7 :
Декабрь 21, 2010, 10:36 »
Цитата: andrew.k от Декабрь 20, 2010, 21:43
Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Проход 1: создаете новый имедж (по размерам такой же). Каждый пиксель нового имеджа вычисляется как среднее по строке старого имеджа. (напр сумма 4 слева и 4 справа, итого 9). Новый имедж будет заблюрен "по строкам"
Проход 2: используя имедж первого прохода повторяете все то же по столбцам (напр 4 сверху и 4 снизу)
Итого каждый пиксель потребовал 9 + 9 = 18 сложений. Если же Вы просто "осредняете всех соседей", то надо 9 * 9 = 81 сложений
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #8 :
Декабрь 21, 2010, 10:58 »
Цитата: Igors от Декабрь 21, 2010, 10:36
Цитата: andrew.k от Декабрь 20, 2010, 21:43
Гаусс тоже медленный на самом деле. Чтобы заблюрить до нормального уровня, нужно много времени.
Проход 1: создаете новый имедж (по размерам такой же). Каждый пиксель нового имеджа вычисляется как среднее по строке старого имеджа. (напр сумма 4 слева и 4 справа, итого 9). Новый имедж будет заблюрен "по строкам"
Проход 2: используя имедж первого прохода повторяете все то же по столбцам (напр 4 сверху и 4 снизу)
Итого каждый пиксель потребовал 9 + 9 = 18 сложений. Если же Вы просто "осредняете всех соседей", то надо 9 * 9 = 81 сложений
Какая-то невероятно хитрая математика.
интересно откуда у пиксела 81 сосед? у тебя 5D монитор или 6D?
На моем двумерном мониторе у каждого пиксела (если не считать крайних) по 8 соседей.
Соответственно пиксел нового изображения формируется сложением из этих 8 соседей и вместо деления на 8, можно использовать сдвиг вправо <<3, для скорости.
Откуда 81? Загадка.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #9 :
Декабрь 21, 2010, 12:00 »
Цитата: andrew.k от Декабрь 21, 2010, 10:58
Какая-то невероятно хитрая математика.
интересно откуда у пиксела 81 сосед? у тебя 5D монитор или 6D?
На моем двумерном мониторе у каждого пиксела (если не считать крайних) по 8 соседей.
Соответственно пиксел нового изображения формируется сложением из этих 8 соседей и вместо деления на 8, можно использовать сдвиг вправо <<3, для скорости.
Откуда 81? Загадка.
8 = "число ближайших" соседей, + сам пиксель, итого 9. То есть Вы осредняете матрицу 3х3. Чтобы заблюрить больше, надо взять матрицу больше, напр 9x9. Но складывать не все 81 точки а 18 как писалось выше
Записан
Kolobok
Гость
Re: QPixmap blur effect
«
Ответ #10 :
Декабрь 21, 2010, 12:02 »
Цитата: andrew.k от Декабрь 21, 2010, 10:58
Откуда 81? Загадка.
Igors взял по 4 пикселя с каждой стороны. Это квадрат 9х9. Правда сложений будет 80 ( это я так, занудствую ). В твоем случае квадрат 3х3 = 9 пикселей - 8 сложений * 10 проходов = те же 80 сложений.
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #11 :
Декабрь 21, 2010, 18:45 »
Тогда я вообще не понял о чем был его пост.
И так понятно, что если взять меньше точек, то будет быстрее работать, чем если взять больше точек
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #12 :
Декабрь 22, 2010, 11:39 »
Цитата: Kolobok от Декабрь 21, 2010, 12:02
Igors взял по 4 пикселя с каждой стороны. Это квадрат 9х9. Правда сложений будет 80
Да НЕТ же, всего 18, (9 в первом проходе и 9 во втором). Сначала (первый проход) блюрите каждый пиксель только по (одной) строке, потом, используя результат первого прохода, только по (одному) столбцу.
Устал я объяснять
Записан
andrew.k
Гость
Re: QPixmap blur effect
«
Ответ #13 :
Декабрь 22, 2010, 12:17 »
Главное, чтобы ты понимал, что ты с чем складываешь.
В алгоритме блюра по Гауссу, делается точно так же. Сначала по строкам, потом по столбцам. Конечно матрицу никто не общитывает. Он не из-за этого медленный, а из-за коэффициентов на которые приходится умножать соседние пикселы.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPixmap blur effect
«
Ответ #14 :
Декабрь 22, 2010, 12:50 »
Цитата: andrew.k от Декабрь 22, 2010, 12:17
В алгоритме блюра по Гауссу, делается точно так же. Сначала по строкам, потом по столбцам. Конечно матрицу никто не общитывает.
Если не обсчитывает, то чего Вы складываете 8 соседей (хотя можете сложить 2 + 2)? И чего вы берете 3х3 и делаете 10 проходов если можно просто взять матрицу больше? Гаусс здесь значит просто "колокольчик" (ближние пиксели берутся с большим весом, дальние с меньшим). А сама техника блюра (по строкам, потом по столбцам) используется с любым типом фильтра, напр. "box" (просто осреднение).
Цитата: andrew.k от Декабрь 22, 2010, 12:17
Он не из-за этого медленный, а из-за коэффициентов на которые приходится умножать соседние пикселы.
Так может Вы их просто не предвычислили? Или натыкали классов в цикле по пикселю? Если хотите давайте посмотрим код - явно что-то не так, PShop блюрит в real-time даже на скромной машине
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...