Cześć :))
Widzę coraz większe zainteresowanie może razem coś wydłubiemy :))
Jeszcze nie kumam bo dopiero co wstałem (zarwana nocka) :))
Ale myślę że komponent THarmFade to jest To czego można użyć :))
Właśnie on posiada procedurę do osiągnięcia "półprzezroczystości"
(nie mylić z przezroczystością czyli okrojeniem obrazka o kolor zerowy)
Tylko że skonstruowana jest tak że parametrem tej procedury jest
szybkość przejścia z niewidocznego obrazka na całkowicie widoczny.
Cały pic polega na tym żeby na pewnym etapie zatrzymać realizację tej procedury (wyskoczyć z pętli).
Efektem czego będzie wyświetlenie obrazka w takim stopniu na ile go zrealizowała ta procedura do momentu przerwania.
Ale jest wielkie ALE :)) żyjemy w państwie prawa i grzebanie w cudzym
dorobku nam nie przystoi no... jedynie możemy skorzystać ze źródła THarmFade jako wzorca, by coś napodobę zmajstrowaćj.:))
Przepraszam za długi monolog ale chciałbym jeszcze czymś się podzielić.
Otóż robiłem kiedyś biblioteczkę graficzną pod T Pascala (wys. rozdzielczości Hi kolor) i tam posiadam procedurkę na "półprzezroczystość " nazwaną "Filtruj"
Dumam sobie czy nie dałoby rady cały zamysł z tej procedury przenieść do Delphi. Oczywiście wykluczam instrukcje dotyczące XMS - ale myślałem by je zastąpić w Delphi ScanLine (pobieranie linii) , no i jakoś
resztę przerobić by była "strawna " dla Delphi.
Sam nie jestem orłem ale może ktoś.....
{----------- Rysuje obrazek o okreslonej przezroczystosci ----------------}
PROCEDURE TOBRAZEK.Filtruj(kl,ln:INTEGER;nrFiltra:BYTE;nazwaObiektu:TOBRAZEK;opcja:BOOLEAN);
var
x,y,pozX,pozY,sz,wy :INTEGER; {zmienne pozycji i rozmiarow obrazka}
sL,dL :^tempLineTAB;{zmienne pomocnicze}
p1,p2 :LONGINT; {zmienne dla pixeli}
r,g,b,rr,gg,bb :BYTE; {zmienne skladowych R,G,B}
Begin
{pobranie obszaru obrazka...}
pozX:=0; pozY:=0; sz:=nazwaObiektu.Szer; wy:=nazwaObiektu.Wys;
if kl+pozX<0 then pozX:=0-kl; {... i poprawianie ewentualnych bledow}
if ln+pozY<0 then pozY:=0-ln;
if kl+sz>Szer then sz:=Szer-kl;
if ln+wy>Wys then wy:=Wys-ln;
if sz<0 then sz:=0;
if wy<0 then wy:=0;
GetMem(sL,sz*Bpp);GetMem(dL,sz*Bpp); {pobiera pamiec na 2 linie}
if pozX<sz then
for y:=pozY to wy-1 do
begin {dla calego obrazu}
{pobiera linie zrodlowa}
PrzeniesBlokXMS(nazwaObiektu.Uchwyt,
POINTER((y*nazwaObiektu.Szer+pozX)*Bpp),0,sL,(sz-pozX)*Bpp);
{pobiera linie docelowa}
PrzeniesBlokXMS(Uchwyt,POINTER((pozX+kl+((ln+y)*Szer))*Bpp),0,dL, (sz-pozX)*Bpp);
{dla kazdego pixela na lini}
for x:=0 to sz-1-pozX do
begin
p1:=0; {zeruje pixel}
Move(sL^[x*Bpp],p1,Bpp);Move(dL^[x*Bpp],p2,Bpp); {pobiera pixel}
PobierzRGB(p1,r,g,b);PobierzRGB(p2,rr,gg,bb); {pobiera wartosci R,G,B}
{ustala ich srednie w odpowiednim zestawieniu %}
p2:=SzukajRGB((r*nrFiltra div 255)+(rr-rr*nrFiltra div 255),
(g*nrFiltra div 255)+(gg-gg*nrFiltra div 255),
(b*nrFiltra div 255)+(bb-bb*nrFiltra div 255));
Move(p2,dL^[x*Bpp],Bpp); {rysuje pixel}
end;
{rysuje zmieniona linie}
PrzeniesBlokXMS(0,dL,Uchwyt,POINTER((pozX+kl+((ln+y)*Szer))*Bpp),(sz-pozX)*Bpp);
end;
FreeMem(sL,sz*Bpp);FreeMem(dL,sz*Bpp);
if opcja=true then Ekran.PokazujObszar(kl,ln,sz,wy);
End;
//PS. odnośnie Delphi instrukcje do podmiany:
zmienna nrFiltra służy do podawania wartości przezroczystości 0-255
nazwaObiektu.Szer - to będzie odpowiednik Bitmap.Width itd....
PrzeniesBlokXMS - zastąpić poprzez ScanLine
PobierzRGB - tu instrukcja pobierania pixela z Delphi
itd.. itd...
Nie wiem czy ktoś mnie nie wyśmieje ?:-/ ale jeżeli znajdzie się jakaś
osoba chętna to mogłaby na to zerknąć a może nawet zrobić swój komponent w oparciu o tą "ideę"