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

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

29.10.2012, 02:44. Показов 6718. Ответов 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
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru