Конференция "Игры" » Нужна функция размытия [Delphi, Linux]
 
  • Кирилл (12.04.12 01:27) [0]
    обычного, не по Гауссу,
    для битмапов-24, в ДРКБ нету нормального ничего.
    функция должна быть настраиваемая
  • MBo © (12.04.12 05:43) [1]
    Чем Гаусс-то плох? Ну можно усреднять окрестность - сумма значений по квадрату или приближению круга разделить на количество точек в окне, если это кажется проще. На глаз особо не отличишь, если спецособенностей на картинке нет.
  • Jeer © (12.04.12 16:37) [2]

    > Чем Гаусс-то плох?


    Нет настроек: ветер, волны, взрыв, чупа-чупс и т.д. :)
  • Кирилл (12.04.12 20:46) [3]

    > MBo ©   (12.04.12 05:43) [1]


    ой, я перепутал Гаусс с радиальным размытием :)
  • Омлет © (12.04.12 21:10) [4]
    > радиальным размытием

    function ILimit(Val, AMin, AMax: Integer): Integer;
    begin
     Result := Min(Max(Val, AMin), AMax);
    end;

    function BLimit(B: Integer): Byte;
    begin
     if B < 0 then Result := 0
              else if B > 255 then Result := 255
                              else Result := B;
    end;

    procedure RadialBlur(SrcBmp, DestBmp: TBitmap; CX, CY, Size, Quality: Integer);
    const Rad = Pi/180;
    var x, y, i, i2, Red, Green, Blue, px, py, nx, ny: Integer;
       Dest: pByteArray;
       Src: array of pByteArray;
       ASin, ACos, Ang, A: Double;
    begin
     SetLength(Src, SrcBmp.Height);
     i2 := Quality*Size;
     A := 1/Quality;
     for y := 0 to SrcBmp.Height - 1 do Src[y] := SrcBmp.ScanLine[y];
     for y := 0 to DestBmp.Height - 1 do begin
       Dest := DestBmp.ScanLine[y];
       for x := 0 to DestBmp.Width - 1 do begin
         Red   := -Dest[x*3];
         Green := -Dest[x*3+1];
         Blue  := -Dest[x*3+2];
         px := x - cx;
         py := y - cy;
         ASin := (Cy + y)/Hypot(Cx + x, Cy + y);
         Ang := ArcTan2(ASin, 1 - ASin*ASin) - Size div 2;
         for i := 0 to i2 do begin
           SinCos(Ang*Rad, ASin, ACos);
           nx := ILimit(CX + Round(px*ACos - py*ASin), 0, SrcBmp.Width - 1)*3;
           ny := ILimit(CY + Round(px*ASin + py*ACos), 0, SrcBmp.Height - 1);
           Inc(Red,   Src[ny][nx]);
           Inc(Green, Src[ny][nx+1]);
           Inc(Blue,  Src[ny][nx+2]);
           Ang := Ang + A;
         end;
         Dest[x*3]   := BLimit(Red   div i2);
         Dest[x*3+1] := BLimit(Green div i2);
         Dest[x*3+2] := BLimit(Blue  div i2);
       end;
     end;
    end;

  • Кирилл (12.04.12 21:32) [5]

    > Омлет ©   (12.04.12 21:10) [4]


    нет. мне нужно радиальное размытие, перечитайте вопрос. :)
    нужно обычное размытие хоть по Гауссу.
  • Омлет © (12.04.12 22:21) [6]

    > нет. мне нужно радиальное размытие, перечитайте вопрос.

    А я код для какого размытия привел?
    Вот пример, как он работает:

    было:
    http://not-doing.ru/some/rad/src.jpg

    стало:
    http://not-doing.ru/some/rad/dest.jpg
  • Омлет © (12.04.12 22:31) [7]
    Хотя есть еще одни вариант Radial Blur - когда прогрессивно смазываются лучи, исходящие из какой-то точки.
  • Омлет © (12.04.12 22:32) [8]
  • Кирилл (13.04.12 00:11) [9]

    >  Омлет ©   (12.04.12 22:21) [6]
    >
    >
    > > нет. мне нужно радиальное размытие, перечитайте вопрос.
    >
    >
    > А я код для какого размытия привел?


    нет, мне нужно обычное равномерное размытие.
    будто смотрим через матовое стекло
  • MBo © (13.04.12 05:26) [10]
    Ядро Гаусса разделяемое, так что можно применить фильтр по строкам, потом по столбцам

    B[k] := Sum[i:=k - Size..k + Size](A[i]*Coeff[Abs(i-k)])
    где коэффициенты считаются по формуле с экспонентой, либо как C(n,l)

    Пример для окна размером 5 (Size = 2)

    B[k] := (A[k-2] + 4*A[k-1] + 6*A[k] + 4*A[k+1] + A[k+2]) div 16
  • Омлет © (13.04.12 08:22) [11]

    > нет, мне нужно обычное равномерное размытие.

    То, что в Гуассовом размытии используется понятие радиуса, не делает это размывание радиальным ))
    http://www.koders.com/delphi/fid7DF552D10E3D077EFCA7F034952C88B0B5A064CF.aspx
  • К (13.04.12 21:38) [12]

    > Омлет ©   (13.04.12 08:22) [11]
    >
    >
    > > нет, мне нужно обычное равномерное размытие.
    >
    > То, что в Гуассовом размытии используется понятие радиуса,
    >  не делает это размывание радиальным ))


    это я уже понял, я уже говорил, что перепутал.

    показанные вами картинки, показывают не тот результат, который мне нужен.
    на них радиальное размытие или подобное ею.
    мне нужна функция размытия под "матовое стекло".
  • Омлет © (13.04.12 22:04) [13]

    > мне нужна функция размытия под "матовое стекло".

    Ссылку я дал в [11].
  • К (14.04.12 16:58) [14]

    > Омлет ©   (13.04.12 22:04) [13]


    спасибо
  • 1 (20.09.12 23:31) [15]
    -1'
  • -1' (20.09.12 23:31) [16]
    1
  • 1 (20.09.12 23:31) [17]
    1
  • 1 (20.09.12 23:31) [18]
    1
  • 1 (24.09.12 18:48) [19]
    -X
  • -X (24.09.12 18:48) [20]
    1
 
Конференция "Игры" » Нужна функция размытия [Delphi, Linux]
Есть новые Нет новых   [134427   +37][b:0][p:0.003]