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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 18:21   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Эффект "Шум" - резкий перепад на 3-ем шаге

Код:
Procedure FVFL_Noise(Handle: HBITMAP; MaxNoise : Byte); StdCall;
Var
 X, Y: Integer;
 C: Byte;
 BMP: BITMAP;
 P1, P2: PRGBTriple;
Begin
 Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
 P1 := BMP.bmBits;
 Randomize;
 If BMP.bmBitsPixel = 24 Then
      For Y := 0 To BMP.bmHeight - 1 Do
            Begin
             P2 := P1;
             For X := 0 To BMP.bmWidth - 1 Do
                  Begin
                   If Random(2) = 0 Then
                     C := P2.rgbtBlue + Random(MaxNoise)
                    Else
                     C := P2.rgbtBlue + Random(MaxNoise);
                   P2.rgbtBlue := C;
                   If Random(2) = 0 Then
                     C := P2.rgbtGreen + Random(MaxNoise)
                    Else
                     C := P2.rgbtGreen + Random(MaxNoise);
                   P2.rgbtGreen := C;
                   If Random(2) = 0 Then
                     C := P2.rgbtRed + Random(MaxNoise)
                    Else
                     C := P2.rgbtRed + Random(MaxNoise);
                   P2.rgbtRed := C;
                   Inc(P2);
                  End;
             Pointer(P1) := Pointer(Integer(P1) + BMP.bmWidthBytes);
            End
 Else
  MessageBox(0, 'Library error - 0x00', 'Error', MB_OK);
End;
Вызываю с шагом (MaxNoise) 8:
Начальное состояние, 1-е применение, 2-е применение, 3-е применение.


Вопрос - почему такой резкий перепад на третьем шаге? Как от этого избавиться?

P.S. Пока только одна мысль - переполнение байта.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

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

Да, причиной фейла было переполнение байта. Решил следующим образом:
Код:
If Random(2) = 0 Then
  C := Add(P2.rgbtBlue,Random(MaxNoise))
 Else
  C := Sub(P2.rgbtBlue,Random(MaxNoise));
P2.rgbtBlue := C;
If Random(2) = 0 Then
  C := Add(P2.rgbtGreen,Random(MaxNoise))
 Else
  C := Sub(P2.rgbtGreen,Random(MaxNoise));
P2.rgbtGreen := C;
If Random(2) = 0 Then
  C := Add(P2.rgbtRed,Random(MaxNoise))
 Else
  C := Sub(P2.rgbtRed,Random(MaxNoise));
P2.rgbtRed := C;
Код:
Function Add(A,B : Byte): Byte;
Begin
 If A + B < 255 Then Result := A + B
                Else Result := 255;
End;

Function Sub(A,B : Byte): Byte;
Begin
 If A - B < 0 Then Result := 0
              Else Result := A - B;
End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Эффект "бесконечного тоннеля" с WebCam. Alex Cones Свободное общение 20 02.03.2010 17:52
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Графический эффект "круги на воде" Нович0к Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.11.2008 23:25