begin process at 2012 02 10 13:42:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Graphique

 > 

[GDI+] problème d'icones transparents...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[GDI+] problème d'icones transparents...

mercredi 12 octobre 2005 à 08:44:14 | [GDI+] problème d'icones transparents...

psy4meuh

Bonjour à tous,
 
je suis en train de basculer un de mes anciens programes d'affichage d'icones en GDI+, et je suis face à un problème bizare :
Les parties complettement transparentes des icones sont OK, mais les transparences 'partielles' s'affichent en noir... alors que dans l'ancienne vesion (BitBlt...) tout était OK...
Pour mieux comprendre, une petite image vaut mieux qu'un grand discours :

Quelqu'un a une idée?
mercredi 12 octobre 2005 à 13:47:48 | Re : [GDI+] problème d'icones transparents...

jpthomasset

Salut,

C'est pas facile de répondre comme ca : est-ce que tu aurais un bout de code ? Tu utilise Graphics::DrawImage ? Quel est le format de tes icones ?

Pour info, perso j'utilise des PNG et je n'ai eu aucun problème avec la composante alpha.
A+,

JP.
PS: l'image ne s'affiche pas...

mercredi 12 octobre 2005 à 14:32:42 | Re : [GDI+] problème d'icones transparents...

psy4meuh



Voilà mon code pour la version en GDI+.... rien de spécial... cet icône est en 24bpp + alpha

hdc = BeginPaint(_hWnd, &ps);
Graphics graphics(hdc);
Bitmap bmp2(hIcon);
graphics.DrawImage(&bmp2,256,0);

mercredi 12 octobre 2005 à 15:45:11 | Re : [GDI+] problème d'icones transparents...

jpthomasset

Salut, d'après ce message : [ Lien ]
Il semble qu'il y ai un bug dans la fonction FromHICON. Le message contient un correctif en C#, mais ce n'est pas trop dur de le porter.

Honnetement, je me demance si cela ne viendrais pas du fait que en GDI classique, pour utiliser l'alpha blending, il fallait prémultiplier les couleurs par l'alpha, alors qu'en GDI+ ce n'est pas le cas.

Une idée à creuser, est peut-etre de charger les icones directement depuis le fichier de resource dans GDI+ avec la fonction Image::FromStream, il est possible que dans ce cas tes icones soient extraites normalement : Perso j'utilise cette technique pour mes images, mais ce sont des PNG.

A+,
JP.
mercredi 12 octobre 2005 à 16:42:34 | Re : [GDI+] problème d'icones transparents...

psy4meuh

Peut être pas un bug, mais à mon avis le GDI+ ne gère pas le "24bppARGB",je vais essayer de transformer les icones en "32bppARGB"après lecture, mais il faut que je les lisent dirrectement... genre avec le hbmColor de ICONINFO...., j'vais essayer...
mercredi 12 octobre 2005 à 17:28:26 | Re : [GDI+] problème d'icones transparents...

jpthomasset

Ben, en fait les icones en 24bits plus un layer alpha sont équivalentes à des images en 32bppARGB. La différence est (il me semble) dans l'organisation des données (je crois que les icones ont un bitmap qui contient uniquement les valeurs alpha et un autre pour les couleurs 24bits).
Normalement, GDI+ devrait donc créer un bitmap en 32bpp à partir de ton icone, mais il y a sans doute un bug...

A+,
JP.

mercredi 12 octobre 2005 à 17:42:37 | Re : [GDI+] problème d'icones transparents...

jpthomasset

