Gestion 2d dans une simple fenêtre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Gestion 2d dans une simple fenêtre

Message par GallyHC »

Bonjour,

Je me pose quelques questions sur la gestion des images (copie avec GrabImage et ResizeImage). Avec pas mal de recherche, je me suis aperçu que d'un côté on doit ajouter "ImageID" et pas dans un autre. Donc cela devient pas mal complexe à mettre en œuvre.

Par exemple pour copier une partie d'image avec simplement GradImage, je dois bien ajouté "ImageID":
DrawImage(ImageID(GrabImage(dmx_Icons01, #PB_Any, 1, 1, 22, 22)), (i - 1) * 34 + 6, 54)
Par contre la même chose avec "ResizeImage", fonctionne sans (et même avec, j'ai surtout une erreur) :
DrawImage(ResizeImage(GrabImage(dmx_Icons01, #PB_Any, 1, 1 + (30*2), 30, 30), 22, 22), (i - 1) * 34 + 6, 54)
Donc ma question comment savoir à l’avance, si il faut ou pas "ImageID" dans les lignes de code?

Une autre question serait comment faire une simple copie de portion d’image vers une autre :).

Et enfin une dernière question :

J'ai essayé (car je suppose) de supprimer l'image générer par "GrabImage" et/ou "ResizeImage" avec "FreeImage" et j'ai une erreur qui me dit que cette image n'existe pas. Donc la question et de savoir si elle est bien supprimé de la mémoire (enfin d'évité d'avoir trop de mémoire utilisé par le programme). Je bosse sur un programme qui pourrait être utilisé par des professionnels de la gestion de lumières en spectacle, et dans ce cas la mémoire pris par le programme est je pense super important (afin d'évité des plantages).

Merci d'avance de toutes les lumières qui vont m'éclairer :lol:,
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Gestion 2d dans une simple fenêtre

Message par microdevweb »

En général quant tu veux affiché l'image, tu dois utilisé ImageId(), pour le travaille sur une image ou la copie l'id de l'image #monImage.

Pour copier une portion d'image

Code : Tout sélectionner

Resultat = GrabImage(#Image1, #Image2, X, Y, Largeur, Hauteur)
;ou

#Image1=image source
#Image2 = l'image de sestination (ex #maNouvelleImage ou #Pb_Any)

Ps: dans la barre de message de l'ide, tu vois ImageId ou #Image
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Gestion 2d dans une simple fenêtre

Message par blendman »

je te déconseille d'utiliser ça :

Code : Tout sélectionner

DrawImage(ImageID(GrabImage(dmx_Icons01, #PB_Any, 1, 1, 22, 22)), (i - 1) * 34 + 6, 54)
Mais plutôt ça :

Code : Tout sélectionner

Img = GrabImage(dmx_Icons01, #PB_Any, 1, 1, 22, 22)
DrawImage(ImageID(Img), (i - 1) * 34 + 6, 54)

ou : 
ResizeImage(Img, 22, 22)
DrawImage(ImageId(Img), (i - 1) * 34 + 6, 54)
Et là, tu peux faire (pour libérer ta mémoire et oui, il vaut mieux la libérer ;)) :

Code : Tout sélectionner

FreeImage(img)
En fait, dans ton exemple, tu ne connais pas l'image, donc non, elle n'est pas supprimée de la mémoire tant que ton appli est ouverte.
J'Ai testé hier la même chose et au bout d'un moment, mon appli plantait royalement, donc il faut vraiment libérer ton image dès que tu n'en as plus besoin.

Autre technique :
utilise des constantes pour tes images.
Par exemple si tu sais que tu n'auras que 10 images, utilises enumeration et utilise les constantes ainsi créées. Tu n'auras jamais plus de dix images ainsi ;) (et plus de risque de plantage mémoire).


Pour ta copie, c'est bien :

Code : Tout sélectionner

grabimage(#img1,#image2,x,y,w,h)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Gestion 2d dans une simple fenêtre

Message par Ar-S »

Pour ne plus te laisser avoir par les IMAGEID, je te conseikls d'utiliser des macro genre

Code : Tout sélectionner

Macro DrawMyImage(image,x,y,largeur,hauteur)
DrawImage(ImageID(image), x, y [, Largeur, Hauteur])  
EndMacro
Idem pour les autres
DrawMyAlphaImage etc...

Tu sauves ces macros dans un pbi et tu les includes dans tes sources. Ainsi plus de galère par oublie d'imageId
~~~~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
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Gestion 2d dans une simple fenêtre

Message par GallyHC »

Merci pour vos conseils j'en prend bien note.

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Gestion 2d dans une simple fenêtre

Message par Mesa »

Dans l'aide, vous avez un début de réponse.

Ouvrez l'aide, cliquez sur Manuel (côté gauche) puis repérez (côté droit) la rubrique "Thèmes divers " et lisez "Numéros et Identifiants (Handles)".
Vous pouvez aussi rechercher l'aide de ImageID puis cliquer sur handle.

En gros, les numéros sont propres à PB alors que les ImageID (handles) sont créer par le système d'exploitation. On a donc un double système d'identification. Il faudrait demander à Fred pour avoir la raison de cette "complication".

M.
Répondre