CE QUE JE SUIS en train de faireTImage Transparents sur les ordinateurs portables à Delphi 7
Je suis en train de dessiner plusieurs graphiques à un TImage, ces graphiques que je Draw se composent de couches ordonnées avec Foodfills et lignes. J'utilise plusieurs tampons pour assurer l'ordre et la double mise en mémoire tampon.
ce que je fais
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;
ce que j'attends
je voir chaque objet d'image en couches sur le dessus les uns des autres, chaque couche d'image étant l'image complète de cette couche . im mon exemple c'est un robot avec un drapeau derrière. le drapeau est dessiné en premier, puis le robot.
ce que je reçois (sur un PC)
sur un pc-je obtenir ce que je pense et tout semble correct.
ce que je reçois (sur un ordinateur portable)
Sur près de tous les ordinateurs portables et certains PC, je ne vois que le robot. J'ai mis dans quelques déclarations pour voir si elle dessine le drapeau et c'est le cas. le jeu peut même interagir avec le drapeau de la manière correcte. une enquête plus approfondie m'a montré qu'il était seulement montre la dernière image tirée de mon « drawscene », et lorsque les images ont été tirées directement aux wholecanvas everthing apeared (cela ne peut être fait pour chevauchement remplir des raisons couches)
QU'EST-CE QUE JE PENSE EST EVENEMENT
donc ce que je déduis est que la propriété Timage.transparent du TImage ne fonctionne pas ou est en cours de calcul différemment sur certaines machines ..
je l'ai fait un test pour prouver et fait une rouge toile. Puis à cette toile j'ai dessiné à 0,0 i Timage avec la propriété transparent = true avec juste un point au milieu de la toile rouge. le resuly était une toile blanche avec un point au milieu. Je suppose et les résultats indiquent que les machines avec des pilotes graphiques très basiques semblent traiter le blanc ou le transparent comme du blanc, alors que des machines plus puissantes semblent traiter le NULL ou le transparent comme transparent.
Cela semble être un peu un échec en raison du fait que la propriété Timage.Transparent était vraie.
EDIT: MISE À JOUR !!! Il semblerait que sur les cartes graphiques ATI si une couleur est "nulle" alors elle est interprétée dans le format de PF24bit et donc pas de canal alpha et pas de transparence.
sur les cartes Nvidia il prend comme PF32bit et traite null comme transparent.
la façon évidente de contourner cela serait de définir le bitmaptype à PF32bit, mais cela ne fonctionne toujours pas. J'ai alors supposé que peut-être cela ne suffisait pas et je devrais m'assurer que l'arrière-plan est réglé sur transparent au lieu d'être laissé comme nulle.mais il n'y a pas d'outils (que je peux voir) dans le Timage pour définir la couleur avec alpha. toutes les fonctions de dessin de toile nécessitent un Tcolor qui est RVB 24 bits et ony un TcolorRef avec RGBA 32 bit ferait .... y at-il un moyen de dessiner avec alpha 0?
QU'EST-CE QUE JE CROIS QUE JE SAVOIR
Comment forcer la propriété Transparent pour travailler sur toutes les machines ou un moyen de rendre les ordinateurs portables coller pas transparent blanc Ou un moyen d'atteindre le même résultat .
Quelqu'un a des solutions ou des idées?
Que ce soit un ordinateur portable ou un PC ne devrait pas être pertinent en tant que tel, mais la résolution de l'écran et surtout la profondeur de couleur est probablement. Pouvez-vous vérifier ces choses, au moins sur deux machines, l'une sur laquelle il fonctionne et l'autre sur laquelle il ne fonctionne pas? –
Un autre problème possible: l'écran de votre ordinateur portable peut être incapable d'afficher vos couleurs (exemple: très légères nuances de toutes les couleurs) et il semble que le truc "Transparence" ne fonctionne pas, alors qu'en fait il fonctionne, mais vous Je ne le vois pas. Cette même chose arrive avec la plupart des projecteurs. Comment tester: imprimer votre application sur le PC, enregistrer en bitmap, copier des bitmaps sur un ordinateur portable. Ou l'inverse, imprimez l'écran sur votre ordinateur portable et vérifiez le bitmap sur PC. –