Qt motion (линейное) размытие
-
12-12-2019 - |
Вопрос
Есть ли простое решение добавить размытие изображения к изображению в Qt?Не нашел хорошего урока по размытию.Мне нужно что-то действительно простое, что я мог бы понять, и было бы очень хорошо, если бы я мог менять углы размытия.
Решение
В Qt нет фильтра размытия изображения.Я посмотрел код QGraphicsBlurEffect
;оно использует QPixmapBlurEffect
который сам использует внутренний вспомогательный метод, называемый expblur
(экспоненциальное размытие).
expblur
сам использует эффект одномерного размытия (размытие в движении в направлении X, метод qt_blurrow
) дважды.Он поворачивает изображение между двумя размытиями на 90 градусов, а затем поворачивает его обратно.
Итак, на самом деле Qt имеет эффект размытия в движении, но это только внутренний эффект.Поэтому вам нужно написать свой собственный эффект.Для этого взгляните на код qt_blurrrow
, который вы можете найти в исходниках Qt по адресу src/gui/qpixmapfilter.cpp
.Это обеспечит хорошее качество фильтра, поскольку это фильтр экспоненциального размытия, а не линейного.
Если вы не хотите так глубоко углубляться в исходный код Qt, возьмите для начала этот псевдокод:
foreach pixel (x, y) in image {
for dx = -r to r with x+dx within image {
for dy = -r to r with y+dy within image {
Add pixel (x+dx, y+dy) of the source image with ↩
factor (matrix[dx, dy]) to the target image.
}
}
}
где матрица может быть определена следующим образом (для размытия в горизонтальном движении с радиусом 2):
0 0 0 0 0
0 0 0 0 0
0.1 0.2 0.4 0.2 0.1
0 0 0 0 0
0 0 0 0 0
Обратите внимание, что сумма всех записей должна быть равна 1, иначе вам придется разделить цвета на сумму элементов матрицы.
Построить эту матрицу для заданного радиуса r и угла α сложно, если вы хотите разрешить произвольные углы для α (а не только шаги по 90 градусов).[РЕДАКТИРОВАТЬ:См. комментарий 3 для простого создания такой матрицы.]