在德尔福7

问题描述:

笔记本电脑什么,我试图做在德尔福7

我试图绘制多个图形到TImage中,这些图形是我画由具有Foodfills和线有序层的TImage透明胶片。 我使用多个缓冲区来确保排序和双缓冲。

我在做什么

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; 

我所期望

我希望看到层叠在彼此的顶部与每个图像层是对于该层中的完整的图像的每个图像对象。 即时通讯我的例子它是一个背后有一个国旗的机器人。 该标志首先被绘制,然后是机器人。

我得到什么(在PC上)

在电脑上我得到了我希望和所有似乎是正确的。

我得到什么(上一台笔记本电脑)

在一个几乎所有的笔记本电脑和一些PC的我只看到机器人。 我提出了一些说法,看看它是否绘制了国旗,它的确如此。游戏甚至可以以正确的方式与旗子进行交互。 进一步的调查表明我,这是只显示最后一个图像绘制我的“drawScene函数”,当图像被直接吸引到寄托都apeared的wholecanvas

是我认为(这不能重叠填充图层的理由来完成) HAPPENING

所以我推断是,TImage中的Timage.transparent财产不工作或正在计算不同在某些机器..

我做了一个测试来证明这一点,并提出了帆布红色。然后到那个画布上,我画了0,0 Timage属性透明= true,只有一个点在红色画布中间。结果是一个白色的画布,中间有一个点。

我假设和发现表明,具有非常基本的图形驱动程序的机器似乎将null或透明视为白色,而更强大的机器似乎将null或透明视为透明。

这似乎是有点失败的,由于事实Timage.Transparent属性为true。编辑: 更新! 这似乎是在ATI显卡上,如果颜色为“空白”,那么它将以PF24bit的格式进行解释,因此不会有Alpha通道,也不会透明。

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

解决该问题的一个显而易见的方法是将bitmaptype设置为PF32bit,但这仍然不起作用。 然后我认为这可能不够,我应该确保将背景设置为透明而不是保留为空。但Timage内部没有工具(我可以看到)用alpha设置颜色。所有的画布绘制功能都需要一个Tcolor,它是RGB 24位,并且具有一个TcolorRef和RGBA 32位可以做...... 有没有一种用alpha 0绘制的方法?

什么,我想我需要知道

如何强制透明财产上的所有机器 或工作方式,使笔记本电脑不是在透明粘贴为白色 或者一个方法来达到同样的效果。

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

+1

无论是笔记本电脑还是电脑都不应该这样,但屏幕分辨率,特别是颜色深度可能是。你可以检查这些东西,至少在两台机器上,其中一台工作,另一台不工作? – 2010-07-16 09:35:43

+0

另一个可能的问题是:您的笔记本电脑的屏幕可能无法显示您的颜色(例如:所有颜色的颜色都很淡),您觉得“透明度”的东西无法正常工作,而实际上它工作正常,没有看到它。大多数投影仪也会出现这种情况。如何测试:在PC上打印您的应用程序,保存到位图,将位图复制到笔记本电脑。或者反过来,在笔记本电脑上打印屏幕并检查PC上的位图。 – 2010-07-16 11:33:18

我一直在使用的图形库(AggPas),以帮助绘制图形和我注意到的事情之一是,我总是需要一个线Bitmap.PixelFormat = pf32bit得到它来绘制transparancies。

话虽如此我使用TransformImage从AggPas库到图像具有透明背景复制到另一个和AggPas只接受pf24bit或pf32bits作为像素格式(否则它不附着于位图)

我在过去(几​​年前)看到过类似的行为在不同的机器上。

他们是由不同的视频卡和驱动程序引起的。 无论是NVideo还是ATI都得到了错误的结果,但我忘了哪些。

它可以在笔记本电脑和普通PC上复制。

那么:你使用什么视频卡和驱动程序?

--jeroen

+0

这似乎是问题,经调查发现,一些与工作巴基因颜色深度相同的机器不工作,而且它无法显示的颜色包括白底黑字。但是当我看着视频驱动程序时,我发现所有工作的机器都有Nvidia驱动程序/卡和所有没有ATI的机器。有什么办法可以让东西工作吗? – Arthur 2010-07-16 12:31:03

+0

@Arthur:当时,我没有找到解决方案来实现它。但随后客户从基于ATI的机器移开,所以问题解决了。 – 2010-07-17 09:26:12

为了确保问题不是将颜色从32位转换为16位(如果这是创建位图的本地视频分辨率),这可能会影响透明度的工作方式,我会为每个位图创建位图格式为pf32bit。另外,我还特意设置了过去的透明色。

另一种选择 - 从长远来看可能是一个更好的选择,就是在图像上设置Alpha通道(即使用PNG文件),并使用GDI函数AlphaBlend()绘制图形。