PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Sauvegarder l'icone associée à un fichier en gardant les informations de transparence
Sauvegarder l'icone associée à un fichier en gardant les informations de transparence
Iniciado por Sylvain RICAU, 13,feb. 2017 10:29 - 5 respuestas
Miembro registrado
88 mensajes
Publicado el 13,febrero 2017 - 10:29
Bonjour,

J'arrive à sauvegarder l'icone associée à un fichier en utilisant le code suivant :

....
SI nTaille=16 ALORS
// Petite icône
nbIcons = API("SHELL32","ExtractIconExA", sDefaultIcon, nIconIndex, Null, &hIcon, 1)
SINON
//Icone standard
hIcon = API("SHELL32","ExtractIconA", 0, sDefaultIcon, nIconIndex)
FIN

SI hIcon DANS (-1,0,1) ALORS
Ferme(FEN_Icone)
RENVOYER Faux
FIN
hDC est entier système=0
SI sNomChpImage<>"" ALORS
{sNomChpImage,indChamp}..Visible=Faux
hDC = dDébutDessin(sNomChpImage)
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
{sNomChpImage,indChamp}..Visible=Vrai
SINON
nError = API("USER32","DrawIconEx",hDC, 0, 0, hIcon, nTaille, nTaille, 0, 0, 3)
FIN
dSauveImageBMP(FEN_Icone.IMG_Icone, FichierIcone)
....


Cependant, avec cette méthode je me retrouve avec des icônes avec le fond du champ dans lequel l'icône a été dessinée (sNomChpImage).

A part utiliser un logiciel de dessin pour redéfinir les parties transparentes (tâche fastidieuse et ne pouvant pas être automatisée), quelqu'un aurait il une solution à me proposer ?

Il y a certainement une fonction dans les API Windows pour extraire sous forme de fichier une icône associée à un fichier. Quelqu'un pourrait il me donner des informations sur cette piste ?

Merci d'avance
Publicado el 13,febrero 2017 - 17:10
Bonjour Sylvain,

Pour conserver la couche alpha, tu peux procéder comme ceci:

- sous le champ image dans lequel tu dessines l'icône, place un champ forme de couleur rvb(253,254,255)
- à la place de dSauveImageBMP, utilise dSauveImagePNG avec pour couleur de transparence: rvb(253,254,255)

Le résultat est satisfaisant dans la plupart des cas.

Si tu trouves le moyen de faire mieux, ça m'intéresse!

JM
Miembro registrado
962 mensajes
Publicado el 14,febrero 2017 - 06:55
hello,
il y a aussi la possibilité d'utiliser la fonction Icon.ExtractAssociatedIcon de l'assemblage dotnet System.Drawing.
Pour l'utiliser dans windev :
1 - Inclure les assemblages System et System.Drawing dans son projet ( Atelier/.NET/Utiliser un assemblage dans son projet)
2 - Voici un exemple de code pour extraire l'icone d'un exe et la sauvegarder dans un fichier png :

ExeAvecIcone est une chaîne = "F:\WinDev 16\Programmes\windev16.exe"
MonIcone est une System.Drawing.Icon dynamique = Icon.ExtractAssociatedIcon(ExeAvecIcone)
SI MonIcone <> Null ALORS
MaStream est un System.IO.FileStream("f:\temp\MonIcone2.png",FileMode.OpenOrCreate)
MonBitmap est un System.Drawing.Bitmap dynamique = MonIcone.ToBitmap()
MonBitmap.Save(MaStream, System.Drawing.Imaging.ImageFormat.Png)
MaStream.close()
FIN


--
Ami calmant, J.P
Miembro registrado
953 mensajes
Publicado el 14,febrero 2017 - 10:15
bonjour Sylvain,

désolé, j'ai tenté de vous répondre hier, mais le forum avait quelques soucis ^^

en adaptant ce bout code au votre, cela devrait fonctionner en utilisant des images PNG.

_exefilename est une chaîne="C:\Program Files\Microsoft Office 15\root\office15\excel.exe"
_dest_png_filename est une chaîne="c:\temp\img_icon_excel.png"
_handle est un entier
_bool est un booléen
_my_dc est un entier
_handle=API("SHELL32","ExtractIconA",0,&_exefilename,0)


SI PAS _handle DANS (-1,0,1) ALORS
// Init l'image et son opacitée
_my_dc=dDébutDessin(img_icone,dAvecOpacité)
dChangeMode(dessinNormal)
POUR ni=0 _A_ img_icone..Largeur
POUR nj=0 _A_ img_icone..Hauteur
dPoint(ni,nj,RVB(255,255,255),0)
FIN
FIN
API("USER32","DrawIconEx",_my_dc,0,0,_handle,32,32,0,0,3)
dSauveImagePNG(img_icone,_dest_png_filename)
_bool=API("USER32","DestroyIcon",_handle)
FIN


bon dèv
Miembro registrado
88 mensajes
Publicado el 14,febrero 2017 - 15:28
Bonjour et merci pour vos réponses.

Je n'ai testé que la proposition de Christophe qui marche à merveille !

Bonne continuation à vous
Miembro registrado
37 mensajes
Publicado el 20,noviembre 2019 - 14:55
[Mon post précédent n'est pas apparu, au cas où, je le refais]

Bonjour,

Chez moi, cela ne fonctionne pas tout à fait "à merveille".
J'ai un code similaire pour faire la même chose, et j'ai repris celui de Christophe pour être sûr, mais le constat est le même.
Et idem sans gestion de la transparence.

Pour être plus précis, cela fonctionne sur certains exécutables (tels que Word, Excel, exécutables issus de WD), mais pas sur d'autres (Putty, DesktopOK, petits programme que l'on trouve facilement sur le net).
Je ne vois pas trop quelle différence il pourrait y avoir entre eux, pouvant provoquer cette différence de fonctionnement.

Sur ces exe là donc, après appel de l'API "DrawIIconEx", le champ image semble contenir une image totalement transparente.
Plus troublant encore, il semblerait aussi qu'à un instant T l'image soit correcte, puis devient vierge. En effet, en pas à pas avec un point d'arrêt sur dSauveImagePNG, j'arrive à visualiser dans l'explorateur Windows le fichier png créé, avec la bonne image. Mais un simple F5 de l'explorateur fait disparaître le contenu de l'image, sans avoir avancé dans le code.
Vérité ou illusion ?

Quelqu'un aurait-il une explication/solution sur ce problème ?
Merci.
Mensaje modificado, 20,noviembre 2019 - 14:58