Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2010, 22:55   #31
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Точно не помню, но Гаусса скорее всего обычной формулой Пифагора считается (максимальное значение минус округлённое расстояние до центра окружности)...
А на что делить - так это просто сумма всех коэффициентов матрицы...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.06.2010, 11:11   #32
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
(максимальное значение минус округлённое расстояние до центра окружности)...
Эм... Что-т не въехал...

Разобрался:

Код:
Function BMin(A : Integer):Byte;
Begin
 If A < 000 Then Result := 000
            Else Result := A;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
 A : Array of Array of Integer;
 X, Y : Integer;
 R : Integer;
 S : string;
begin
 Memo1.Clear;
 R := StrToInt(Edit1.Text);
 SetLength(A, R*2 + 1, R*2 + 1);
 For Y := 0 to R*2 Do
  Begin
   For X := 0 to R*2 Do
    Begin
     A[X, Y] := BMin(Round((100 - (Sqrt(Sqr(X - R)+Sqr(Y - R)) * 100) / (R + 1) ) ));
     S := IntToStr(A[X,Y]);
     While Length(S) < 3 Do S:=' '+S;
     Memo1.Text := Memo1.text + S + ' ';
    End;
   Memo1.Lines.Add('');
  End;
end;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 20.06.2010 в 14:25.
Alex Cones вне форума Ответить с цитированием
Старый 20.06.2010, 14:55   #33
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

А... Уже... А я сижу, пример клепаю...

В принципе да, но у меня немного другой вариант:

Код:
Procedure TForm1.Button2Click(Sender: TObject);
Var x, y, N, K, L: Integer;
Begin
K:=SpinEdit1.Value; // размер квадратной матрицы (нечётный)
StringGrid1.RowCount:=K;
StringGrid1.ColCount:=K;
L:=K Div 2;
For y:=-L To L Do
      For x:=-L To L Do
            Begin
            N:=Trunc(K/2-Sqrt(x*x+y*y)+0.5);
            If N<0 Then
                  N:=0;
            StringGrid1.Cells[x+L, y+L]:=IntToStr(N);
            End;
End;
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 20.06.2010 в 14:58.
DomiNick вне форума Ответить с цитированием
Старый 20.06.2010, 15:31   #34
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Я понял, как решить проблему
Цитата:
Кстати никак не могу найти, как размывать Гауссом края изображения
:
Код:
For Y := 0 To BMP.bmHeight - 1 Do
    For X := 0 To BMP.bmWidth - 1 Do
     Begin
      Sum := 0;
      For Y1 := 0 To Level*2 Do
       For X1 := 0 To Level*2 Do
        Begin
         If ((Y + Y1 - Level) >= 0) And ((X + X1 - Level) >= 0) And ((Y + Y1 - Level) <= BMP.bmHeight) And ((X + X1 - Level) <= BMP.bmWidth)Then
          Begin
           RGBA[X, Y].Red := RGBA[X, Y].Red + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtRed * GA[X1, Y1]);
           RGBA[X, Y].Blue := RGBA[X, Y].Blue + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtBlue * GA[X1, Y1]);
           RGBA[X, Y].Green := RGBA[X, Y].Green + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtGreen * GA[X1, Y1]);
           Sum := Sum + GA[X1, Y1];
          End;
        End;
      RGBA[X, Y].Red := Round(RGBA[X, Y].Red / Sum);
      RGBA[X, Y].Green := Round(RGBA[X, Y].Green / Sum);
      RGBA[X, Y].Blue := Round(RGBA[X, Y].Blue / Sum);
     End;
Правда Access Viola на выходе...

GA - матрица гаусса
Код:
RGBA - Type
 TRGB = Record
  Red   : Integer;
  Green : Integer;
  Blue  : Integer;
 End;
Снял копию с Ar, т.к. иначе придется брать размытие от размытых клеток.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 20.06.2010, 16:12   #35
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Все! Готово! Исправил ошибки и немного пооптимизировал.

Код:
Procedure FVFL_Blur(Handle: HBITMAP; Level : Byte); StdCall;
Var
 X, Y: Integer;
 BMP: BITMAP;
 P1, P2: PRGBTriple;
 Ar: Array Of Array Of PRGBTriple;
 GA : Array Of Array Of Byte;
 RGBA : Array Of Array Of TRGB;
 X1, Y1 : Byte;
 Sum : Integer;
Begin
 Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
 SetLength(Ar, BMP.bmWidth, BMP.bmHeight);
 P1 := BMP.bmBits;
 If BMP.bmBitsPixel = 24 Then
  Begin
      For Y := 0 To BMP.bmHeight - 1 Do
            Begin
             P2 := P1;
             For X := 0 To BMP.bmWidth - 1 Do
                  Begin
                   Ar[X, Y] := P2;
                   Inc(P2);
                  End;
             Pointer(P1) := Pointer(Integer(P1) + BMP.bmWidthBytes);
            End;
   SetLength(GA, Level*2 + 1, Level*2 + 1);
   For Y := 0 to Level*2 Do
    For X := 0 to Level*2 Do
     GA[X, Y] := BMin(Round((100 - (Sqrt(Sqr(X - Level)+Sqr(Y - Level)) * 100) / (Level + 1) ) ));
   SetLength(RGBA, BMP.bmWidth, BMP.bmHeight);
   For Y := 0 To BMP.bmHeight - 1 Do
    For X := 0 To BMP.bmWidth - 1 Do
     Begin
      Sum := 0;
      For Y1 := 0 To Level*2 Do
       For X1 := 0 To Level*2 Do
        Begin
         If ((Y + Y1 - Level) >= 0) And
            ((X + X1 - Level) >= 0) And
            ((Y + Y1 - Level) < BMP.bmHeight) And
            ((X + X1 - Level) < BMP.bmWidth)Then
          Begin
           RGBA[X, Y].Red := RGBA[X, Y].Red + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtRed * GA[X1, Y1]);
           RGBA[X, Y].Blue := RGBA[X, Y].Blue + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtBlue * GA[X1, Y1]);
           RGBA[X, Y].Green := RGBA[X, Y].Green + Round(Ar[X + X1 - Level, Y + Y1 - Level].rgbtGreen * GA[X1, Y1]);
           Sum := Sum + GA[X1, Y1];
          End;
        End;
      Ar[X, Y].rgbtRed := Round(RGBA[X, Y].Red / Sum);
      Ar[X, Y].rgbtGreen := Round(RGBA[X, Y].Green / Sum);
      Ar[X, Y].rgbtBlue := Round(RGBA[X, Y].Blue / Sum);
     End;
  End
 Else
  MessageBox(0, 'Library error - 0x00', 'Error', MB_OK);
End;
еще что-то поддается оптимизации?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLL-библиотека Lisёноk Помощь студентам 2 29.04.2010 22:00
DLL библиотека Владимир1988 Помощь студентам 1 17.11.2009 17:15
библиотека bass.dll larry Win Api 2 31.07.2009 15:37
Библиотека классов != обычная DLL ? darkstarx Общие вопросы .NET 3 14.04.2008 14:41
HTW32PAS.DLL необходима эта библиотека lekaon Свободное общение 4 21.08.2007 19:14