gpt4 book ai didi

delphi - Delphi 7 笔记本电脑上的 Timage 透明胶片

转载 作者:行者123 更新时间:2023-12-03 15:27:58 26 4
gpt4 key购买 nike

我正在尝试做什么

我正在尝试将多个图形绘制到 Timage,我绘制的这些图形由带有 Foodfills 和线条的有序图层组成。我使用多个缓冲区来确保排序和双缓冲。

我在做什么

    procedure DrawScene();
var
ObjLength,LineLength,Filllength,Obj,lin,angle,i:integer;
Npoints : array[0..1] of Tpoint;
Objmap:TBitmap;
wholemap:TBitmap;

begin
wholemap := TBitmap.Create;
wholemap.Width:=area;
wholemap.height:=area;

ObjLength:=length(Objects);
for Obj:=0 to (ObjLength-1) do
if objects[Obj].Visible then
begin
// create object bitmap

if Objects[obj].Tag='FBOX' then
begin

Objmap := TBitmap.Create;
Objmap.Width:=area;
Objmap.height:=area;
Objmap.Transparent:=true;

Objmap.Canvas.Rectangle((objects[obj].Boundleft-4)+objects[obj].Position.x,area-((objects[obj].boundtop+4)+objects[obj].Position.y),(objects[obj].boundright+4)+objects[obj].Position.x,area-((objects[obj].boundbottom-4)+objects[obj].Position.y));
end;
//draw object
LineLength:=length(objects[Obj].Lines)-1;
angle:=objects[Obj].Rotation;
for lin:=0 to (LineLength) do
begin
for i:=0 to 1 do
begin
Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),objects[obj].Position,false);
end;
Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap);
end;


Filllength:=length(objects[Obj].Fills)-1;
for i:=0 to Filllength do
begin
Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),objects[Obj].Position,false);
Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
end;

//write object to step frame
wholemap.Canvas.Draw(0,0,Objmap);
Objmap.Free;


end;
// write step frame to Visible Canvas
mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;


wholemap.Free;

end;

我的期望

我希望看到每个图像对象彼此层叠,每个图像层都是该层的完整图像。我的例子是一个机器人,后面有一面旗帜。首先绘制旗帜,然后绘制机器人。

我得到了什么(在电脑上)

在电脑上我得到了我所期望的结果,并且一切似乎都是正确的。

我得到了什么(在笔记本电脑上)

在几乎所有笔记本电脑和某些电脑上,我只能看到机器人。我输入了一些语句来查看它是否正在绘制旗帜,并且确实如此。游戏甚至可以以正确的方式与旗帜互动。进一步的调查表明,它只显示了我的“绘图场景”中绘制的最后一个图像,并且当图像直接绘制到整个 Canvas 时,所有内容都出现了(由于重叠填充层的原因,这不能完成)

我认为正在发生的事情

所以我推断 Timage 的 Timage.transparent 属性不起作用或者在某些机器上计算方式不同..

我做了一个测试来证明这一点,并将 Canvas 设为红色。然后到我在 0,0 i Timage 处绘制的 Canvas ,属性透明=true,红色 Canvas 中间只有一个点。结果是一 block 白色 Canvas ,中间有一个点。

我假设和调查结果表明,具有非常基本的图形驱动程序的机器似乎将空或透明视为白色,而功能更强大的机器似乎将空或透明视为透明。

由于 Timage.Transparent 属性为 true,这似乎有点失败。

编辑:更新!!!在 ATI 显卡上,如果颜色为“空”,则它会以 PF24 位格式解释,因此没有 Alpha channel ,也没有透明度。

在 Nvidia 卡上,它将其视为 PF32bit 并将 null 视为透明。

解决这个问题的明显方法是将位图类型设置为 PF32bit,但这仍然不起作用。然后我假设这可能还不够,我应该确保背景设置为透明而不是保留为空..但是 Timage 内部没有工具(我可以看到)来使用 alpha 设置颜色。所有 Canvas 绘图函数都需要 RGB 24 位的 Tcolor,只有 RGBA 32 位的 TcolorRef 才可以......有没有办法用 alpha 0 绘图?

我认为我需要知道什么

如何强制透明属性在所有机器上工作或者一种使笔记本电脑不粘贴为透明白色的方法或者达到相同结果的方法。

有人有任何解决方案或想法吗?

最佳答案

我一直在使用图形库 (AggPas) 来帮助绘制图形,我注意到的一件事是我总是需要一行 Bitmap.PixelFormat = pf32bit 来获取它绘制透明胶片。

话虽如此,我使用 AggPas 库中的 TransformImage 将具有透明背景的图像复制到另一个图像,并且 AggPas 只接受 pf24bit 或 pf32bits 作为像素格式(否则它不会附加到位图)

关于delphi - Delphi 7 笔记本电脑上的 Timage 透明胶片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com