Cześć :))
Ja tam już mam swoją "półprzezroczystość"
Właściwy kod wpakowałem w osobny moduł (przyda się do różnych programików)
Podaję go poniżej razem z kodem programiku demonstrującego :))
//Moduł: modBitmap
UNIT modBitmap;
INTERFACE
Uses Windows,SysUtils,Graphics;
//Procedura rozkłada kolor na składowe RGB
PROCEDURE GetRGB(col:TCOLOR; var r,g,b:BYTE);
//Funkcja pobiera wspólny kolor pixela z dwu podanych kolorów
FUNCTION GetPixFilter(col,colBackground:TCOLOR; Filter:BYTE):TCOLOR;
//Procedura filtrująca Bitmapę (półprzezroczystość)
PROCEDURE FiltrujBMP(pozX,pozY:INTEGER;
bitmapSrc,bitmapTlo:TBITMAP; Filter:BYTE);
VAR
BitmapDST :TBitmap;
IMPLEMENTATION
{==== Procedura rozkłada kolor na składowe RGB =====}
PROCEDURE GetRGB(col:TCOLOR; var r,g,b:BYTE);
Begin
R:= GetRValue(col);
G:= GetGValue(col);
B:= GetBValue(col);
End;
{= Funkcja pobiera wspólny kolor pixela z dwu podanych kolorów ===}
FUNCTION GetPixFilter(col,colBackground:TCOLOR; Filter:BYTE):TCOLOR;
var
r,g,b,r2,g2,b2 :BYTE;
Begin
//rozkład koloru pixela pobranego z obrazka
GetRGB(col, r,g,b);
//rozkład koloru pixela z podanego tła obrazka
GetRGB(colBackground, r2,g2,b2);
//ustalenie średniej koloru w odpowiednim zestawieniu %
R:= (r * Filter div 255) + (r2-r2 * Filter div 255);
G:= (g * Filter div 255) + (g2-g2 * Filter div 255);
B:= (b * Filter div 255) +( b2-b2 * Filter div 255);
Result:=RGB(R, G, B);
End;
{=== Procedura filtrująca Bitmapę (półprzezroczystość) =====}
PROCEDURE FiltrujBMP(pozX,pozY:INTEGER; bitmapSrc,bitmapTlo:TBITMAP; Filter:BYTE);
var
kl,ln :INTEGER;
Pba1,Pba2,Pba3 :PByteArray;
Begin
BitmapDst.Assign(bitmapSrc); //przepisanie zawartości bitmap
for ln:=0 to BitmapDst.Height-1 do
begin
try
Pba1:=bitmapSrc.ScanLine[ln]; //skan linii z bitmapy żródłowej
Pba2:=bitmapTlo.ScanLine[ln+pozY]; //skan linii z bitmapy tła
Pba3:=BitmapDst.ScanLine[ln]; //skan linii dla bitmapy docelowej
except
end;
kl:=0;
repeat
//ustawia wartość pośrednią dla pix. bitmapy docelowej (BitmapDst)
Pba3[kl]:=GetPixFilter(Pba1[kl],Pba2[kl+pozX * 3],Filter);
Inc(kl);
until kl > bitmapDst.Width * 3; //mnożnik dla bitmap 24 bitowych
end;
bitmapTlo.Canvas.Draw(pozX,pozY,BitmapDst); //przerysowanie
End;
{-- Instrukcje do wykonania podczas załadowania modułu ----}
INITIALIZATION
bitmapDst:= TBitmap.Create; //wykreowanie bitmapy obrazka po "sfiltrowaniu"
{-- Instrukcje do wykonania podczas zakończenia pracy modułu -------}
FINALIZATION
bitmapDst.Free //zwolnienie bitmapy obrazka po "sfiltrowaniu"
END.
Unit FiltrujBitmapeForm;
INTERFACE
Uses
modBitmap, //moduł zawiera procedury do "półprzezroczystości"
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
btnFiltruj: TButton;
PROCEDURE btnFiltrujClick(Sender: TObject);
PROCEDURE FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
VAR
Form1: TForm1;
Obrazek,Obrazek2,ObrazekTlo :TBitmap;
IMPLEMENTATION {$R *.dfm}
//********************************************************
//Kreowanie okna a zarazem wczytanie obrazków do zmiennych
PROCEDURE TForm1.FormCreate(Sender: TObject);
Begin
ObrazekTlo:= TBitmap.Create; //bitmapa obrazka jako tła
ObrazekTlo.LoadFromFile('Tło.bmp');
Obrazek:= TBitmap.Create; //bitmapa obrazka1 do "sfiltrowania"
Obrazek2:= TBitmap.Create; //bitmapa obrazka2 do "sfiltrowania"
Obrazek.LoadFromFile('Obrazek.bmp');
Obrazek2.LoadFromFile('Obrazek2.bmp');
End; //ok.
{tu klikając na button pojawiają się "półprzezroczyste" obrazki na tle }
PROCEDURE TForm1.btnFiltrujClick(Sender: TObject);
var
Filtr1,Filtr2:Byte;
Begin
Filtr1:=StrToInt(Edit1.Text); //1-sza wartość pobrana z edita (0-255)
Filtr2:=StrToInt(Edit2.Text); //2-ga wartość pobrana z edita (0-255)
{pobranie "orginalnego" obrazka tła - można by to robić z
jakiejś przygotowanej zmiennej np: obrazekTloOrg zamiast ciągłego
wczytywania z dysku :)) }
ObrazekTlo.LoadFromFile('Tło.bmp');
{używając poniższego pobierasz tło pulpitu
ObrazekTlo.canvas.handle:=GetWindowDC(GetDesktopWindow); }
{rysowanie na tle obrazka , "półprzezroczystych" obrazków
- podając kolumne,linie obrazek do sfiltrowania oraz sam filtr }
FiltrujBMP(100,20,obrazek,ObrazekTlo,Filtr1); //tu wartość z edita
FiltrujBMP(140,30,obrazek2,ObrazekTlo,Filtr2); //tu wartość z edita
{narysowanie już gotowego tła z "półprzezroczystymi" obrazkami}
Image1.Canvas.Draw(0,0,ObrazekTlo); {narysowanie obrazka "półprzezroczystego"}
{używając poniższego rysujesz półprzezroczyte bitmapy na pulpicie
ObrazekTlo.canvas.handle:=GetWindowDC(GetDesktopWindow); }
End; //ok.
{PS. można dawać obrazków ile się chce, zmieniać pozycje, filtr ,
dawać opcję obrazek.Transparent:=true i tu Baterman możesz umieścić
obrazek wielokąta :)) wyjdzie sam wielokąt bez tła
a na koniec to wszystko odświeżać "Image1.Canvas.Draw(0,0,ObrazekTlo)" }
END.
Czuje pismo nosem że można to na wszelkie sposoby wykorzystywać :))
i dla TImage i dla pulpitu - może nawet i dla formy :)) łącząc to z
regionami - kto chętny niech to zmienia bo ja orłem nie jestem :))