Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];

Вниз

Полупрозрачность   Найти похожие ветки 

 
NaRuTo ©   (2008-04-20 20:21) [0]

Как осуществить полупрозрачность:
Я использовал алгоритм полупрозрачности в 16 битной режиме,

function TfrmDD.Blend (const X, Y : Integer) : HRESULT;
var
desc : TDDSURFACEDESC2; i, j : Integer;
wrkPointer : PWORD;
sTemp, dTemp : WORD;
sb, db, sg, dg, sr, dr : Byte;
blue, green, red : Byte;
hRet : HRESULT;
begin
ZeroMemory (@desc, SizeOf (desc) ) ; desc.dwSize := SizeOf(desc);
hRet := FDDSBack.Lock (nil, desc, DDLOCK_WAIT, 0) ;
if Failed (hRet) then begin Result := hRet;
Exit;
end;
for i := 0 to imageWidth - 1 do
for j := 0 to imageHeight - 1 do
// Только для точек с цветом, отличным от цвета фона
if Pict [i, j] <> ColorKey then
begin
wrkPointer := PWORD (Integer(desc.IpSurface) +
(Y + j) * desc.lPitch + (X + i) * (ScreenBitDepth div 8));
sTemp := Pict [i, j]; // Пиксел источника, точка образа
dTemp := wrkPointer^; // Приемник, фоновая картинка
sb = sTemp and $lf; // Синий цвет источника
db = dTemp and $lf; // Синий цвет приемника
sg = (sTemp shr 5) and $3f; // Зеленый цвет источника
dg = (dTemp shr 5) and $3f; // Зеленый цвет приемника
sr = (sTemp shr 11) and $lf; // Красный цвет источника
dr = (dTemp shr 11) and $lf; // Красный цвет приемника
blue := (ALPHA * (sb - db) shr 8) -t- db; // Результат, синий
green := (ALPHA * (sg - dg) shr 8) + dg; // Результат, зеленый
red := (ALPHA * (sr - dr) shr 8) + dr; // Результат, красный
// Сложение цветовых компонентов в пикселе приемника
wrkPointer^ := blue or (green shl 5) or (red shl 11);
end;
Result := FDDSBack.Unlock (nil);
end;


Возникает вопрос как эту же операцию сделать в 32 битном режиме


 
antonn ©   (2008-04-20 23:15) [1]

а что эта конструкция должна делать? :)


 
МистерТ   (2008-04-21 10:09) [2]

Если поймешь почему там написано
shr 5; shr 11;
and $3f; and $1f
то легко сделаешь и для 32битного и для 64 битного...
и вообще, DirectDraw сейчас использовать стоит только в узкой предметной области, для остального лучше полноценный Direct3D8/9, там хотя бы прозрачность сама считается.


 
NaRuTo ©   (2008-04-21 12:07) [3]

Я подумал может быть вот так, но у меня что то не работает

Я принял 32 битный как:
Синий    - 11
Зелёный - 10
Красный - 11


sTemp := Pict [i, j]; // Пиксел источника, точка образа
dTemp := wrkPointer^; // Приемник, фоновая картинка
sb:= sTemp and $lf; // Синий цвет источника
db:= dTemp and $lf; // Синий цвет приемника
sg:= (sTemp shr 11) and $3f; // Зеленый цвет источника
dg:= (dTemp shr 11) and $3f; // Зеленый цвет приемника
sr:= (sTemp shr 21) and $lf; // Красный цвет источника
dr:= (dTemp shr 21) and $lf; // Красный цвет приемника
blue := (ALPHA * (sb - db) shr 8) + db; // Результат, синий
green := (ALPHA * (sg - dg) shr 8) + dg; // Результат, зеленый
red := (ALPHA * (sr - dr) shr 8) + dr; // Результат, красный
// Сложение цветовых компонентов в пикселе приемника
wrkPointer^ := blue or (green * 2048) or (red * 2097152);


 
МистерТ   (2008-04-21 13:13) [4]

мдааа....
Наводящяя подсказка:
1) shr - это смещение на несколько _бит_
для 16-битного цвета применяется схема 5-6-5 (5 бит - красный, 6 бит - зеленый, 5 бит - синий), а теперь посчитай на сколько бит надо сместить синюю составляющую цвета для её установки "на место".
Для 32 битного цвета схема 8-8-8-8 (альфа, красный, зеленый, синий).
2) переведи 3f и 1f в двоичное представление и почитай про битовые маски.


 
NaRuTo ©   (2008-04-21 14:25) [5]

СПС!


 
NaRuTo ©   (2008-04-21 14:40) [6]

МистерТ: Извини, но ты бы не мог показать мне хотябы как синий цвет сделать, всю голову сломал не могу



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1284628580
oldman
2010-09-16 13:16
2010.12.26
Диаграмма Вороного (разбиение Дирихле)


6-1232411128
RGV
2009-01-20 03:25
2010.12.26
Чат для интернета


2-1286007446
nnm
2010-10-02 12:17
2010.12.26
Иконка чужого приложения


2-1285939658
IceBeerg
2010-10-01 17:27
2010.12.26
Не устанавливается стиль окна


15-1284723086
И. Павел
2010-09-17 15:31
2010.12.26
Как преобразовать строку "123" в "1,2,3" в MS SQL 2005





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский