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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2008, 23:16   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Алгоритмы вывода графики

Предлагаю к обсуждению алгоритмы ( мат. формулы если угодно ) смешивания цветов, т.е. наложение друг на друга....

Меня интерисует метод наложения двух цветов из 4х состовляющих... т.е. надо расчитать альфа канал а потом получить r,g,b.

Вот кусок кода моего, но когда pD^.a > 0 то получаю точно не то что надо )) pD это dest а pS source. оба они указывают на argb но не в этом суть...помогите, или ткните носом на литературу с описанными алгоритмами, облазил уже уйму сайтов.

Код:
a := (pD^.a + (255 - pD^.a) * pS^.a) div 255;
if (a = 0) then a := 1;
t := ((255 - pS^.a) * pD^.a) div 255;

pD^.r := (t * pD^.r + pS^.r * pS^.a) div a;
pD^.g := (t * pD^.g + pS^.g * pS^.a) div a;
pD^.b := (t * pD^.b + pS^.b * pS^.a) div a;
pD^.a := a;
для моей проги очень важна скорость, потом может попробую на асм переписать
BOBAH13 вне форума Ответить с цитированием
Старый 11.09.2008, 23:43   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Я так делал, функция моя (велосипед собств. изобретения =) Работает нормально по качеству, по скорости конечно она врядли быстрая.
Я думаю тут все предельно ясно, и в принципе ничего хитрого нет, разве что оптимизировать как нибудь, чтобы процессору легче считать было. Я имею ввиду не Асм, а от человеческой математики отойти в пользу всяких сдигов, побитовых операций и т.п. Асм конечно тоже не помешает.

Код:
procedure Blend(buffer: TBitmap; value: byte; trans: TColor);
var
  i,j: integer;
  ar,ag,ab,fr,fg,fb,rr,rg,rb: byte;
begin
for i:=0 to h-1 do
  for j:=0 to w-1 do
    begin
    if amap[j,i] = trans then
      buffer.Canvas.Pixels[j,i]:=fmap[j,i]
    else
      begin
      ar:=GetRValue(amap[j,i]);
      ag:=GetGValue(amap[j,i]);
      ab:=GetBValue(amap[j,i]);

      fr:=GetRValue(fmap[j,i]);
      fg:=GetGValue(fmap[j,i]);
      fb:=GetBValue(fmap[j,i]);

      rr:=Round(fr+((ar-fr)/255)*value);
      rg:=Round(fg+((ag-fg)/255)*value);
      rb:=Round(fb+((ab-fb)/255)*value);

      buffer.Canvas.Pixels[j,i]:=RGB(rr,rg,rb);
      end;
    end;
end;
Вся суть в этих строках

rr:=Round(fr+((ar-fr)/255)*value);
rg:=Round(fg+((ag-fg)/255)*value);
rb:=Round(fb+((ab-fb)/255)*value);

вижу у тебя почти то же самое. Что еще раз подтверждает что все очевидно, и хитрого ничего нет. У меня вроде результат нормальный выходит.

PS Спроси в Обсуждении игр у Beermonza, он этим вплотную занимался.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 04.07.2011, 09:28   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

попробовал сделать что то подобное но изображение не выводится(
чему равно свойство value? прочел статью о построении Alpha наложения но там формула совсем другая
Lokos вне форума Ответить с цитированием
Старый 04.07.2011, 11:35   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

По цветовым моделям интересен вот этот документ. Про смешение цветов раздел 6.1:
в общем случае смешиваем p процентов первого цвета и (100-p) второго цвета:

Код:
 
procedure MixRGB(R1, G1, B1, R2, G2, B2:byte; P:Single; var R, G, B:byte);
begin
   R := trunc(R1 * P + (R2) * (1-p));
   G := trunc(G1 * P + (G2) * (1-p));
   B := trunc(B1 * P + (B2) * (1-p));
end;
здесь P in [0..1]
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Жадные алгоритмы Tony_Bil Паскаль, Turbo Pascal, PascalABC.NET 3 26.02.2008 22:44
Тест на скорость вывода графики mutabor Gamedev - cоздание игр: Unity, OpenGL, DirectX 23 23.02.2008 22:03
Нужны алгоритмы шифровки!!! ***СкаЙ*** Помощь студентам 2 03.04.2007 06:27