Page 1 sur 1

Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 18:37
par Marc56
Je m'énerve depuis plusieurs jour sur un truc probablement bête, mais j'ai du mal entre image et imageid etc :oops:

Dans mon programme, pour accélérer le chargement, je souhaite sauver chaque icône dès qu'elle a été chargée au moins une fois.
J'ai donc pensé à SaveImage() et ça marche bien si je charge une image avant avec LoadImage(), mais pas dans mon cas ou mes images sont les icônes des EXE.
J'ai chaque fois le message:

Code : Tout sélectionner

[ERREUR] Ligne: 14
[ERREUR] Le #Image spécifié n'est pas initialisé.
Mes boutons sont des gadget images et je charge les icônes des programmes avec la procédure que vous m'avez donné il y a quelque temps.
tout marche, mais je n'arrive pas à sauvegarder le contenu avec SaveImage()

Exemple:

Code : Tout sélectionner

Procedure GetAssociatedFileIcon(IconPath.s, IconSize)
    Protected FileInfo.SHFILEINFO
    SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
    ProcedureReturn FileInfo\hIcon
EndProcedure

OpenWindow(0, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ImageGadget(id, 0, 0, 100, 100, GetAssociatedFileIcon("C:\Windows\System32\notepad.exe ", #SHGFI_SMALLICON))

SaveImage(id, "C:\Tmp\icone.bmp")

Repeat : Until WaitWindowEvent(50) = #PB_Event_CloseWindow
Mettez SaveImage() en commentaire, le chargement se fait bien.
Réactivez-le: erreur 8O

J'ai essayé getgadgetstate() qui en principe doit renvoyer l'ID pour l'image, mais ça ne marche pas.

Surement un truc bête, mais quand on a le nez sur l'écran depuis un temps fou, on s'enfonce :?

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 18:48
par Ar-S
ça ne solutionne pas le prob mais déjà tu nommes ton GADGET : ID
Et tu fais un SAVEIMAGE : ID
déjà là y'a un koak

----edit----

Le soucis c'est que GetAssociatedFileIcon("C:\Windows\System32\notepad.exe", #SHGFI_SMALLICON) retourne IMAGEID et pas IMAGE..
Donc effectivement, ton IMAGE n'est pas clairement initialisée dans ton programme.

Rappel de la syntaxe ImageGadget(GADGET, x, y, L, H, imageID(Image))

Maintenant comment retrouver la valeur de l'image via un ImageID, j'avoue que c'est une 1ère pour moi :mrgreen:

---edit 2----

Regarde pet-être du coté de l'API ExtractIconEx_

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 18:58
par Marc56
Ben oui, je tourne en rond depuis des jours :( :o 8O :x

Autre exemple "logique"

Code : Tout sélectionner

Procedure GetAssociatedFileIcon(IconPath.s, IconSize)
    Protected FileInfo.SHFILEINFO
    SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
    ProcedureReturn FileInfo\hIcon
EndProcedure

OpenWindow(0, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ID_Gadget = ImageGadget(1, 0, 0, 100, 100, GetAssociatedFileIcon("C:\Windows\System32\notepad.exe ", #SHGFI_SMALLICON))

ID_Image = GetGadgetState(ID_Gadget)
; GetGadgetState(#Gadget)
; Valeur de retour
; Renvoie l'état du gadget. 
; ImageGadget()       : Renvoie l'ImageID de l'image actuellement affichée. 

SaveImage(ID_Image, "C:\Tmp\icone.bmp")

Repeat : Until WaitWindowEvent(50) = #PB_Event_CloseWindow
Marche pô :(
ID_Image = GetGadgetState(ID_Gadget)
[ERREUR] Ligne: 11
[ERREUR] Le #Gadget spécifié n'est pas initialisé.

J'ai aussi essayé de créer une image (CreateImage()) mais comment "copier" le contenu dedans :roll:

J'arrête pour aujourd'hui, mes 3 neurones sont en surchauffe :|

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 19:07
par Ar-S
C'est logique que ça ne marche pas le soucis est le même, GetGadgetState(#Gadget) renvoie l'ID

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 19:13
par Ar-S
Très bon tuto de teddyrogers qui devrait solutionner ton soucis :
https://forum.tuts4you.com/blogs/entry/ ... revisited/

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 19:21
par Fred
Essaie ca:

Code : Tout sélectionner

Procedure GetAssociatedFileIcon(IconPath.s, IconSize)
    Protected FileInfo.SHFILEINFO
    SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
    ProcedureReturn FileInfo\hIcon
EndProcedure

OpenWindow(0, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ID_Gadget = ImageGadget(#PB_Any, 0, 0, 100, 100, GetAssociatedFileIcon("C:\Windows\System32\notepad.exe ", #SHGFI_SMALLICON))

ID_Image = GetGadgetState(ID_Gadget)
; GetGadgetState(#Gadget)
; Valeur de retour
; Renvoie l'état du gadget.
; ImageGadget()       : Renvoie l'ImageID de l'image actuellement affichée.

CreateImage(0, 32, 32)
If StartDrawing(ImageOutput(0))
  DrawImage(ID_Image, 0, 0)
  StopDrawing()
EndIf

SaveImage(0, "icone.bmp")

Repeat : Until WaitWindowEvent(50) = #PB_Event_CloseWindow

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : mer. 17/févr./2016 19:53
par Anonyme2
Tu devrais peut-être sauvegarder au format ico.

C'est un peu de travail pour comprendre mais ce n'est pas insurmontable.

Srod a publié un très bon code que tu pourrais utiliser pour sauvegarder les ico (ou les curseurs non animés qui ne diffèrent que d'une valeur).

http://www.purebasic.fr/english/viewtop ... t=saveicon

Dans PureIconManager j'utilise une procédure un peu plus compliquée qui fait beaucoup de tests pour éviter les plantages et j'utilise un stream au lieu de la mémoire, stream basé sur l'interface Istorage qui n'est pas très compliquée.

Le fait d'enregistrer au format ico permet de garder la transparence complète du masque et l'antialiasing si existe.
Le format ico compressé introduit par vista n'est rien d'autre que fichier png avec un masque.

MS est avare sur le format des ico, mais voici des liens avec un peu d'infos
The evolution of the ICO file format, part 1: Monochrome beginnings
https://blogs.msdn.microsoft.com/oldnew ... /?p=12513/

The evolution of the ICO file format, part 2: Now in color!
https://blogs.msdn.microsoft.com/oldnew ... /?p=12503/

The evolution of the ICO file format, part 3: Alpha-blended images
https://blogs.msdn.microsoft.com/oldnew ... /?p=12483/

The evolution of the ICO file format, part 4: PNG images
https://blogs.msdn.microsoft.com/oldnew ... /?p=12473/


De mémoire, les icônes monochromes ne sont pas affichées par PB, j'avais donc écris un peu de code pour les afficher (mais ça a peut-être changé).

Re: Sauvegarder l'image contenue dans un imagegadget

Publié : jeu. 18/févr./2016 7:32
par Marc56
Super, ça marche :P

Je comprend mieux maintenant grâce à ce petit bloc, Merci Fred.

Code : Tout sélectionner

CreateImage(0, 32, 32)
If StartDrawing(ImageOutput(0))
  DrawImage(ID_Image, 0, 0)
  StopDrawing()
EndIf
Je n'étais plus très loin dans mes dernières tentatives en ayant constaté que seuls les éléments ayant été "remplis" avec le contenu généré par CreateImage() pouvaient être sauvegardés et pas les autres.

Merci à vous trois.
Merci pour les liens instructifs

@Denis, j'ai envisagé un moment le format ICO, mais comme tu l'indique pas très facile à gérer. Pour mon usage, je pense le faire simplement en PNG puisque tout est déjà natif PB et que le png gère la transparence.

:)