Petite correction les icones en 32 bits, contiennent en fait un bitmap de 1bit qui sert de masque et un bitmap de 32 bits (24 pour les couleurs et 8 pour l'alpha).
Il est probable que GDI+ utilise le bitmask au lieu de l'alpha.

A+,
JP.

jeudi 13 octobre 2005 à 08:25:53 | Re : [GDI+] problème d'icones transparents...

psy4meuh

Je crois avaoir trouvé, je poste mon code apres vérif...
jeudi 13 octobre 2005 à 08:55:48 | Re : [GDI+] problème d'icones transparents...

psy4meuh

Ok, ca marche... c bien ce que je pensait, le GDI+ ne gère pas bien le format de l'icone à cause du masque je pense, donc je prends la parie couleur(+alpha) de l'icone par 'GetIconInfo' et je crée un Bitmap GDI+ au format 32bppARGB... voilà mon code : /**************************************************************************/ //hIcon loadé par un LoadImage ou ExtractIcon PICONINFO ii = new ICONINFO; GetIconInfo(hIcon, ii); Bitmap bmp(ii->hbmColor, NULL); DeleteObject(ii->hbmColor); DeleteObject(ii->hbmMask); BitmapData bmData; Rect bmBounds(0,0,bmp.GetWidth(),bmp.GetHeight()); bmp.LockBits(&bmBounds, ImageLockModeRead, bmp.GetPixelFormat(), &bmData); Bitmap dstBitmap(bmData.Width, bmData.Height, bmData.Stride, PixelFormat32bppARGB, (BYTE *)bmData.Scan0); BOOL IsAlpha = false; Color c1(0,0,0,0); for (int y=0; y <= bmp.GetHeight()-1; y++) { for (int x=0; x <= bmp.GetWidth()-1; x++) { dstBitmap.GetPixel(x,y,&c1); if (c1.GetA()>0 & c1.GetA()<255) IsAlpha=true; } } bmp.UnlockBits(&bmData); if (IsAlpha) { graphics.DrawImage(&dstBitmap,0,0,Taille,Taille); } else { Bitmap bmp2(hIcon); graphics.DrawImage(&bmp2,0,0,Taille,Taille); delete &bmp2; } /**************************************************************************/ Je vérifie au passage que l'icone contient bien de la transparence partielle (0
jeudi 13 octobre 2005 à 10:02:03 | Re : [GDI+] problème d'icones transparents...

jpthomasset

Salut,

Effectivement, cela vient sans doute de la conversion dans GDI+. Dans tes boucles for, je te conseille de sortir des boucles dès que IsAlpha est vrai, ca t'evitera de parcourir tout les pixels si tu trouve une valeur alpha dans les premiers pixels.
Je pense que tu aurais pu t'en sortir en regardant simplement le nombre de bits par pixel de ii->hbmColor avec GetObject, a mon avis il doit donner 32 dans le cas d'un image avec une valeur alpha.

Pour ton problème de fenetre transparente, il me semble que SetLayeredWindowAttributes ne sert que si l'on veut une fenetre avec des parties completement transparentes (avec une colorkey) ou alors si on veut appliquer le même alpha à toute la fenetre (la valeur bAlpha). Si tu veux une fenetre avec des valeurs alpha par pixel, il faut créer ta fenetre avec les styles WS_EX_LAYERED et WS_EX_TRANSPARENT et ensuite utiliser la fonction UpdateLayeredWindow qui fonctionne un peu comme la fonction AlphaBlend. Je pense aussi qu'avec GDI+ on peut aussi utiliser DrawImage avec une image en 32bppARGB au lieu de la fonction UpdateLayeredWindow, mais c'est a vérifier.

A+,
JP.

1 2

Cette discussion est classée dans : problème, icones, gdi, transparents, ok


Répondre à ce message

Sujets en rapport avec ce message

Glade : pixmaps [ par UnderFlow ] Bonjour à tous, j'utilise Glade pour la création d'un gui. Je rencontre le problème suivant : Lorsque je suis ss Glade, le chargement des icones se p Problème de mise à jour de ma base de données [ par lam_insat ] Mon application consiste une application multi-tierd.Le probléme est que les modifications que fait un client ne parviennent pas à un deuxieme que lor problème imagelist [ par banane_rose ] salut ! voilà j'ai une image 96 x 16 de 6 icônes avec une profondeur de couleur de 24 . et le code suivant : HIMAGELIST hImgL = Problème mon prem programe [ par AxeL364 ] bonjour, je début dans le c++ jessaye d'écrire un ptit programme pour progresser mais malheuresement un obstacle (qui parait très stupide et facile po Problème OpenGL (GL_POINT) [ par olivier_job ] Bonjour,   J'utilise VC++ 7.0, avec wxWindows. Le problème est le suivant. Sur mon ordinateur, les GL_POINTS apparaissent comme des cercles, alors q Problème avec GL_POINT affiché en carré [ par olivier_job ] Bonjour,   J'utilise VC++ 7.0, avec wxWindows. Le problème est le suivant. Sur mon ordinateur, les GL_POINTS apparaissent comme des cercles, alo Borland C++ Builder : problème d'inclusion de fichier [ par vivichou83 ] Hello tout le monde,J'ai un problème avec Borland.Je m'explique :Je dois réliser un projet et l'exécuter sous un autre pc dépourvu de borland, je déco Problème d'interfacage d'une DLL écrite en C++ avec vba [ par pierrinot ] Bonjour, Je dois créer une DLL utilisable par un programme VBA. Je tombe sur un problème d'entête de fonctions. La DLL est bien compilée, mais lorsq Problème de class [ par norton ] Bonsoir, j'ai un problème avec ma class. quand je compile ca me donne ce message d'erreur : error C2653: 'CCamera' : is not a class or namespace name Problème d'installation de composant sous borland CPP builder 5 [ par max_BCB ] Salut, Je compile mon paquet (là pas de problème!), clique sur "installer" et voilà le messageque j'obtiens : <IMG alt="" hspace=0 src="file://


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,023 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales