ich habe das jetzt mit OpBitMap versucht:
Code: Alles auswählen
procedure DrawTranzParentRectImage(aBuffer:TBitMap; aBuffer2,abuffer3:TBitMap; const left, top:Integer);
var
Hintergrund:TOPPicture;
ah,b2:TCanvasOPBitmap;
begin
Hintergrund:=TOPPicture.Create;
AssignBitmapToOpBitmap(abuffer2,Hintergrund.Bitmap);
b2:=TCanvasOPBitmap.Create;
AssignBitmapToOpBitmap(abuffer,b2);
ah:=TCanvasOPBitmap.Create;
// ah.AlphaBlend:=True;
ah.Width:=abuffer.Width; ah.Height:=abuffer.Height;
ah.Canvas.Brush.Color:=clWhite;
ah.Transparent:=True;
ah.TransparentColor:=clWhite;
ah.Canvas.Draw(left,top,b2);
Hintergrund.Bitmap.Transparent:=True;
Hintergrund.Bitmap.TransparentColor:=clWhite;
Hintergrund.Bitmap.Canvas.Draw(left,Top, ah);
AssignOpBitmapToBitmap(Hintergrund.Bitmap,aBuffer3);
Hintergrund.Free; ah.Free; b2.free;
end;
so geht es leider nicht..... es gibt Grafik Fehler
edit01:
Code: Alles auswählen
procedure TPluto2DSprite.DrawTrazparent;
var
x,y:Integer;
tmp:TBitMap;
r1,r2:TRect;
begin
tmp:=TBitMap.Create; tmp.Width:=Width; tmp.Height:=Height;
BitBlt(tmp.canvas.Handle,0,0,Width,Height,BackupBuffer.canvas.Handle,left,top,SRCCOPY);
for y:=0 to Height do begin
for x:=0 to Width do begin
if SpriteImage.Canvas.Pixels[x,y] <> TranzparentColor then begin
tmp.Canvas.Colors[x,y]:=SpriteImage.Canvas.Colors[x,y];
//BackupBuffer.Canvas.Pixels[left+x,top+y]
end; // if
end // x
end; // y
buffer.canvas.Draw(left,top,tmp);
OutCanvas.Draw(left,top,tmp);
end;
so geht das zwar wie gewünscht, aber es ist zu langsam.
Backupbuffer ist der Hintergrund, Outcanvas ist eine Paintbox, SpriteImage Enthält die Grafik /Figur die gezeichnet werden muss.
zuerst wird der Teil vom Hintergrund in TMP gezeichnet und jetzt wird der Teil von SpriteImage die nicht Trazparent sind kopiert.
ich hatte das auch noch mal anders herum aber leider genauso langsam.
Aber wie geht denn draw ? das macht es doch genauso...
edit01:
Code: Alles auswählen
procedure TFPCustomCanvas.Draw (x,y:integer; image:TFPCustomImage);
var xx,xi,yi,xm,ym,r,t : integer;
begin
xm := x + image.width-1;
if xm >= width then
xm := width - 1;
ym := y + image.height-1;
if ym >= height then
ym := height - 1;
xi := x;
yi := y;
if clipping then
CheckRectClipping (ClipRect, xi,yi, xm,ym);
for r := xi to xm do
begin
xx := r - x;
for t := yi to ym do
colors [r,t] := image.colors[xx,t-y];
end;
end;
so macht es Lazarus, also Praktisch genauso wie ich...
edit03: was heißt das auf deutsch ?
ransparent - Some parts of the image are not opaque. aka the background
can be seen through.