Discussion: Gestion des images [Lazarus]

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut Gestion des images

    Bonjour,

    Je n'ai pas utilisé lazarus depuis très longtemps. Je souhaiterais créer une sorte de jeu de cartes/réussite afin de me familiariser avec la gestion des images.
    Du genre avoir les 32 cartes en miniatures sur un côté, pouvoir les placer à leur véritable taille sur des emplacements puis les déplacer, les enlever, les interchanger.
    (Avec TImage, j'ai ce genre de chose : "Picture.Data = {0A544A706567496D616765A...(très très long)...0DB25CEA3772CC5007FFD9} " pour chaque image) .

    Ma question : existe-t-il un composant particulier pour gérer les images, les intégrer dans l'exécutable pour qu'elles soient utilisables à volonté ? Je précise que je n'ai pas besoin de les retoucher modifier.
    (j'ai longuement recherché l'information en vain)
    Merci beaucoup d'avance pour votre aide.
    Bonne journée.

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 011
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 011
    Points : 8 187
    Points
    8 187

    Par défaut

    Citation Envoyé par phobik Voir le message
    (Avec TImage, j'ai ce genre de chose : "Picture.Data = {0A544A706567496D616765A...(très très long)...0DB25CEA3772CC5007FFD9} " pour chaque image) .

    Ma question : existe-t-il un composant particulier pour gérer les images, les intégrer dans l'exécutable pour qu'elles soient utilisables à volonté ?
    TImageList ? Mais ça sera encooooooooooooooooore plus looooooooooooooooooooooooong puisque ça devra contenir les datas des 32 images, et, je dirais même plus, 2 TImageLists : 1 pour les miniatures, 1 pour les images en taille réelle.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut

    Citation Envoyé par Jipété Voir le message
    TImageList ? Mais ça sera encooooooooooooooooore plus looooooooooooooooooooooooong puisque ça devra contenir les datas des 32 images, et, je dirais même plus, 2 TImageLists : 1 pour les miniatures, 1 pour les images en taille réelle.
    J'ai essayé avec TImageList mais ça me ne me paraissait guère concluant. Je vais essayer de creuser, je l'utilise sans doute mal. Je pensais qu'il y avait plus adapté, tant pis...

    Merci pour ta réponse

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 2 928
    Points : 7 957
    Points
    7 957

    Par défaut

    Tout est une question de taille ! Pour ne pas gonfler celle de l'exécutable, il peut être judicieux de les placer en dehors.

    Pour les miniatures, on peut les disposer comme des tuiles dans un seul grand fichier image (jpg, par ex.) qu'on lira au démarrage, en phase d'initialisation, pour les placer dans les TImage correspondants en y copiant le Rect concerné (c'est comme ça que font certains jeux pour les textures, sauf les Timage bien sûr).

    Pour les cartes individuelles, je dirais bien un fichier par carte, ou tout mettre dans un stream, et lire carte par carte...

    Ces initialisations peuvent éventuellement se faire en arrière-plan, pendant que l'application affiche un écran d'accueil ou que l'utilisateur fait des réglages avant de lancer une partie.
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut

    Citation Envoyé par tourlourou Voir le message
    Tout est une question de taille ! Pour ne pas gonfler celle de l'exécutable, il peut être judicieux de les placer en dehors.

    Pour les miniatures, on peut les disposer comme des tuiles dans un seul grand fichier image (jpg, par ex.) qu'on lira au démarrage, en phase d'initialisation, pour les placer dans les TImage correspondants en y copiant le Rect concerné (c'est comme ça que font certains jeux pour les textures, sauf les Timage bien sûr).

    Pour les cartes individuelles, je dirais bien un fichier par carte, ou tout mettre dans un stream, et lire carte par carte...

    Ces initialisations peuvent éventuellement se faire en arrière-plan, pendant que l'application affiche un écran d'accueil ou que l'utilisateur fait des réglages avant de lancer une partie.
    OUPS... visiblement je suis vraiment à la ramasse. J'ignore ce qu'est le "Rect" et je ne sais pas ce que c'est que de "tout mettre dans un stream".
    En tout cas merci pour votre aide, je vais voir ce que je peux faire, sinon je laisserai tomber. Bonne soirée.

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 2 928
    Points : 7 957
    Points
    7 957

    Par défaut

    L'intérêt d'un forum est bien de chercher des solutions qu'on ne trouvait pas, voire n'imaginait pas !

    Soit l'image d'un jeu de cartes complet (https://www.ibisc.univ-evry.fr/~than...TD4/cartes.png) : on peut la charger dans un TImage, et facilement calculer le rectangle correspondant à chacune. Ensuite, on peut recopier ce rectangle sur le canevas d'un Bitmap à affecter à un TImage. Procédure pas toujours aussi simple qu'il faudrait, cf. Jipété !

    Les images des différents cartes (toutes, ou seulement les grandes) peuvent être chacune dans un fichier, à lire au moment choisi pour initialiser son TImage correspondant. On peut aussi si elles ont toutes la même taille (Bitmaps) les enregistrer à la queue-leu-leu dans un seul fichier, qui sera lu dans un flux (TStream). Chaque portion de ce flux servira à charger le TImage correspondant.

    Après, il faut voir en termes de rapidité ce qui convient le mieux à ton cas, et ne complique pas trop le code ni l'installation de l'application (distribuer le seul exécutable est pratique...) !
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut

    Citation Envoyé par tourlourou Voir le message
    L'intérêt d'un forum est bien de chercher des solutions qu'on ne trouvait pas, voire n'imaginait pas !

    Soit l'image d'un jeu de cartes complet (https://www.ibisc.univ-evry.fr/~than...TD4/cartes.png) : on peut la charger dans un TImage, et facilement calculer le rectangle correspondant à chacune. Ensuite, on peut recopier ce rectangle sur le canevas d'un Bitmap à affecter à un TImage. Procédure pas toujours aussi simple qu'il faudrait, cf. Jipété !

    Les images des différents cartes (toutes, ou seulement les grandes) peuvent être chacune dans un fichier, à lire au moment choisi pour initialiser son TImage correspondant. On peut aussi si elles ont toutes la même taille (Bitmaps) les enregistrer à la queue-leu-leu dans un seul fichier, qui sera lu dans un flux (TStream). Chaque portion de ce flux servira à charger le TImage correspondant.

    Après, il faut voir en termes de rapidité ce qui convient le mieux à ton cas, et ne complique pas trop le code ni l'installation de l'application (distribuer le seul exécutable est pratique...) !
    Oui OK je comprends mieux ce que tu m'expliquais. Cependant il est évident que j'ai beaucoup trop de lacunes pour m'en sortir sans reprendre plein de choses à zéro.
    J'imaginais qu'il existait une sorte de gestionnaire d'images qui permette de charger x images dans le programme, puis "d'appeler" l'une ou l'autre de ces images (img1, img2, img3 ou autre), afin qu'elle apparaisse où l'on veut et quand on veut sur l'interface.
    En tout cas, merci encore.

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 011
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 011
    Points : 8 187
    Points
    8 187

    Par défaut

    Citation Envoyé par phobik Voir le message
    J'imaginais qu'il existait une sorte de gestionnaire d'images qui permette de charger x images dans le programme, puis "d'appeler" l'une ou l'autre de ces images (img1, img2, img3 ou autre), afin qu'elle apparaisse où l'on veut et quand on veut sur l'interface.
    En fait tu décris deux choses bien différentes, là :
    - le gestionnaire de cartes en stock, si je puis dire (récupération des cartes depuis un [ou des] fichier[s] pour présentation, premières initialisations, etc.) et
    - le gestionnaire de la partie, qui va gérer les déplacements et leur validité, les prises, les coups, les points, etc.

    Un projet comme ça, il faut le diviser et travailler sur les deux parties l'une après l'autre comme deux projets séparés. Ensuite tu raccordes.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 2 928
    Points : 7 957
    Points
    7 957

    Par défaut

    Il me semble plus pertinent d'avoir un tableau de cartes = de TImage, à 2 dimensions : valeur et couleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Type
      TCartes = array[1..13, 1..4] of TImage;
     
    Var
      Cartes : TCartes;
     
    procedure ChargeImages(aParentForm: TForm); // et prévoir un LibereImages pour les détruire
    Var
      i, j : integer;
    begin
      for j:=1 to 4 do
        for i:=1 to 13 do
      begin
        Cartes[i, j]:=TImage.Create(self);  
        with Cartes[i, j] do
        begin
          LoadFromFile(... nom à déduire des i et j !)
          Parent:=aParentForm;
          Visible:=False; // on pourra la montrer quand on voudra
          Left:=100*j; // et où on voudra
          Top:=50*i;
        end;  
      end;
    end;
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre averti
    Inscrit en
    juin 2012
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 234
    Points : 363
    Points
    363

    Par défaut

    Mais est-ce bien nécessaire de compliquer les choses avec une inclusion des images dans le code ou dans des streams ? Si les images ne pèsent que quelques centaines de Ko. les laisser sur le disque dur et utiliser un loadfromfile ? C'est ce qu'utilise le programme que j'ai bricolé ( Image ci-dessous ), la grille contient les thumbs et chaque déplacement ou clic charge l'image voulue dans le timage central. Le temps d'affichage est imperceptible.
    Pour un jeu de cartes il faudra bien sur enchaîner plusieurs loadfromfile mais pour tenir toutes sur l'écran les images ne pourront pas avoir une taille démesurée, en .jpg ça ne devrait pas dépasser 30 / 50 Ko. la carte donc la latence devrait être plutôt négligeable.
    Quitte à améliorer par la suite la méthode permet de se remettre en tête le système sans s'exploser le citron.

    Nom : renth.jpg
Affichages : 71
Taille : 77,3 Ko

    PS: Capture un peu ratée, j'ai un morceau de Gimp qui lui monte dessus.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut

    Citation Envoyé par mm_71 Voir le message
    Mais est-ce bien nécessaire de compliquer les choses avec une inclusion des images dans le code ou dans des streams ? Si les images ne pèsent que quelques centaines de Ko. les laisser sur le disque dur et utiliser un loadfromfile ? C'est ce qu'utilise le programme que j'ai bricolé ( Image ci-dessous ), la grille contient les thumbs et chaque déplacement ou clic charge l'image voulue dans le timage central. Le temps d'affichage est imperceptible.
    Pour un jeu de cartes il faudra bien sur enchaîner plusieurs loadfromfile mais pour tenir toutes sur l'écran les images ne pourront pas avoir une taille démesurée, en .jpg ça ne devrait pas dépasser 30 / 50 Ko. la carte donc la latence devrait être plutôt négligeable.
    Quitte à améliorer par la suite la méthode permet de se remettre en tête le système sans s'exploser le citron.
    Finalement j'arrive à quelque chose en laissant les images dans un dossier en dehors de l'exécutable... Pour le reste je ne suis pas assez calé, je ne trouve rien de compréhensible pour mes compétences. Dommage, faire tout tenir dans un simple exe aurait été pratique.
    Merci à tous pour votre aide.

  12. #12
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : avril 2002
    Messages : 2 410
    Points : 4 087
    Points
    4 087

    Par défaut

    Autre option : placer les images dans le fichier ressource et les charger avec la bonne fonction (à priori http://lazarus-ccr.sourceforge.net/d...sresource.html).

    C'est équivalent à charger des fichiers, sauf que l'on charge des ressources depuis un fichier qui sera intégré à la compilation.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : août 2007
    Messages : 36
    Points : 28
    Points
    28

    Par défaut

    Citation Envoyé par M.Dlb Voir le message
    Autre option : placer les images dans le fichier ressource et les charger avec la bonne fonction (à priori http://lazarus-ccr.sourceforge.net/d...sresource.html).

    C'est équivalent à charger des fichiers, sauf que l'on charge des ressources depuis un fichier qui sera intégré à la compilation.
    Bonsoir,
    Je reviens après une petite interruption...
    J'ai donc réussi (non sans mal ) à utiliser un fichier resource.
    J'indique ce que j'ai fait pas à pas si ça peut servir à quelqu'un ou si quelqu'un trouve quelque chose à corriger.
    - J'ai utilisé LRS Explorer pour créer le fichier resource .lrs
    - J'y ai inclu une image "2.jpg" et l'ai enregistré dans le dossier du projet comme "test.lrs"
    - Il faut ajouter "LResources" dans les uses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    interface
    
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      LResources, ExtCtrls;
    - Juste avant le "end" final, ajouter "initialization {$I test.lrs}"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    initialization
      {$I test.lrs}
    end.
    - après avoir placé une TImage sur la fiche (ici "Image1"), coder la procédure comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
      Image1.Picture.LoadFromLazarusResource('2');
    end;
    ("2" est suffisant, l'extension .jpg n'a pas besoin d'être ajoutée)
    Une fois la procédure lancée, l'image 2.jpg s'affiche dans Image1. Les images peuvent ainsi être incorporées à l'exécutable.

    Un peu fastidieux pour pas grand chose, mais une épine dans le pied en moins pour le novice que je suis
    Merci à tous

    PS : Petit problème (mais qui ne me dérange pas outre mesure) je n'arrive pas à réduire la taille de mes exe, même en suivant les instructions trouvées sur le net (comme ici).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/01/2006, 10h18
  2. Classe de gestion des images
    Par tlemcenvisit dans le forum MFC
    Réponses: 2
    Dernier message: 03/05/2005, 19h07
  3. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54
  4. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo