IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Redimensionner et centrer une image sur un TPanel avec BGRABitmap [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut Redimensionner et centrer une image sur un TPanel avec BGRABitmap
    Bonsoir,

    depuis hier matin je me bats pour essayer de mettre une image dans un canvas, en la redimensionnant et la centrant.

    Alors oui, il y a des tutos, bientôt je vais les connaitre par cœur et les réciter les yeux fermés, ça n'empêchera pas que quand j'essaie de les mettre en œuvre avec juste simplement une toute petite variation, c'est fini c'est fichu y a tout qui part en vrac.
    J'ai même suivi à la lettre et à la virgule près le tuto de notre ami Gilles Vasseur (qu'on voit moins, ces temps-ci, dommage), ça fonctionne bien tant qu'on ne change rien.
    EDIT : j'ai retrouvé le lien : https://gilles-vasseur.developpez.co...sitions/bgra1/ /EDT

    Je ne vais pas tout vous raconter, on y passerait la nuit, juste la dernière mésaventure de cet après-midi où l'on voit à gauche la tentative de dessin de l'image de 3 pingouins sur du sable, d'habitude j'arrive à l'avoir entière mais là, whalou.

    Alors j'ai tenté en pas-à-pas et ça n'a rien donné à part un super-gag, l'exécution d'Application.ProcessMessages efface complètement le canvas...
    Nom : enfer_informatique.png
Affichages : 331
Taille : 203,9 Ko

    Petites explications si quelqu'un voulait tester :
    image c'est un BGRABitmap ;
    pnl4img c'est un TPanel support du canvas d'affichage, que je ne veux pas faire sur la fiche car il sera appelé à être redimensionné ;
    j'ai mis des .Update qui ne servent à rien ;
    et il y a un .Free de l'image, pas visible là.

    Voilà, je ne sais plus quoi dire d'autre, je ne sais plus quoi faire, je suis exténué et au bout du rouleau, normal quand on vit des trucs genre StatusBar1.Visible := False; suivi de F9 et le contrôle est toujours là, à me narguer.

    Les curieux regarderont peut-être ça, s'ils ont du temps à perdre https://wiki.freepascal.org/BGRABitmap_tutorial_2, feront comme moi et joueront avec les exemples et bon courage pour essayer de mettre le dessin ailleurs ou le redimensionner puis le déplacer.

    Enfin, toutes ces misères peut-être parce que je suis sous Linux...

    Et voilà l'image utilisée comme source :
    Nom : pingouins.png
