Вопрос

Есть ли простое решение добавить размытие изображения к изображению в 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 для простого создания такой матрицы.]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top