2010-10-09 28 views
0

J'ai une application Delphi 6 où j'ai un tableau de TBitmaps contenant chacun une image (sous-image) qui a été créée en faisant un appelez FillRect() avec clWhite pour inonder le Canvas de TBitmap avec du blanc, suivi d'un appel àTextOut() pour imprimer du texte sur le Canvas du Bitmap.Delphi 6: Alphablending fonctionne entre sous-image et Canvas principal, mais pas entre sous-images

J'ai une minuterie qui met à jour le canevas principal, qui appartient à un composant TImage, avec le contenu du tableau chaque intervalle pour refléter les modifications apportées aux coordonnées X, Y des sous-images depuis qu'elles sont en mouvement. D'abord, j'utilise FillRect() avec clWhite pour inonder le Canvas principal de blanc. Pour "imprimer" les sous-images je simplement itérer le tableau et appeler Alphablend() pour "imprimer" chaque sous-image sur le canevas principal. Chaque sous-image a une coordonnée Z qui est utilisée pour contrôler le niveau d'opacité. Les sous-images avec des coordonnées Z plus élevées ont une valeur Alphablend() inférieure pour les rendre plus transparentes que celles qui sont «de près». Le mélange alpha fonctionne parfaitement avec chaque sous-image et ceux qui ont des coordonnées plus élevées semblent en effet être plus transparents que ceux avec des coordonnées Z plus faibles. Cependant, j'ai un problème avec les sous-images qui se chevauchent dans l'espace Z. L'alpha-mélange entre sous-images qui se chevauchent ne semble pas fonctionner. Au lieu de cela, la sous-image "derrière" la sous-image se chevauchant est masquée par le fond blanc appartenant à l'image qui la recouvre. Ce que je veux, c'est que les deux sous-images se chevauchent correctement, donc il semble que deux chaînes de texte soient écrites les unes sur les autres. Au lieu de cela, je vois la chaîne de texte frontale et partout le fond blanc qui comprend son Canevas TBitmap, effaçant la chaîne de texte "derrière".

Quelqu'un peut-il me dire pourquoi le mélange alpha fonctionne entre chaque sous-image individuelle et le canevas principal, mais pas entre les sous-images? Je dis entre sous-images seulement dans un contexte temporel et non comme des objets parce qu'ils devraient tous faire partie du canevas principal pendant qu'ils impriment et je m'attendrais à ce que l'alpha-mélange les mélange correctement, ce qui ne se produit pas. C'est presque comme si le "blanc" entre les sous-images n'était pas traité comme le "blanc" entre une sous-image et le "blanc" appartenant au canevas principal. SUIVI: En réponse au commentaire d'Andreas, j'ai mis le PixelFormat de toutes les images TBitmap de sous-image à pf32bit. Maintenant, l'alpha-blending se déroule "entre" les sous-images. Malheureusement, les zones blanches de la sous-image ne sont pas traitées comme une couleur transparente. Au lieu de cela, le fond blanc de la sous-image qui est en haut est en alpha-fusion avec le texte appartenant à la sous-image sous-jacente créant un cadre gris clair autour de la sous-image sur le dessus comme si elle était étalée. Pour obtenir l'effet désiré, j'ai besoin que le fond blanc d'une sous-image soit complètement ignoré.

+2

Je pense que vous devriez donner le code et les instructions pour reproduire le problème, aussi peu que possible. Ensuite, vous obtiendrez probablement une réponse très précise plutôt rapidement. Maintenant, nous ne pouvons que deviner (par exemple "Avez-vous essayé de jouer avec' PixelFormat'? "). –

+0

Ok Andreas. Je vais aller travailler quelque chose. J'ai mis à jour ma description du problème car il semble que depuis que je mets le PixelFormat de toutes les sous-images à pf32bit, l'alpha-blending a lieu entre les sous-images. Malheureusement, les zones blanches de la sous-image ne sont pas traitées comme transparentes. Ainsi, au lieu de l'image de sous-image qui masque complètement une sous-image sous-jacente dans l'espace Z, elle est mélangée avec le texte de la sous-couche. -image, créant un cadre gris barbouillé autour de la sous-image qui est "sur le dessus". –

Répondre

1

Si vous souhaitez afficher certaines images avec Alphablending, essayez d'utiliser la bibliothèque Graphics32. Dans ce cas, vous trouverez un composant "ImgView32". Avec celui-ci, vous pouvez facilement montrer n'importe quel type de bitmaps avec n'importe quelle position et valeur alpbablend. Vous devez utiliser TBitmapLayer et faire vos dessins pour eux.

ImgView1:TImgView32; 
a:array of TBitmapLayer; 

procedure TForm1.FormCreate(Sender: TObject); 
    var i:integer; 

    begin 
    ImgView1.Layers.Clear; 
    SetLength (a,10); 
    for i:=0 to High (a) do 
     begin 
     a[i]:=TBitmapLayer.Create(ImgView1.Layers); 
     a[i].Location:=FloatRect(0,0,ImgView1.Width,ImgView1.Height); 
     a[i].Scaled:=false; 
     a[i].Bitmap.DrawMode:=dmOpaque; 
     a[i].Bitmap.MasterAlpha:=255; 
     end; 
    end; 

procedure TForm1.FormDestroy(Sender: TObject); 
    begin 
    ImgView1.Layers.Clear; 
    end; 

procedure Form1.DrawTextToLayer(Layer:TBitmapLayer;Text:string;X,Y:integer); 
var I:TImage32; 

begin 
    I:=TImage32.Create(Form1); 
    I.Width:=ImgView1.Width; 
    I.Height:=ImgView1.Height; 
    I.SetupBitmap; 
    I.Bitmap.DrawMode:=dmBlend; 
    I.Bitmap.Font.Size:=20; 
    I.Bitmap.Font.Name:='Arial'; 
    I.Bitmap.Font.Style:=[fsBold]; 
    I.Bitmap.RenderText(x,Y,Text,2,clBlack32); 
    Layer.Bitmap.Assign(I.Bitmap); 
    I.Free   
end; 

procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    DrawTextToLayer(a[0],'Testing 1',10,10); 
    DrawTextToLayer(a[1],'Testing 2',20,20); 
    a[0].Bitmap.MasterAlpha:=255; 
    a[1].Bitmap.MasterAlpha:=100; 
    end;