Affichages : 323
Taille : 362,3 Ko

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut
    Bonjour,

    Il est où le free de l'image ? S'il y a un doute, le mettre en commentaire pour tester.

    C'est amusant de mettre un Update dans le OnPaint qui va générer un message qui provoquera un événement OnPaint qui...

    Salutations

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Il est où le free de l'image ? S'il y a un doute, le mettre en commentaire pour tester.
    Plus bas, pas visible ici pour ne pas brouiller la vision que je voulais concentrée sur les 7 lignes.

    Citation Envoyé par Guesset Voir le message
    C'est amusant de mettre un Update dans le OnPaint qui va générer un message qui provoquera un événement OnPaint qui...
    Tu as raison, mais il y a des moments où on ne sait plus quoi faire...
    Àmha, cet update j'ai dû le rajouter après m'être rendu compte que j'avais une image foireuse, en utilisant les instructions du tuto.

    Maintenant, je vais t'en raconter une autre qui vaut son pesant de cacahuètes ou plutôt, voilà le lien, j'ai posté chez FreePascal, on en reparlera, là il faut que je me repose, je suis vanné.

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut
    Bonjour Jipété,

    Pour ton lien : it's not a bug, it's a feature ! Je croyais qu'il n'y avait que les sociétés commerciales qui l'utilisaient.

    Salut

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 166
    Billets dans le blog
    9
    Par défaut
    Bonsoir Jipété !

    Pas sûr d'avoir bien compris ce que tu veux faire.

    Voici un exemple qui te permettra peut-être d'avancer. L'image est dessinée dans un panel. Elle est redimensionnée en fonction de la taille de celui-ci.

    [EDIT]
    Remplacé la pièce jointe, pour ajouter la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Panel1Paint(Sender: TObject);
    var
      image2: TBGRABitmap;
    begin
     
      image2.Free; // <---
    end;
    [/EDIT]
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir Roland,
    Citation Envoyé par Roland Chastain Voir le message
    Pas sûr d'avoir bien compris ce que tu veux faire.
    Des précisions :
    Merci pour ton zip mais ce n'est pas ce que je cherche, car si le redimensionnement fonctionne bien, àmha il manque la conservation des proportions, un truc pour moi mandatory.

    En plus je me suis bagarré une bonne moitié de la journée avec cette histoire d'infobulle, qui in fine me fait penser à une grosse boulette de design : le système considère une seule chaine de caractères, donc 1 seule ligne, alors ma liste de 11 lignes, je peux l'oublier, mais comment comparer des éléments d'une liste si on les voit un à la fois ?
    Et pourtant, une liste de 8 lignes fonctionne...

    Je viens d'avoir un nouveau post du team Lazarus, je vais aller voir ce qu'on me raconte.
    EDIT : une stupidité... /EDIT

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Ah, je pensais que c'était lumineux : puisqu'on parlait de comparer des calculs arrondis avec Trunc et d'autres avec Round, pour moi il était évident que Ht signifiait "hauteur calculée avec Trunc" et Hr "hauteur calculée avec Round", et pareil pour Wt et Wr concernant la largeur.

  8. #8
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    ...puisqu'on parlait de comparer des calculs arrondis avec Trunc et d'autres avec Round, pour moi il était évident que Ht signifiait "hauteur calculée avec Trunc" et Hr "hauteur calculée avec Round"...
    J'avais bien compris cela : ht et hr étant des valeurs cible, d'où l'inférence de h et w (ou ho, wo ) pour les valeurs originelles. Le r de hr et wr du code proposé n'a pas le même sens : r pour résultat.

    Salut

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    Félicitations à vous deux, c'est un plaisir d'attraper le grip en bas à droite de la fiche et de le déplacer dans tous les sens, avec l'image et ses dimensions qui suivent sans broncher !

    Solved !

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir,

    Citation Envoyé par Jipété Voir le message
    Félicitations à vous deux, c'est un plaisir d'attraper le grip en bas à droite de la fiche et de le déplacer dans tous les sens, avec l'image et ses dimensions qui suivent sans broncher !
    J'ai oublié un truc : je vois bien dans le code ultra-court (dans le zip de Roland) les calculs pour adapter l'image aux dimensions de son container, ok.

    Mais qui ou quoi appelle la procedure TForm1.Panel1Paint(Sender: TObject); pour faire le boulot ?

    Car je ne vois nulle part de procedure TForm1.OnResize(Sender: TObject); ou procedure TForm1.Panel1OnResize(Sender: TObject);
    Est-ce que le fait de redimensionner le Panel1 appellerait son (Re)Paint sans qu'on le sache ?

    Merci de vos lumières.

    EDIT : bon, ben la lumière a jailli ici, avec l'idée de faire un test s'appuyant sur un point d'arrêt :
    Nom : panel-resize-et-breakpoint.png
