Добрался до векторных....
мой "велосипед", "на ходу"
- Код: Выделить всё
[code]
// uses IntfGraphics;
procedure GlassDraw(Dest, Sours: TBitmap; percent: integer; TransParantColor:Tcolor=clWhite);
//"прозрачная" отрисовка картинки Sours по картинке Dest,
//max(percent)=255-прозрачное(невидимое), 0-непрозрачное TransParantColor-"невидимый" цвет
type
TRGBTripleArray = array[0..32767] of TRGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
var x, y, i:integer;
sr:TColor;
R, G, B: Byte;
k, k1:single;
R1:TRect;
Row1, Row2: PRGBTripleArray;
ImgHandle, ImgMaskHandle: HBitmap;
iDest, iSours: TLazIntfImage;
begin
if percent>255 then percent:=255;
if percent<0 then percent:=0;
k1:=percent/255;
k:=1-k1;
R1:=Rect(0,0,Sours.Width-1, Sours.Height-1);
iDest:= TLazIntfImage.Create(0,0);
iSours:= TLazIntfImage.Create(0,0);
iDest.LoadFromBitmap(Dest.Handle,Dest.MaskHandle);
// iDest.LoadFromDevice(Canvas.Handle .... не пробовал
iSours.LoadFromBitmap(Sours.Handle,Sours.MaskHandle);
for y:=0 to Sours.Height-1 do
begin
Row1 := iDest.GetDataLineStart(y); //like Delphi TBitMap.ScanLine
Row2 := iSours.GetDataLineStart(y); //like Delphi TBitMap.ScanLine
for x:=0 to Sours.Width-1 do
begin
r:=Row2^[x].rgbtRed; g:=Row2^[x].rgbtGreen; b:=Row2^[x].rgbtBlue;
sr:=RGBToColor(r, g, b);
// sr:=Sours.Canvas.Pixels[x,y];
if sr=TransParantColor then continue;
// conv.i32_1:=sr;
// r:=conv.b8_1; g:=conv.b8_2; b:=conv.b8_3;//компоненты// r:=Red(sr); g:=Green(sr); b:=Blue(sr);//компоненты
//r:=trunc((255-r)*k)+r; g:=trunc((255-g)*k)+g; b:=trunc((255-b)*k)+b;//прозрачный аргис !!! правильно
// i= k·Iб + (1-k)·Iд,
//где 0 Ј k Ј 1 - характеризует прозрачность ближнего многоугольника. Если k = 1, то он непрозрачен.
//Если же k = 0, то ближний многоугольник полностью прозрачен; Iб - интенсивность для пиксела ближнего многоугольника, Iд - дальнего.
i:=trunc((r*k)+Row1^[x].rgbtRed*k1); if i>$ff then i:=$ff else if i<0 then i:=0; r:=i;
i:=trunc((g*k)+Row1^[x].rgbtGreen*k1); if i>$ff then i:=$ff else if i<0 then i:=0; g:=i;
i:=trunc((b*k)+Row1^[x].rgbtBlue*k1); if i>$ff then i:=$ff else if i<0 then i:=0; b:=i;
Row1^[x].rgbtRed:=R;
Row1^[x].rgbtGreen:=g;
Row1^[x].rgbtBlue:=b;// dest.Canvas.Pixels[x,y]:=RGBToColor(r, g, b);
end;
end;
Dest.LoadFromIntfImage(iDest);
iDest.Free;
iSours.Free;
end;
[/code]
код вызова
var zBuf, Buf: TBitmap;
.............
for i:=0 to High(DrawLayers) do
begin
R:=Rect(0,0,FDrawParam.CanvasSize.x-1, FDrawParam.CanvasSize.y-1);
if zBuf.Height<>Height then zBuf.Height:=Height;
if zBuf.Width<>Width then zBuf.Width:=Width;
zBuf.Canvas.Pen.Width:=1;
zBuf.Canvas.Pen.Color:=TransParantColor;
zBuf.Canvas.Pen.Style:=psSolid;
zBuf.Canvas.Brush.Color:=TransParantColor;
zBuf.Canvas.Brush.Style:=bsSolid;
zBuf.Canvas.FillRect(R);
DrawLayers[i].Draw(zBuf.Canvas, @FDrawParam);
GlassDraw(buf, zBuf, DrawLayers[i].CanPar.Glass, TransParantColor);
end;
Canvas.Draw(0,0, buf);
..........................
Canvas- канва потомка TCustomControl
создаётся эффект прозрачности слоя как у аргиса, быстродействие приемлемое, память не ест, битмапы создаются 1 раз, при ресайзе компонента подгоняются их размеры. Создан на основе тутошнего примера.