2009-12-02 4 views
3

J'ai un composite et j'aimerais utiliser un fichier png comme image de fond. Je peux le faire, le problème est lorsque l'image utilise la transparence, il ne fonctionne pas et montre une couleur blanche à la place. Des idées sur la façon de faire fonctionner cela?Image PNG avec transparence sur SWT

Merci!

Répondre

3

Cet article vous aide-t-il?

Taking a look at SWT Images

Il parle de dessiner une image (quoique GIF) à un Canvas avec transparence (Canvas étend Composite).

+0

Les PNG semblent fonctionner aussi en utilisant la même technique. –

1

RÉSOLU! J'ai résolu exactement ce problème - l'affichage des fichiers PNG qui contiennent des zones transparentes. Je ne pouvais pas l'utiliser avec les étiquettes (en fait, le article quoted indique que «l'étiquette ne prend pas en charge la transparence native»), j'ai donc placé l'image directement dans un canevas. L'autre clé du succès consiste à utiliser le constructeur Image qui inclut un troisième paramètre, qui est le masque de transparence. Une étape supplémentaire que j'ai faite consiste à appeler setRegion, ce qui signifie que les événements de la souris (tels que les clics de souris) ne se déclenchent que lorsqu'ils surviennent sur des pixels visibles.

ImageData id = new ImageData("basket.png"); 
Image image = new Image (display, id, id); //3rd parameter is transparency mask 
Canvas c = new Canvas (shell, SWT.TRANSPARENT); 
c.addPaintListener(
    new PaintListener(){ 
     public void paintControl(PaintEvent e) 
     { 
      e.gc.drawImage(image, 0, 0); 
     } 
    } 
); 

//the image has been created, with transparent regions. Now set the active region 
//so that mouse click (enter, exit etc) events only fire when they occur over 
//visible pixels. If you're not worried about this ignore the code that follows 
Region region = new Region(); 
Rectangle pixel = new Rectangle(0, 0, 1, 1); 
for (int y = 0; y < id.height; y++) 
{ 
    for (int x = 0; x < id.width; x++) 
    { 
     if (id.getAlpha(x,y) > 0) 
     { 
      pixel.x = id.x + x; 
      pixel.y = id.y + y; 
      region.add(pixel); 
     } 
    } 
} 
c.setRegion(region); 
Questions connexes