Affichages : 138
Taille : 151,8 Ko

    et, oui, redimensionner fait passer par repaint.
    Bien bien

  11. #11
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    ...Mais qui ou quoi appelle la procedure TForm1.Panel1Paint(Sender: TObject); pour faire le boulot ? Car je ne vois nulle part de procedure TForm1.OnResize(Sender: TObject); ou procedure TForm1.Panel1OnResize(Sender: TObject);
    Est-ce que le fait de redimensionner le Panel1 appellerait son (Re)Paint sans qu'on le sache ?
    ...
    Le Repaint est appelé par le système dès qu'il y a besoin de rafraichir la zone concernée. Un déplacement, un redimensionnement, un démasquage par une fenêtre qui recouvrait une partie de la zone, une sortie du mode minimize etc. Cela passe par des messages que le système envoie à l'application qui le diffuse à qui de droit avec un empilement d'éventuels repaint des zones sous la zone cible. Tout cela ne se voit pas grâce au double buffered qui permet de n'afficher que le résultat final.

    A cause de cette chaîne de transmissions, ces traitements ne sont pas immédiats et dépendent de la disponibilité de l'OS et de l'application. Par exemple, un calcul prolongé sans interaction peut bloquer ces actualisations (d'où le recours à quelque ProcessMessages ou placer le traitement bloquant dans un autre thread).

    L'application elle-même peut, avec invalidate et invalidaterect, utiliser cette mécanique qui passe par le système. Cela peut avoir un intérêt, car le système peut réduire une foule de requêtes à une seule. En général pourtant au sein d'une application on utilise repaint (ou refresh qui ne fait qu'appeler repaint) pour provoquer une actualisation immédiate et limitée à la seule zone (en théorie car une zone avec des parties transparentes sollicitera celle d'en dessous).

    Donc tout se passe à l'insu de ton plein gré

    Salut

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut les copains,
    Citation Envoyé par Guesset Voir le message
    Donc tout se passe à l'insu de ton plein gré
    Oh tu sais, avec moi rien n'est jamais simple et, c'est bien connu, les règles sont faites pour ne pas être respectées,

    En ce qui concerne mon petit projet en construction, la récente manip pour le redimensionnement fonctionne impeccablement, mais j'ai un gag ailleurs, à l'utilisation d'un RadioGroup qui me permet de choisir une image parmi 3 plus un fond vide et qui m'oblige à des trucs tarabiscotés qui me font parfois hurler face à l'écran :
    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
    procedure TForm1.rdgOrientationClick(Sender: TObject);
      procedure FondBlanc;
      begin
        pnl4img.Canvas.Pen.Color   := clWhite;
        pnl4img.Canvas.Brush.Color := clWhite;
        pnl4img.Canvas.Rectangle(0,0,pnl4img.ClientWidth,pnl4img.ClientHeight);
      end;
    begin
      // effacer l'image précédente, if any
      FondBlanc; // mandatory sinon les images s'empilent
     
      case rdgOrientation.ItemIndex of
        0: imgSRC := TBGRABitmap.Create('image.png'); // horizontale
        1: imgSRC := TBGRABitmap.Create('Penguins-384x384.png'); // carrée 
        2: imgSRC := TBGRABitmap.Create('Penguins-256x384.png'); // verticale
        3: begin imgSRC.EraseRect(0,0,pnl4img.Width,pnl4img.Height,255); // fond blanc
             SomeText0 := ''; stb.Panels[0].Text := SomeText0; // texte d'info dans le StatusBar
             exit; // pour éviter le pnl4imgPaint
           end;
      end;
     
      pnl4imgPaint(nil); // obligatoire, sinon aucun changement d'image n'est pris en compte
    end;
    Bonne soirée,

  13. #13
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut
    Bonjour,

    Si c'est la nécessité du pnl4imgPaint (ou plus classiquement pnl4img.Repaint) qui inquiète c'est parce que les modifications ne se voient que lors du prochain repaint. Au lieu de provoquer ce rafraichissement par code, il y a l'alternative Orangina qui consiste à secouer l'application mais on s'en lasse

    Il y a aussi la possibilité de piéger la modification du bitmap et de lui faire provoquer le repaint. Il faut cependant remarquer que cela risque de multiplier à outrance ces rafraichissements.

    Salutations

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

Discussions similaires

  1. LEVAN : le système informatique en mesure d’apprendre tout sur n’importe quoi
    Par Arsene Newman dans le forum Intelligence artificielle
    Réponses: 10
    Dernier message: 03/06/2014, 12h20
  2. Ajouter 'TER222' devant un nombre dans toute une colonne
    Par TheTcha dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 08/01/2013, 12h50
  3. [CodeLite] Compile tout et n'importe quoi !
    Par hornon dans le forum Autres EDI
    Réponses: 0
    Dernier message: 10/06/2009, 23h02

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