2012-05-20 4 views
4

Есть ли простое решение добавить смазывание изображения к изображению в Qt? Не нашли хорошего урока о размытии. Мне нужно что-то действительно простое, что я мог понять, и было бы очень хорошо, если бы я мог менять размытия.Qt motion (linear) blur

+0

Qt сам по себе не имеет эффекта размытия движения AFAIK. QGraphicsBlurEffect - это простое размытие с радиусом. Однако вы могли бы взглянуть на [эту ссылку] (http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html), игнорируя раздел по глубине, если хотите ровное размытие внутри плоскости изображения. Возможно, вы сможете создать свой собственный QGraphicsEffect. – Bart

ответ

2

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 градусов шагов). [EDIT: см. Комментарий 3 для простого создания такой матрицы.]

+0

Если я хорошо помню, эта матрица свернута матрицей. Использовал его на java, а затем мне понадобилось размытие под всеми углами, затем я отклонил его как возможность. Но не может найти ничего лучшего. Но эта матрица я могу получить больше углов, чем 90 шагов. Например, сделайте 45 шагов, только члены матрицы разницы будут с не нулями? например 'x 0 0 0 0 0 x 0 0 0 0 0 x 0 0 0 0 0 x 0 0 0 0 0 x' Я прав? 45 градусов размытия? –

+0

Да, это было бы 45 градусов. Но если каждый x в вашей примерной матрице является одним и тем же (постоянным) числом, это будет линейное размытие, которое выглядит неестественно. Для лучшего качества вы должны использовать линейную функцию для квадратного размытия (http://www.wolframalpha.com/input/?i=1-abs%28x%29+for+-1%3Cx%3C1). Я не знаю математики за экспоненциальным размытием, но я ожидаю экспоненциальную функцию;) Но я думаю, что линейной функции для квадратного размытия достаточно. – leemes

+0

Ах, я забыл сказать: Чтобы сгенерировать матрицу, вы можете немного обмануть: просто пусть Qt рисует белую линию на маленьком черном изображении ((2r + 1) * (2r + 1) пикселей). Конечно, вы должны включить сглаживание. Для элемента линейной функции вы можете применить впоследствии рисунок радиального градиента (темный внешний, прозрачный на внутреннем конце). Это дает вам именно матрицу, как описано в моем предыдущем комментарии (серые значения пикселей). ;) – leemes

Смежные вопросы