Page 1 sur 1

Gestion 2d dans une simple fenêtre

Publié : ven. 19/juin/2015 9:44
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

Re: Gestion 2d dans une simple fenêtre

Publié : ven. 19/juin/2015 10:14
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

Re: Gestion 2d dans une simple fenêtre

Publié : ven. 19/juin/2015 11:50
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)

Re: Gestion 2d dans une simple fenêtre

Publié : ven. 19/juin/2015 12:24
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

Re: Gestion 2d dans une simple fenêtre

Publié : ven. 19/juin/2015 15:52
par GallyHC
Merci pour vos conseils j'en prend bien note.

GallyHC

Re: Gestion 2d dans une simple fenêtre

Publié : sam. 20/juin/2015 8:18
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.