Accueil > Forum > > > > [GDI+] problème d'icones transparents...
[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.
|
|
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://
Livres en rapport
|
Derniers Blogs
ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2 par ROMELARD Fabrice
Avec la dernière génération du lecteur MP3 de Microsoft, le ZUNE HD, Microsoft a publié une nouvelle version du logiciel pour PC. Ainsi, je me suis décidé à installer celle-ci sur mon Tablet PC ACER, comme toujours le logiciel est donc tél...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|