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
| type
TRGBArray = ARRAY[0..0] OF TRGBTriple; // élément de bitmap (API windows)
pRGBArray = ^TRGBArray; // type pointeur vers tableau 3 octets 24 bits
function Superposer2Bmp(BmpTexte,BmpLogos : tBitMap; CoulFondTexte : tColor) : tBitMap;
var k1,k2 : Extended;
S1,S2,SR : array[0..2047] of pRGBArray;
R1,G1,B1 : byte; cl1 : tColor; //<- Composantes et couleur du pixel courant sur BmpTexte
x,y : integer; Point : tPoint;
begin if (BmpTexte.width <> BmpLogos.width) or (BmpTexte.height <> BmpLogos.height) then
begin showMessage('Bmp1 et Bmp2 : doivent être de même taille');
Result:=nil;
EXIT;
end;
Result:=tBitMap.Create;
With Result do
begin width:=BmpTexte.width; height:=BmpTexte.height; pixelformat:=pf24bit; end;
for y:=0 to BmpTexte.Height-1 do
begin S1[y]:= BmpTexte.ScanLine[y];
S2[y]:= BmpLogos.ScanLine[y];
SR[y]:= Result.ScanLine[y];
for x:=0 to BmpTexte.Width-1 do
begin R1:=S1[y,x].rgbtRed; G1:=S1[y,x].rgbtGreen; B1:=S1[y,x].rgbtBlue;
cl1:=RGB(R1,G1,B1);
if cl1<>CoulFondTexte // si cl1 <> CoulFondTexte alors le pixel appartient à du texte
then begin k1:=1; k2:=0; end
else begin k2:=1; k1:=0; end;
SR[y,x].rgbtRed :=trunc(k1*S1[y,x].rgbtRed + k2*S2[y,x].rgbtRed);
SR[y,x].rgbtGreen:=trunc(k1*S1[y,x].rgbtGreen + k2*S2[y,x].rgbtGreen);
SR[y,x].rgbtBlue :=trunc(k1*S1[y,x].rgbtBlue + k2*S2[y,x].rgbtBlue);
end;
end;
end; |
Partager