2010-07-16 169 views
4

筆記本電腦什麼,我試圖做在德爾福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

回答

2

我一直在使用的圖形庫(AggPas),以幫助繪製圖形和我注意到的事情之一是,我總是需要一個線Bitmap.PixelFormat = pf32bit得到它來繪製transparancies。

話雖如此我使用TransformImage從AggPas庫到圖像具有透明背景複製到另一個和AggPas只接受pf24bit或pf32bits作爲像素格式(否則它不附着於位圖)

2

我在過去(幾​​年前)看到過類似的行爲在不同的機器上。

他們是由不同的視頻卡和驅動程序引起的。 無論是NVideo還是ATI都得到了錯誤的結果,但我忘了哪些。

它可以在筆記本電腦和普通PC上覆制。

那麼:你使用什麼視頻卡和驅動程序?

--jeroen

+0

這似乎是問題,經調查發現,一些與工作巴基因顏色深度相同的機器不工作,而且它無法顯示的顏色包括白底黑字。但是當我看着視頻驅動程序時,我發現所有工作的機器都有Nvidia驅動程序/卡和所有沒有ATI的機器。有什麼辦法可以讓東西工作嗎? – Arthur 2010-07-16 12:31:03

+0

@Arthur:當時,我沒有找到解決方案來實現它。但隨後客戶從基於ATI的機器移開,所以問題解決了。 – 2010-07-17 09:26:12

1

爲了確保問題不是將顏色從32位轉換爲16位(如果這是創建位圖的本地視頻分辨率),這可能會影響透明度的工作方式,我會爲每個位圖創建位圖格式爲pf32bit。另外,我還特意設置了過去的透明色。

另一種選擇 - 從長遠來看可能是一個更好的選擇,就是在圖像上設置Alpha通道(即使用PNG文件),並使用GDI函數AlphaBlend()繪製圖形。