2009-02-10 13 views
4

D2009 introduit la prise en charge PNG pour les images et les listes d'images.PNG dans Delphi 2009 Imagelists et images

Mais ...

J'ai une liste d'images contenant des images .png avec alpha. Je veux placer un de ceux-ci sur un formulaire en utilisant un TImage. Comment puis-je faire cela et obtenir une image bien composée?

À titre d'exemple du problème que je suis confronté le code échoue ci-dessous pour fonctionner correctement, et produit l'effet indiqué:

ImageList.GetBitmap(index, Image1.Picture.Bitmap); 

alt text http://clip2net.com/clip/m0/1234439882-clip-5kb.png

Pour expliquer un peu plus:

Déposez un Timage sur un formulaire et, au moment du design, chargez un fichier PNG avec alpha en utilisant la propriété Picture. Notez comment il est correctement composé avec une transparence complète sur le formulaire.

Maintenant, lors de la conception, ajoutez un second Timage vide, ajoutez un TImagelist et ajoutez le même PNG à la liste d'images. Comment puis-je affecter le PNG dans la TImageList à la seconde TImage, et le faire sembler identique au premier?

+0

En outre, cela ne certainement pas ressemble à du code Delphi. Vous êtes sûr de la langue? – Argalatyr

+0

Je seconde les deux commentaires précédents. ;) –

+0

@Ken - Vous avez raison à propos de C++ Builder - Je vais modifier le poste. – Roddy

Répondre

1

Je viens d'essayer un test simple. TImageList contient une image PNG avec transparence. Je rends l'image sur la seconde TImage en utilisant:

imlImageList.Draw (img2.Canvas, 0, 0, 0); Ce qui a fait la différence pour moi, c'était la définition de img2.Transparent: = true (j'ai utilisé le concepteur, pas le code).

+0

Cela ne marche pas pour moi - j'obtiens le même résultat que ci-dessus. Êtes-vous sûr que votre PNG a une bonne transparence? – Roddy

+0

La transparence alpha devient une couleur BMP simple lorsqu'elle est utilisée dans TIMageList, conformément à la conception de la bibliothèque MS Common Controls. Ce n'est même pas du code Delphi, c'est Windows lui-même qui le fait. –

1

je suis tombé sur cette discussion-fil:

Tranparent PNGs in D2009 TImageList

@Pekka Nyyssönen: Réglage ColorDepth à cd32Bit et DrawingStyle à dsTransparent travaillé pour moi.

Je n'ai pas accès à delphi 2009 moi-même donc je havn't ai essayé, mais ...

0

Il existe plusieurs façons d'ajouter des images transparentes à une liste d'images.

Avec AddMasked ou InsertMasked, vous ajoutez une image et d'étiquettes couleur à la couleur transparente:

procedure InsertMasked(Index: Integer; Image: TBitmap; MaskColor: TColor); 
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer; 

Avec insérer ou à ajouter, vous ajoutez une image et un masque. Le masque si une image 2 couleurs (noir/blanc) où seulement les pixels blancs de l'image sont utilisés, les autres sont transparents.

function Add(Image, Mask: TBitmap): Integer; 
procedure Insert(Index: Integer; Image, Mask: TBitmap); 
+0

Merci, mais je suis après bon mélange alpha comme le montrent les images de gauche, pas de masquage mono-bit,. – Roddy

4

De mes recherches, je trouve que les magasins TImageList les images comme TBitmaps, afin que l'information alpha est perdue sur le stockage, et vous ne pouvez pas réaliser ce que vous cherchez la mise en œuvre actuelle de TImageList.

Mise à jour:

Un peu plus d'expériences et avec le code ci-dessous je pouvais faire le travail de transparence avec le code ci-dessous.

ImageList1.ColorDepth := cd32Bit; 
Image2.Transparent := True; 
Image2.Canvas.Pen.Style := psClear; 
Image2.Canvas.Rectangle(0, 0, Image2.Width+1, Image2.Height+1); 
ImageList1.Draw(Image2.Canvas, 0,0,0); 

Mais ce n'était pas aussi joli qu'un png chargé.

+0

Non, l'information alpha n'est pas perdue. Vous pouvez utiliser TImagelist avec TButtons et obtenir des glyphes transparents sur les boutons. En outre, les bitmaps peuvent être de 32 bpp ... – Roddy

0

Au meilleur de mes connaissances, cela ne peut être réalisé. Aucune des suggestions données n'aboutit à une image correctement alpha-mélangée, qui est l'exigence principale. Peut-être en définissant une classe dérivée de TImageList, qui peut alors accéder aux méthodes protégées, quelque chose pourrait fonctionner. Ma solution pour l'instant est d'utiliser un composant ImageList personnalisé tiers spécifiquement pour cela.

2

Cochez la case Activer Thèmes d'exécution dans l'onglet à
Project -> Options -> onglet Application

Cela me résolu mon problème dans RAD Studio 2010.

Questions connexes