Sauvegarder l'image contenue dans un imagegadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Sauvegarder l'image contenue dans un imagegadget

Message 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 :?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Sauvegarder l'image contenue dans un imagegadget

Message 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_
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Sauvegarder l'image contenue dans un imagegadget

Message 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 :|
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Sauvegarder l'image contenue dans un imagegadget

Message par Ar-S »

C'est logique que ça ne marche pas le soucis est le même, GetGadgetState(#Gadget) renvoie l'ID
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Sauvegarder l'image contenue dans un imagegadget

Message par Ar-S »

Très bon tuto de teddyrogers qui devrait solutionner ton soucis :
https://forum.tuts4you.com/blogs/entry/ ... revisited/
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Sauvegarder l'image contenue dans un imagegadget

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Sauvegarder l'image contenue dans un imagegadget

Message 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é).
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Sauvegarder l'image contenue dans un imagegadget

Message 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.

:)
Répondre