我想做什么
我有一个绘图程序(它工作)它绘制到位图“OBJmap”然后将OBJmap放入Wholemap。这一切都有效,但存在问题。它似乎将objmap的未定义部分视为白色,即使objmap和wholemap设置为PF32Bit,因此当它将objmap放入整个地图时,我会在粘贴的图像后面得到一个应该是透明的白框。
这只发生在ATI机器上,但这适用于学校,他们都有100%的ati,因为它们很便宜(我没有偏见诚实),所以我被建议使用AggPas来解决这个问题。
我的代码
procedure DrawScene();
var
ObjLength,LineLength,Filllength,Obj,lin,angle,i,x1,y1,x2,y2:integer;
Npoints : array[0..1] of Tpoint;
WG,OG: Tagg2d;
Objmap,wholemap:TBitmap;
begin
//Set up WholeMap Bitmap
wholemap := TBitmap.Create;
wholemap.PixelFormat:=pf32bit;
wholemap.Transparent:=false;
wholemap.Width:=area;
wholemap.height:=area;
WG:= Tagg2d.create;
BitmapAlphaTransparency(wholemap, 0);
WG.attach(wholemap,False);
WG.ClearAll(255,0,0,255);
//BitmapAlphaTransparency(wholemap, 255);
//WG.MasterAlpha(255);
// itterate through each object drawing the object to OBJmap
ObjLength:=length(Objects);
for Obj:=0 to (ObjLength-1) do
if objects[Obj].Visible then
begin
//Set up Object map Bitmap
Objmap := TBitmap.Create;
Objmap.PixelFormat:=pf32bit;
Objmap.Transparent:=true;
Objmap.Width:=Objects[obj].Boundright-objects[obj].Boundleft+3;
Objmap.height:=Objects[obj].BoundTop-objects[obj].Boundbottom+3;
OG:= Tagg2d.create;
OG.attach(Objmap,False);
{OG.ClearAll(0,0,255,255); // Clears all bitmap to transparrent
OG.MasterAlpha(255);
OG.LineWidth(5);
og.AntiAliasGamma(255);
OG.
OG.LineColor(0,255,0,255);
OG.FillColor(0,255,0,255);
//OG.
OG.MoveTo(0,0);
OG.LineTo(Objmap.width-1,Objmap.height-1); }
//Draw the Lines to Objmap
LineLength:=length(objects[Obj].Lines)-1;
angle:=objects[Obj].Rotation;
for lin:=0 to (LineLength) do
begin
//Transform points
for i:=0 to 1 do
Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),point(-objects[obj].boundleft,-Objects[obj].Boundbottom),false);
//draw transformed points
Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap,OG);
end;
//Draw the Fills to Objmap
Filllength:=length(objects[Obj].Fills)-1;
for i:=0 to Filllength do
begin
//transform points
Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),point(-objects[obj].boundleft,-Objects[obj].Boundbottom),false);
// fill points
Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
end;
//draw objmap to wholemap
x1:=objects[obj].Position.x+objects[obj].Boundleft-1;
y1:=area-(objects[obj].Position.y+objects[obj].Boundtop)-2;
x2:=x1+Objmap.Width;
y2:=y1+Objmap.Height;
WG.TransformImage(Objmap,x1,y1,x2,y2); //this show border
//WG.copyimage(Objmap,x1,y1); //this draws the scene up but does not handle transparencies correctly
//wholemap.Canvas.Draw(x1,y1,Objmap);//does not work in PF32bit or on ati machines
//wg.Free; // this it does not like (crash) do i need it?
Objmap.Free;
end;
// write wholemap to Visible Canvas
mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
wholemap.Free;
mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;
end;
图片示例
不工作,工作,当前分别
我只能使用默认
在Nvidia机器上获得工作结果wholemap.Canvas.Draw
方法和我希望使用aggpass在所有机器上工作。
我该怎么做如何将objmap绘制到整个地图上但不绘制透明位?
答案 0 :(得分:2)
尝试BitmapAlphaTransparency(整个地图,0);在WG.attach之前。
答案 1 :(得分:2)
我遇到了同样的问题,你需要在调用Transform Image
之前设置BlendModeWG.BlendMode(AGG_BlendSrcTop);
这对我有用,但在得到正确的答案之前你可能需要尝试几种混合模式。