Рисование с полупрозрачностью

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Рисование с полупрозрачностью

Сообщение Flanter » 26.11.2009 18:46:36

В программе есть Bitmap, на котором мне хочется нарисовать нечто полупрозрачное, а потом наложить этот полупрозрачный Bitmap на другую картинку. Собственно, вопрос: как рисовать на битмапе полупрозрачные пиксели? Правильно ли я понимаю, что без TLazIntfImage здесь не обойтись? Или это можно сделать как-то по-другому, проще?
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Рисование с полупрозрачностью

Сообщение Bupyc » 26.11.2009 20:10:59

Про альфа-канал почитайте. Если известны цвета двух исходных пикселов и степень прозрачности, то цвет результирующего пиксела вычисляется достаточно элементарно по простейшей формуле. Если найду у себя в исходниках, то выложу.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Рисование с полупрозрачностью

Сообщение Flanter » 26.11.2009 20:17:20

Это я знаю, тут проблем нет. Я просто не совсем корректно сформулировал: накладывать картинку буду не я, это будет делать ImageList. То есть в ImageList мне надо поставить картинку с полупрозрачностью. А нарисовать эту картинку я должен сам, в программе. То есть вопрос сводится всё-таки к тому как в программе рисовать в битмапе полупрозрачные пиксели.
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Рисование с полупрозрачностью

Сообщение Bupyc » 26.11.2009 20:25:10

Вообщем, если я правильно понял код, который писал мой коллега, то, что бы наложить один пиксел на другой надо сделать следующее:

Пусть alpha - значение от 0 до 1 определяющее степень прозрачности. Раскладываем каждый из пикселов на R,G,B составляющие. Назовём их R1,R2, G1,G2, B1,B2. Результирующие RGB составляющие будут вычисляться по формулам:

R := Trunc(R1 * alpha + R2 * (1 - alpha))
G := Trunc(G1 * alpha + G2 * (1 - alpha))
B := Trunc(B1 * alpha + B2 * (1 - alpha))

У моего коллеги еще стоит проверка:

if R > 255 then R := 255;
if G > 255 then G := 255;
if B > 255 then B := 255;

Правда, я не уверен, что она нужна.

Как получить цвет из рассчитанных RGB, думаю, объяснять не надо.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Рисование с полупрозрачностью

Сообщение Flanter » 26.11.2009 20:28:58

Это всё здорово, конечно, но вопрос всё-таки больше технический: как этот пиксель мне теперь нарисовать на битмапе? Если взять Canvas, то он работает только с TColor, который альфа-канал физически не поддерживает. Можно использовать TLazIntfImage, но у меня с ним почему-то ничего не получается. Вот думаю, может, есть другие способы - свойства, функции?
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Рисование с полупрозрачностью

Сообщение Bupyc » 26.11.2009 20:44:50

Может я что то не понимаю, конечно ... :) Вообще то всё просто.

Берём два пиксела, один с битмапа на который мы хотим наложить картинку и второй, который мы хотим наложить на первый пиксел. Т.е. имеем два значения типа TColor. По описанному мною алгоритму вычисляем третий цвет. Полученный результат тоже будет типа TColor. Потом с помощью Bitmap.Pixels[x,y] накладываем полученное значение на битмап.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Рисование с полупрозрачностью

Сообщение Flanter » 26.11.2009 20:53:58

Альфа-канала у результирующего рисунка не будет. Будет просто фиксированный цвет. А мне нужен альфа-канал в битмапе. Чтобы этот битмап другие компоненты потом могли отрисовать на своём фоне :)
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Рисование с полупрозрачностью

Сообщение Bupyc » 27.11.2009 12:47:50

Вообщем я не знаю, как накладывать одну картинку на другую с заданной степенью прозрачности с помощью стандартных компонентов. Как то не задавался никогда этим вопросом. Когда перед нами возникла такая задача, мы рисовали всё руками. Скорее всего изобретая при этом очередной велосипед с квадратными колёсами. Приатаченный пример показывает как это делается. Степень прозрачности задаётся позицией трэк-бара на форме. Пример писался в 7-х дельфях.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 52

Рейтинг@Mail.ru