Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2

Смешивание цветов RGBA

29.10.2012, 02:44. Показов 6800. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане!

Уже не первый день ломаю голову над тем, как смешать два цвета, учитывая полупрозрачность. Пытаюсь добиться эффекта как у обыкновенного наложения слоёв в photoshop'e.
В иннете полно примеров того, как на непрозрачное фоновое изображение наложить полупрозрачное изображение, но это не то. Находил и примеры для наложение друг на друга двух полупрозрачных изображений, к сожалению те алгоритмы тоже работали не совсем так как хочется - давали очень грубые побочные эффекты. Очень часто натыкался на AlphaBlending, но это тоже не то.

В общем, если кто знает, подскажите пожалуйста формулы сложения цветов RGBA. Результат должен быть примерно таким, как есали бы мы взяли две полупрозрачные картинки, в фотошепе наложили их друг на друга,и сохранили в png получившееся изображения. У меня стоит такая задача - вывести png с прозрачным фоном (то есть фона нет )

---
В реальности можно было бы привести такой пример - если мы возьмём два стекла, одно жёлтое с прозрачностью 0.5, второе чёрное, полностью прозрачное (по сути чёрного мы и невидим, т.к. полностью прозрачное. Если мы эти два стёклышка прислоним друг к другу и посмотрим через них, то мы увидим только жёлтое полупрозрачное, а не жёлтое с оттенками серого.
то есть
{r.g.b.a} 1.0, 0.0, 0.0, 0.5 + 0.0, 0.0, 0.0, 0.0 = 1.0, 0.0, 0.0, 0.5


Добавлено через 1 час 37 минут
Экспериментально получил функцию примерно такого вида:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function BlendRGBA(color1, color2: Cardinal): Cardinal;
var
  r1, g1, b1, a1, r2, g2, b2, a2, a: Single;
 
  function mix_clr(const c1, c2: Single): single;
  var
    k: single;
  begin
    k := a2 + (1 - a1) * (1 - a2);
    result := c1 * a1 + (c2 - c1*a1) * k;
  end;
 
begin
  r2 := byte(color2) / 255;
  g2 := byte(color2 shr 8) / 255;
  b2 := byte(color2 shr 16) / 255;
  a2 := byte(color2 shr 24) / 255;
 
  r1 := byte(color1) / 255;
  g1 := byte(color1 shr 8) / 255;
  b1 := byte(color1 shr 16) / 255;
  a1 := byte(color1 shr 24) / 255;
 
  r1 := mix_clr(r1, r2);
  g1 := mix_clr(g1, g2);
  b1 := mix_clr(b1, b2);
 
  a := a1 + a2 * (1 - a1);
 
  result := Round(r1*255) or (Round(g1*255) shl 8) or
        (Round(b1*255) shl 16) or (Round(a*255) shl 24);
end;
Но она идеально работает только если у фона старший байт равен $ff, то есть если фон не прозрачный. Если фон прозрачный, то функция начинает работать с очень большими погрешностями.
Поделитесь правильной формулой, если кто знает, пожалуйста
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2012, 02:44
Ответы с готовыми решениями:

Смешивание цветов
Всем привет, недавно задали задание по учебе, но сам никак что то не смог, помогите пж нужно создать программу для:Смешивание цветов ...

Смешивание цветов.
Имеются три TrackBar отвечающие за цвета RGB соответственно. Как сделать так, что бы Panel принимал цвет в зависимости от позиции всех...

Смешивание цветов
Нужна помощь. Подскажите какую нибудь программу для смешивания цветов и чтобы знать пропорции. Например: (RGB) 1) Бирюзовый. R-0;...

7
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
29.10.2012, 11:11
через GDI+ рисуй и будет тебе счастье
1
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
29.10.2012, 12:31
http://en.wikipedia.org/wiki/A... a_blending
2
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
29.10.2012, 19:25  [ТС]
Цитата Сообщение от Alex_pac Посмотреть сообщение
через GDI+ рисуй и будет тебе счастье
За совет спасибо, но, к сожалению, GDI+ тут не уместен - меня в первую очередь интересует то, как моя проблема решается математически

Цитата Сообщение от x128 Посмотреть сообщение
http://en.wikipedia.org/wiki/Alpha_c...Alpha_blending
спасибо, что ткнули носом в нужную часть статьи. Я её благополучно пропустил (не заметил что ли), когда искал формулы.
проблема решена
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
30.10.2012, 17:35
Delphi
1
2
3
4
5
dst.r:=((src.a*(src.r-dst.r)-dst.r+255) shr 8)+dst.r;
dst.g:=((src.a*(src.g-dst.g)-dst.g+255) shr 8)+dst.g;
dst.b:=((src.a*(src.b-dst.b)-dst.b+255) shr 8)+dst.b;
n    :=dst.a+src.a;
dst.a:=n or (-(n shr 8));  //для альфа-канала арифметика с насыщением
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
30.10.2012, 22:33  [ТС]
Если кому интересно, как я сам реализовал эту бяку:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type
  TMyColor = Cardinal;
...
function AlphaBlendRGBA(color1, color2: TMyColor): TMyColor;
var
  r1, g1, b1, a1, r2, g2, b2, a2, a, b: byte;
begin
  a2 := byte(color2 shr 24);
  if a2 = 255 then
    begin
      result := color2;
      exit;
    end;
  r2 := byte(color2);
  g2 := byte(color2 shr 8);
  b2 := byte(color2 shr 16);
  r1 := byte(color1);
  g1 := byte(color1 shr 8);
  b1 := byte(color1 shr 16);
  a1 := byte(color1 shr 24);
 
  b := a1 * (255 - a2) div 255;
  a := a2 + b;
  if a > 0 then
    begin
      r1 := (r2*a2 + (r1 * b)) div a;
      g1 := (g2*a2 + (g1 * b)) div a;
      b1 := (b2*a2 + (b1 * b)) div a;
    end
  else
    begin
      result := 0;
      exit;
    end;
  result := r1 or (g1 shl 8) or (b1 shl 16) or (a shl 24);
end;
правда функция не до конца оптимизирована

Добавлено через 6 минут
murderer, к сожалению, ваш вариант подходит только для непрозрачного фона
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
01.11.2012, 21:31
murderer, к сожалению, ваш вариант подходит только для непрозрачного фона
а что такое фон? это то что под картинкой => скопируйте то что нарисовано под картинкой и примените формулу к каждому пикселю фона
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
02.11.2012, 01:16  [ТС]
а что такое фон? это то что под картинкой => скопируйте то что нарисовано под картинкой и примените формулу к каждому пикселю фона
Под фоном я понимал изображение, на которое накладывал второе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2012, 01:16
Помогаю со студенческими работами здесь

Смешивание цветов в XNA4
Доброго времени суток, уважаемые :senor: Делаю програмку: из сопла двигателя вырываются картинки типа огня и дыма. Огонь: 32х32 желтенький...

Смешивание цветов, stencil test
Добрый день. Возникла такая задача: подсвечивать пересечения линии самой себя. Т.е. дан некий трек, заданный произвольным набором точек и...

Смешивание цветов, альфа-канал
Добрый день. Такой вопрос: имеется некий код, отображающий произвольную кривую посредством TRIANGLES_STRIP, необходимо подсвечивать зоны...

Есть н цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит пользователь
Есть n цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит...

Задать два перечислимых типа: первый - коды цветов, второй - названия цветов
Задать два перечислимых типа: первый коды цветов, второй - названия цветов. Вводится имя цвета, выводится его тип. Помогите плз,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru