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 :

Travailler avec TBitmap et des fichiers bmp sous Linux [Lazarus]


Sujet :

Lazarus Pascal

  1. #161
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonjour Jérôme,
    Citation Envoyé par BeanzMaster Voir le message
    Je ne vois pas ou je ne comprends pas le problème

    pourrais-tu être plus précis, j'ai du mal à saisir.
    Bien sûr : c'est peut-être parce qu'à 1 h du mat' tu as les yeux fatigués, ou qu'à force de trop d'info il te faudrait consulter un ophtalmo, ou que tu n'utilises pas une loupe pour ce genre de détail, alors j'ai rempli le pnl4Dst en rouge depuis l'edi et sur les étapes 2,4 3,4 4,4 5,4 etc. (curieux, ce ",4", ça sent son arrondi foiré) on voit ça (ici avec 2,4) :
    Nom : avec_panel_rouge.png
Affichages : 186
Taille : 36,3 Ko

    PS1 : au lieu d'utiliser la souris sur le trackbar, utilise le clavier et les touches "page suivante / page précédente"
    PS2 : sur ta copie d'écran la bande grise (prends ta loupe !) sous l'image agrandie ne fait pas partie de l'image d'origine...
    PS3 : plus fort que tout, je constate ce matin que l'original est rogné à droite, sans doute (au coup d'œil) à 90 de large, non ?
    Ben v'là aut' chose, maintenant...
    EDIT : il me faut le bazar à Mitchell pour que l'original soit correctement affiché, sinon c'est la pagaille.
    En ayant rétabli tout le système d'affichage (tpanel.OnPaint, etc.), ça se passe comme ça la vie, ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      //intermediaire; // charge la source
      BmpViewerOrig.LoadFromFile(LoadedFile); // --> image tronquée
     
      intermediaire; // charge la source // --> image correcte
      //BmpViewerOrig.LoadFromFile(LoadedFile);
    EDIT de l'EDIT :
    Je ne sais pas quoi dire de plus sur ce point-là, j'ai vérifié, l'image tronquée fait bien 90 de large, ta valeur par défaut.
    J'ai trouvé. J'avais zappé que tu avais réactivé ça : Align := alClient; pour la source, que j'avais désactivé en son temps.
    Mais bon, je réactive Mitchell, lire dessous :

    Citation Envoyé par BeanzMaster Voir le message
    Un truc que je n'arrive toujours pas à saisir, pourquoi utilises-tu un TImage ?????
    Pourquoi veux-tu passer par les compos de Mitchell ???
    Le TImage : survivance du vieux projet, je voulais poster vite ce zip j'ai oublié d'enlever ce vieux truc.
    Et le pourquoi de Mitchell : parce que je veux pouvoir aussi ouvrir des jpeg, donc pas de prise de tête, Mitchell les ouvre. Ensuite je passe au système de redimensionnement le bitmap généré par Mitchell, fastoche, non ?
    (ce qui n'explique pas pourquoi un simple bmp est mal ouvert par ton viewer tout seul...)


    Citation Envoyé par BeanzMaster Voir le message
    Sinon, ok , j'ai trouvé pourquoi le TBMPViewer n'est pas rafraîchi dans le FormCreate

    Il faut modifier un peu l'unité uBMPViewer
    Hé bien non, chez moi ça reste comme décrit...

    Citation Envoyé par BeanzMaster Voir le message
    du coup dans la procedure PaintOn peux virer le updatebitmap (à vérifier quand même suivant les cas, mais normalement plus besoin)
    Si je le vire, alors là, l'objet n'est plus du tout rafraîchi, même une réduction en bdt suivie d'un "remontage" ne l'affiche pas correctement : il n'est tout simplement pas mis à jour.


    Citation Envoyé par BeanzMaster Voir le message
    Et dans ton exemple : minimalist juste le code ci-dessous suffit
    Sous Windows...
    Car sous Linux je n'ai rien d'autre que le pnl4Dst d'affiché.
    Il me faut jouer avec le trackbar pour voir apparaître la copie, c'est dingue.

    Désolé,
    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

  2. #162
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bon, allez, c'est clair net et précis : on a sous Linux un gros problème de mise à jour de l'affichage, car si je m'approche au maximum de tes suggestions (tout en conservant Mitchell pour les jpeg), voilà ce que je gagne après F9 :

    Nom : copiedécran.png
Affichages : 188
Taille : 40,1 Ko

    une fiche où source et destination ne sont pas affichées, ça se voit bien dans la preview de l'outil de capture d'écran, en incruste au milieu.
    Mais le simple fait d'avoir utilisé cet outil a fait ensuite apparaître les infos absentes, ce qui a été alors capturé avec The Gimp.

    J'espère que c'est clair (c'est une opération en plusieurs temps résumée en une seule image :
    1- F9 --> fiche sans source ni destination
    2- lancement de l'outil de capture et clic sur Capturer la fenêtre active --> la fenêtre de l'outil disparaît, il y a un coup de flicker et la fenêtre de l'outil réapparaît en mode "Enregistrer la capture" avec la preview qui affiche ce qui a été capturé, le défaut donc, mais le coup de flicker a fait un refresh de la fiche qui est maintenant correcte.
    3- les deux progs l'un sur l'autre sont capturés avec The Gimp pour insertion ici).

    Alors, où ça coince, ça, je n'en ai pas la moindre espèce d'idée...
    Quelques modifs :
    ajout de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.LoadFile(f: string): boolean;
    begin
      Result := False;
      try
        BmpViewerOrig.FastBitmap.ImportFromBitmap(MitchellTask(f)); // MitchellTak retourne un TBitmap
        Result := True;
      finally
      end;
    end;
    remplacé "intermédiaire" par LoadFile (ci-dessus), réorganisé le formCreate

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    procedure TForm1.FormCreate(Sender: TObject);
    var
      f: string;
    begin
      rempliO := False;
      rempliD := False;
     
      BmpViewerOrig := TBMPViewer.Create(Self);
      with BmpViewerOrig do begin
        Parent := pnl4Src;
        Align  := alClient;
        AutoStretchMode := smManual;
      end;
    //  pnl4Src.OnPaint := @PaintBzViewerOrig;
     
      f := ProgramDirectory+'embedded_xbr32.bmp';
      //f := ProgramDirectory+'embedded_xbr24.bmp';
     
      // attention ! devrait être lié au chargement/changement de fichier, plutôt
      // SRC --  setup srcRect dans MitchellTask
      if not LoadFile(f) then begin
        ShowMessage('Erreur de chargement de ' + f + ', impossible de continuer.');
        Exit;
      end;
     
      with pnl4Src do begin
        Left   := 0;
        Top    := 0;
        Width  := srcRect.Right;
        Height := srcRect.Bottom;
        if Width < pnl4display.ClientWidth // pour récupérer de la place pour la copie
          then sboxSrc.ClientWidth := Width;
      end;
      BmpViewerOrig.FastBitmap.Draw(pnl4Src.Canvas, 0,0);
     
      BmpViewerDest := TBMPViewer.Create(Self);
      with BmpViewerDest do begin
        Parent := pnl4Dst;
        Align  := alClient;
        AutoStretchMode := smStretchAll;//smManual;
      end;
    //  pnl4Dst.OnPaint := @PaintBzViewerDest;
     
      trkScaleChange(nil);
      // pas pris en compte ici -- faut jouer du curseur pour que ça change :koi:
      // ou cacher puis découvrir la fiche
    end;
    et repassé la mise à jour de la destination dans la proc du trackbar (ça me semble plus logique que ça soit là), à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      rempliD := True;
      BmpViewerDest.FastBitmap.Assign(BmpViewerOrig.FastBitmap);
    //  BmpViewerDest.Invalidate;
      pnl4Dst.Invalidate;
    // jouer à commenter/décommenter les 2 ci-dessus ne change rien.
    end;

    3 lignes rajoutées dans la MitchellTask :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        SetOpaque(RawImage.Data, RawImage.DataSize);
        srcRect.Left:=0; srcRect.Top:=0;   // 1
        srcRect.Right :=ImageBitmap.Width; // 2
        srcRect.Bottom:=ImageBitmap.Height;// 3
        Result.Assign(ImageBitmap);

    Pour qu'au moins la source soit affichée, il me faut activer pnl4Src.OnPaint := @PaintBzViewerOrig;, virer ça BmpViewerOrig.FastBitmap.Draw(pnl4Src.Canvas, 0,0); et le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      rempliO := True;
      pnl4Src.Invalidate;
    Si tu veux faire des tests, c'est sous Linux qu'il te faut passer.
    Voilà,

    Allez, une 'tite dernière pour la route, car je viens de refaire F9, et ...

    Nom : truc_chelou.png
Affichages : 190
Taille : 28,3 Ko
    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. #163
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut
    je viens de tester sous Linux avec Lazarus 2.0. avec le code fournis ce matin à 1h00.
    J'ai passé la couleur de fond du pnl4Dst a clRed. Et là je ne sais pas quoi te dire, car mise à part le redimensionnement qui est "antialiasé" sous Linux. Ca fonctionne

    Nom : deepin-screen-recorder_Select area_20190316114705.gif
Affichages : 247
Taille : 954,6 Ko

    Un bug dans ta version de Lazarus probablement, mais ou ????
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #164
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut
    je viens de tester sous Linux avec Lazarus 2.0. avec le code fournis ce matin à 1h00.
    J'ai passé la couleur de fond du pnl4Dst a clRed. Et là je ne sais pas quoi te dire, car mise à part le redimensionnement qui est "antialiasé" sous Linux. Ca fonctionne

    Un bug dans ta version de Lazarus probablement, mais ou ????
    Autant pour moi, j'ai parlé de 2,4 et autres x,4 mais en utilisant le clavier c'est bien le trackbar qui se met à ces valeurs, et l'afficheur à sa droite ne fait que suivre.
    Car on voit bien dans ton animation un 4.4 avec le trackbar à 439...
    Je viens de tester à l'instant : je me mets sur 240 (2 coups de "page suivante") j'ai le trait rouge, je fais un coup "flèche gauche" le trait disparaît, et pareil dans l'autre sens.

    Sinon, ça tombe bien que tu aies posté, je viens juste de préparer ça :

    +++
    Je suis reparti d'un projet ultra simple du début (je fatigue, là, je fatigue...)

    Le truc se contente d'afficher le fichier.bmp qui est drag'n'dropé sur la fiche, et ça fonctionne.

    Ensuite je rajoute un bouton pour ouvrir le même fichier à travers les procédures Mitchell et là, vous l'avez compris, ça ne fonctionne plus...
    Or la fin de la proc Mitchell c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      with lclci do begin
        SetOpaque(RawImage.Data, RawImage.DataSize);
        srcRect.Left:=0; srcRect.Top:=0;
        srcRect.Right :=ImageBitmap.Width;
        srcRect.Bottom:=ImageBitmap.Height;
        Result.Assign(ImageBitmap);
        ImageBitmap.SaveToFile(chemin + 'lclci.bmp'); // OK
        Free;
      end;
    et l'enregistrement du fichier est parfait.

    Ce fichier sera ensuite transmis tout bêtement au bmpviewer par BmpViewer.FastBitmap.ImportFromBitmap(MitchellTask(f)); et c'est là que ça coince...

    Le film des événements :
    après F9 :
    Nom : f9.png
Affichages : 179
Taille : 5,6 Ko

    après drag'n'drop : (et voir la note en bas après le code...)
    Nom : d_n_d.png
Affichages : 185
Taille : 7,4 Ko

    Si clic sur bouton Mitchell APRÈS drag'n'drop :
    Nom : mitch_after_dnd.png
Affichages : 181
Taille : 7,4 Ko

    Si clic sur bouton Mitchell AVANT drag'n'drop :
    Nom : mitch_after_f9.png
Affichages : 181
Taille : 5,6 Ko

    Le code, avec juste un bouton et un tpanel :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
      TForm1 = class(TForm)
        btnMitchell: TButton;
        pnl4viewer: TPanel;
        procedure btnMitchellClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
      private
        { private declarations }
        BmpViewer: TBMPViewer;
        rempli: boolean;
        srcRect: TRect;
        procedure PaintBzViewer(Sender: TObject);
        procedure SetOpaque(pb: pByte; taille: ptruint); inline;
        function MitchellTask(Filename: String):TBitmap;
        function LoadFile(f: string): boolean;
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses
      u_Mitchell;
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.btnMitchellClick(Sender: TObject);
    begin
      if not LoadFile(ProgramDirectory+'embedded_xbr32.bmp') then begin
        ShowMessage('Erreur de chargement de ' + ProgramDirectory+'embedded_xbr32.bmp'
          + ', impossible de continuer.');
        Exit;
      end;
      with pnl4viewer do begin
        Width  := srcRect.Right;
        Height := srcRect.Bottom;
      end;
      rempli := True;
      //pnl4viewer.Invalidate;
      BmpViewer.FastBitmap.Draw(pnl4viewer.Canvas, 0,0);// met le bmp dans le tpanel
      // BmpViewer.Invalidate; sert à rien, tout comme la ligne rajoutée dans uBMPViewer.UpdateBitmap
    end;
     
     
    procedure TForm1.SetOpaque(pb: pByte; taille: ptruint); inline;
    var
      p,taille_moins_un: Integer;
    begin
      taille_moins_un := taille - 1;
      for p := 0 to taille_moins_un do
        if (((p+1) mod 4) = 0) then
          pb[p] := 255;
    end;
     
    function TForm1.MitchellTask(Filename: String):TBitmap;
    var
      lclci: TLCLCompactImage;
      ci: TCompactImage;
    begin
      ci := TCompactImage.Create(0,0);
      ci.LoadFromFile(FileName);
      Result := TBitmap.Create;
      lclci := TLCLCompactImage.Create(ci);
      with lclci do begin
        SetOpaque(RawImage.Data, RawImage.DataSize);
        srcRect.Left:=0; srcRect.Top:=0;
        srcRect.Right :=ImageBitmap.Width;
        srcRect.Bottom:=ImageBitmap.Height;
        Result.Assign(ImageBitmap);
        //ImageBitmap.SaveToFile(chemin + 'lclci.bmp'); // OK
        Free;
      end;
      ci.Free;
    end;
     
    function TForm1.LoadFile(f: string): boolean;
    begin
      Result := False;
      try
        BmpViewer.FastBitmap.ImportFromBitmap(MitchellTask(f));
        Result := True;
      finally
      end;
    end;
     
     
    procedure TForm1.PaintBzViewer(Sender: TObject);
    begin
      if not rempli then exit;
      BmpViewer.FastBitmap.Draw(pnl4viewer.Canvas, 0,0);// met le bmp dans le tpanel
        // si bmp < tpanel il reste de l'espace ; si bmp > tpanel --> bmp tronqué
      //BmpViewer.FastBitmap.Draw(pnl4viewer.Canvas, pnl4viewer.Canvas.ClipRect);
        // occupe tout le tpanel : bmp agrandi ou réduit en fonction des tailles du tpanel et du bmp
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      rempli := False;
     
      BmpViewer := TBMPViewer.Create(Self);
      with BmpViewer do begin
        Parent := pnl4viewer;
        Align  := alClient;
        AutoStretchMode := smManual;
        Center := True; // le dessin de l'image est centré dans le viewer
      end;
    //  pnl4viewer.OnPaint := @PaintBzViewer;
    end;
     
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
    begin
      BmpViewer.LoadFromFile(FileNames[0]);
      //BmpViewer.GetLoader.FastBitmap.Draw(pnl4viewer.Canvas, 0,0);
      // c'est pareil. donc d'après bz c'est mieux dessous
      BmpViewer.FastBitmap.Draw(pnl4viewer.Canvas, 0,0);
      // ok, rien à dire -- testé avec Lena_149x99x24/32 ok
    end;
     
    end.
    Puisque le drag'n'drop n'a pas besoin de la gestion du tpanel pour l'affichage, je l'ai virée aussi pour le bouton.

    Ah, au passage, on notera que la propriété Align n'a pas l'air très efficace en cas de drag'n'drop...

    Un dernier point, ou plutôt, une interrogation : dans ta procédure Paint, tu mets Inherited Paint; tout à fait à la fin, au risque que des paramètres de l'héritage ne fichent en l'air certaines de tes options.
    Pourquoi ne pas l'avoir mis au début ?
    Ceci étant dit, ça ne change rien au problème que je rencontre.
    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

  5. #165
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    J'ai repris ton test

    Je ne comprend toujours pas pourquoi tu passes par OnPaint mise à part ce bug de rafraichissement avec ta version de Lazarus

    Ensuite SrcRect n'est pas bon dans :

    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
    function TForm1.MitchellTask(Filename: String):TBitmap;
    var
      lclci: TLCLCompactImage;
      ci: TCompactImage;
    begin
      ci := TCompactImage.Create(0,0);
      ci.LoadFromFile(FileName);
      Result := TBitmap.Create;
      lclci := TLCLCompactImage.Create(ci);
      with lclci do begin
        SetOpaque(RawImage.Data, RawImage.DataSize);
        srcRect.Left:=0; srcRect.Top:=0;
        srcRect.Right :=ImageBitmap.Width;  // ATTENTION ON COMMENCE A COMPTER A PARTIR ZERO DONC srcRect.Right := ImageBitmap.Width-1; srcRect.Right <> WIDTH
        srcRect.Bottom:=ImageBitmap.Height;
        Result.Assign(ImageBitmap);
        //ImageBitmap.SaveToFile(chemin + 'lclci.bmp'); // OK
        Free;
      end;
      ci.Free;
    end;
    Avec ce code :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    unit Unit2;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil,Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
      u_Mitchell, uBMPViewer;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        btnMitchell: TButton;
        pnl4viewer: TPanel;
        procedure btnMitchellClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
      private
        BmpViewer: TBMPViewer;
        rempli: boolean;
        srcRect: TRect;
     
        procedure SetOpaque(pb: pByte; taille: ptruint); inline;
        function MitchellTask(Filename: String):TBitmap;
        function LoadFile(f: string): boolean;
      public
     
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.btnMitchellClick(Sender: TObject);
    begin
      if not LoadFile(ProgramDirectory+'embedded_xbr32.bmp') then
      begin
        ShowMessage('Erreur de chargement de ' + ProgramDirectory+'embedded_xbr32.bmp'
          + ', impossible de continuer.');
        Exit;
      end;
     
      with pnl4viewer do
      begin
        Width  := BmpViewer.FastBitmap.Width; // (srcRect.Right - srcRect.Left)+1;
        Height := BmpViewer.FastBitmap.Height; //srcRect.Bottom;
      end;
     
      rempli := True;
      //BmpViewer.Invalidate; // Pas obligatoire ici ! (sert à rien), tout comme la ligne rajoutée dans uBMPViewer.UpdateBitmap => FAUX
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      rempli := False;
     
      BmpViewer := TBMPViewer.Create(Self);
      with BmpViewer do
      begin
        Parent := pnl4viewer;
        Align  := alClient;
        AutoStretchMode := smManual;
        Center := True; // le dessin de l'image est centré dans le viewer
      end;
    end;
     
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
    begin
      BmpViewer.LoadFromFile(FileNames[0]);
    end;
     
    procedure TForm1.SetOpaque(pb: pByte; taille: ptruint); inline;
    var
      p,taille_moins_un: Integer;
    begin
      taille_moins_un := taille - 1;
      for p := 0 to taille_moins_un do
        if (((p+1) mod 4) = 0) then
          pb[p] := 255;
    end;
     
    function TForm1.MitchellTask(Filename: String):TBitmap;
    var
      lclci: TLCLCompactImage;
      ci: TCompactImage;
    begin
      ci := TCompactImage.Create(0,0);
      ci.LoadFromFile(FileName);
      Result := TBitmap.Create;
      lclci := TLCLCompactImage.Create(ci);
      with lclci do begin
        SetOpaque(RawImage.Data, RawImage.DataSize);
        srcRect.Left:=0; srcRect.Top:=0;
        srcRect.Right :=ImageBitmap.Width;  // ATTENTION ON COMMENCE A COMPTER A PARTIR ZERO DONC srcRect.Right := ImageBitmap.Width-1;
        srcRect.Bottom:=ImageBitmap.Height;
        Result.Assign(ImageBitmap);
        //ImageBitmap.SaveToFile(chemin + 'lclci.bmp'); // OK
        Free;
      end;
      ci.Free;
    end;
     
    function TForm1.LoadFile(f: string): boolean;
    begin
      Result := False;
      try
        BmpViewer.FastBitmap.ImportFromBitmap(MitchellTask(f));
        Result := True;
      finally
      end;
    end;
     
    end.

    Chez moi tout fonctionne correctement (Désolé la compression GIF de mes captures détruit les couleurs de Randal)

    1) Drag'n Drop en premier

    Nom : deepin-screen-recorder_Select area_20190316134356.gif
Affichages : 239
Taille : 145,4 Ko

    1) Drag'n Drop après clique sur le bouton "Mitchell"

    Nom : deepin-screen-recorder_Select area_20190316134446.gif
Affichages : 221
Taille : 105,7 Ko

    Citation Envoyé par Jipété Voir le message

    Un dernier point, ou plutôt, une interrogation : dans ta procédure Paint, tu mets Inherited Paint; tout à fait à la fin, au risque que des paramètres de l'héritage ne fichent en l'air certaines de tes options.
    Pourquoi ne pas l'avoir mis au début ?
    Ceci étant dit, ça ne change rien au problème que je rencontre.
    Tout simplement car la méthode parent de Paint (inherited) appel l'évènement OnPaint donc à placer à la fin.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    PS : Pas besoins d'ouvrir une nouvelle discussion on est que les deux (dommage !)
    Il y a toujours plus de lecteurs que d'écrivains !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #167
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Il y a toujours plus de lecteurs que d'écrivains !
    Un coup de main serait parfois le bienvenu...

    Citation Envoyé par BeanzMaster Voir le message
    Je ne comprends toujours pas pourquoi tu passes par OnPaint mis à part ce bug de rafraichissement avec ta version de Lazarus
    Je n'y passe pas, la déclaration est commentée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      rempli := False;
     
      BmpViewer := TBMPViewer.Create(Self);
      with BmpViewer do begin
        Parent := pnl4viewer;
        Align  := alClient;
        AutoStretchMode := smManual;
        Center := True; // le dessin de l'image est centré dans le viewer
      end;
    //  pnl4viewer.OnPaint := @PaintBzViewer;
    end;
    Citation Envoyé par BeanzMaster Voir le message
    Ensuite SrcRect n'est pas bon dans :
    Si si.
    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       srcRect.Right :=ImageBitmap.Width;  // ATTENTION ON COMMENCE A COMPTER A PARTIR ZERO DONC srcRect.Right := ImageBitmap.Width-1; srcRect.Right <> WIDTH

    On en a déjà parlé ici (ou peut-être chez les voisins, me souviens plus exactement) il y a longtemps, on s'était posé la question (je ne sais pas si tu étais déjà là), flemme de rechercher (et je vais y passer plus de temps), alors une ch'tite image ira bien mieux qu'un long discours :
    Nom : right_bottom.png
Affichages : 188
Taille : 16,5 Ko
    128 et 64, ce sont très précisément les dimensions de l'image.
    Ce qu'on avait conclu c'est que les deux premiers du TRect sont des coordonnées et les deux derniers des dimensions mal nommées.
    Et que donc TRect c'est un piège...
    Ah, les mots, les mots... Les mots sont des maux, parfois,

    Citation Envoyé par BeanzMaster Voir le message
    Tout simplement car la méthode parent de Paint (inherited) appelle l'évènement OnPaint donc à placer à la fin.
    Rien compris : appelle l'évènement OnPaint ? Celui de la fiche ? Donc on tourne en boucle ? Ce qui n'est pas le cas.
    Donc je ne sais pas de quoi tu parles.

    Ce que je sais par contre c'est qu'en général, dans le Create tu mets d'abord le inherited puis tes trucs, et dans le destroy tu commences par destroyer tes trucs et tu termines avec le inherited qui fera le ménages des trucs système.

    C'est comme en peinture : d'abord on barbouille le fond, à la limite on le sous-traite au système par le biais de inherited, et après et par-dessus on fignole en rajoutant nos détails. Non ?

    Bon, je vais étudier ton code...
    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

  8. #168
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bon, je vais étudier ton code...
    Bien.

    Je l'ai donc attentivement regardé ligne à ligne, et j'ai fait la chose suivante : j'ai commenté tout mon code entre implementation et end. et l'ai remplacé par le tien, et il n'y a que le drag-n-drop qui affiche l'image.

    Un clic sur le bouton adapte le tpanel et c'est tout.
    Et c'est ton code.

    Résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BmpViewer.LoadFromFile(FileNames[0]); // du drag-n-drop, image affichée
    BmpViewer.FastBitmap.ImportFromBitmap(MitchellTask(f)); // du bouton, tpanel redimensionné
    Aurais-tu fait une modif dans uBMPViewer en oubliant de nous en informer ?
    Confirme-nous juste ce point : tes gif's ont bien été réalisés sous Linux ?

    PS : je réalise en lisant ton code qu'il suffit de passer un fichier (sauf si on lui mâche le boulot en passant par les compos Mitchell -- et ça c'est bien ennuyeux) au BMPViewer pour que celui-ci l'affiche : tellement l'habitude de mettre les mains dans le cambouis jusqu'aux coudes que je trouve ce raccourci très perturbant,

    EDIT : Ah, pour faire avancer le chmilblik, j'ai ajouté 4 lignes dans btnMitchellClick :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      b:= TBitmap.Create;
    { Retourne un bitmap de type LCL ==> Graphics.TBitmap / Return a TBitmap}
      b := BmpViewer.FastBitmap.GetBitmap;
      b.SaveToFile(chemin + 'bbb.bmp'); // fichier ok
      BmpViewer.LoadFromFile(chemin + 'bbb.bmp'); // affichage ok
    end;
    Donc le FastBitmap est correctement rempli avec les bonnes données. Pourquoi le BMPViewer n'est-il pas capable de l'afficher ?
    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. #169
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Jérôme pour enfoncer le clou du TRect et de l'erreur commise par tout le monde : dans canvas.inc / TCanvas.Draw on trouve
    ARect := Bounds(X, Y, SrcGraphic.Width, SrcGraphic.Height);, regarde bien les noms des propriétés...

    Sinon, on avance, mais c'est laborieux :

    Légèrement remodelé LoadFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function TForm1.LoadFile(f: string): boolean;
    begin
      Result := False;
      try
        if BmpViewer.FastBitmap.ImportFromBitmap(MitchellTask(f)) then begin
        // c'est pareil, pi celui de dessus appelle celui de dessous dans l'unité
        //BmpViewer.FastBitmap.ImportFromRawImage(MitchellTask(f).RawImage);
    
          BmpViewer.FastBitmap.Draw(pnl4viewer.Canvas, 0,0); // obligatoire
          Result := True;
        end;
      finally
      end;
    end;
    Obligatoire sinon je peux cliquer mille fois sur le bouton, ça reste rouge.

    Et un truc rigolo, avec une bricole rajoutée dans MitchellTask, tout en bas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ...
      end;
      ci.Free;
      with pnl4viewer do begin
        Width  := srcRect.Right;
        Height := srcRect.Bottom;
      end;
    end;
    Et maintenant, F9, clic sur bouton --> panel redimensionné et affiché en rouge, re-clic et l'image apparaît.
    Incompréhensible mais c'est ainsi...
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonsoir,

    il m'épuise ton composant : je décide de remplacer ce TPanel au Canvas capricieux par une TPaintBox, il faudra gérer l'événement OnPaint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.pboxPaint(Sender: TObject);
    begin
      if not rempli then exit; // sécurité !
      // affiche le bitmap dans la PaintBox
      BmpViewer.FastBitmap.Draw(pbox.Canvas, 0,0);
    end;
    et remplacer pnl4viewer par pbox, pas compliqué :
    fin de la MitchellTask (appelée par le bouton) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      end;
      ci.Free;
      //with pnl4viewer do begin
      with pbox do begin
        Width  := srcRect.Right;
        Height := srcRect.Bottom;
      end;
    end;
    et ça fonctionne impec (enfin !), et pour le drag-n-drop,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
    begin
      BmpViewer.LoadFromFile(FileNames[0]);
      pbox.Width := BmpViewer.FastBitmap.Width;
      pbox.Height:= BmpViewer.FastBitmap.Height;
      rempli := True;
    //  BmpViewer.FastBitmap.Draw(pbox.Canvas, 0,0); // obligatoire
    end;
    Alors curieusement, ces deux lignes de dimensions peuvent être commentées (j'essaie avec une image plus petite que la pbox sur la fiche, ça a besoin de tests approfondis), mais plus curieusement et c'est là que ça m'épuise,

    Nom : drop_one_file.png
Affichages : 172
Taille : 8,9 Ko

    EDIT :
    Pourquoi deux fois l'image du fichier ? Avec un décalage que je n'ai pas demandé...

    Je ne sais vraiment pas où l'on va, là...

    Ça va, j'ai trouvé le coupable : faut rendre le BMPViewer orphelin, comprendre "pas de Parent" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      rempli := False;
      BmpViewer := TBMPViewer.Create(Self);
      with BmpViewer do begin
    //    Parent := Form1; // +1 !
        Align  := alClient;
        AutoStretchMode := smManual;
        Center := True; // le dessin de l'image est centré dans le viewer
      end;
    end;
    Est-ce que c'est bien ? Est-ce que c'est mal ? J'ai vu dans tes démos que tu mettais Parent := Self; mais j'ai du mal avec cette idée, par rapport à la notion de "parent" : je ne peux pas être mon propre parent, ça n'a pas de sens ! Par contre, je peux être suis le parent de mon fils.
    Nous faudrait un spécialiste objet, là.
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonjour,

    Jérôme, si tu attaques par ce post, ne perds pas de temps à lire ceux d'hier, j'ai changé les containers : j'ai viré les TPanel pour utiliser des TPaintBox.

    Et qui dit nouveaux containers dit nouveaux problèmes, bien sûr !

    Je suis repassé sur le projet "minimalist", qui permet d'avoir source, destination et curseur de taille.

    1-) Les problèmes Lazarus
    a)
    Si je choisis de simplement remplir la pbox de destination avec une couleur (bleu bien bleu en l'occurrence) en commentant la ligne 29 dans le 2e listing ci-après, je perds 2 pixels en hauteur,
    en haut l'original et la destination en attente d'une image
    en bas gros coup de zoom sur le bas de la partie centrale de la vue précédente :

    Nom : 2px_en_moins.png
Affichages : 176
Taille : 8,8 Ko

    Hé oui, le rectangle bleu fait 62 de haut quand j'en demande 64, confirmé par la barre de titre, go figure...
    Si je fais afficher une image, on dirait que le défaut disparaît (en gras parce que c'est à confirmer avec plein de tests, c'est long, c'est énervant).

    b)
    Ceci explique peut-être le nouveau commentaire et le hack associé, dans ce bout misérable qui fonctionnait tip-top avec le TPanel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ////  with pnl4Src do begin
      with pboxSrc do begin
        Left   := 0;
        Top    := 0;
        Width  := srcRect.Right; // défini dans MitchellTask appelé par LoadFile
        Height := srcRect.Bottom;
        // pour récupérer de la place pour la copie
        if Width < pnl4display.ClientWidth
          then sboxSrc.ClientWidth := Width+2; // +2 sinon HScrollBar visible à tort
          // pb qui n'existait pas avec le TPanel...
      end;

    2-) Le problème du compo

    D'abord, est-ce que c'est bien comme ça qu'il faut faire ? Ça concerne la destination, la source n'ayant pas de souci puisque pas de redimensionnement :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm1.trkScaleChange(Sender: TObject);
    var
      scale: single;
    begin
      scale := trkScale.Position / 100;
      lblStep.Caption := 'Step : ' + FloatToStr( round (scale*10) / 10 ); // donne des valeurs bien arrondies genre 0.3 1.2 etc.
      // et en admettant qu'elles soient utiles, comment les récupérer ?
     
      with dstRect do begin // calcul des dimensions de la cible
        Left   := round(srcRect.Left   * scale); // trunc avant
        Top    := round(srcRect.Top    * scale); // round change la vie !
        Right  := round(srcRect.Right  * scale); // tout bon
        Bottom := round(srcRect.Bottom * scale); // :-)
      end;
     
    ////  with pnl4Dst do begin // ajustement du container de la cible
      with pboxDst do begin // ajustement du container de la cible
        Left  := 0;
        Top   := 0;
        Width := dstRect.Right;
        Height:= dstRect.Bottom;
      end;
     
    Caption := its(pboxDst.Width)+'--'+its(pboxDst.Height); // valeurs ok
     
      with BmpViewerDest do begin
        Width := dstRect.Right;
        Height:= dstRect.Bottom;
        FastBitmap.Assign(BmpViewerOrig.FastBitmap); // commenté --> rectangle bleu
        FastBitmap.Stretch(Width, Height, True);
      end;
      rempliD := True;
    end;
    Ensuite, je suis obligé de forcer le Stretch ci-dessus, l'option en création n'ayant pas d'effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      BmpViewerDest := TBMPViewer.Create(Self);
      with BmpViewerDest do begin
        ////Parent := pnl4Dst; // pour infos, voir l'EDIT du post précédent
        Align  := alClient;
        AutoStretchMode := smStretchAll;//  smManual;   // l'un ou l'autre = pas de diff.
    //    Center := True; // inutile
      end;
    Et enfin le résultat est esthétiquement catastrophique :
    de g. à dr., l'original, la copie réduite à 60 % puis la même vue depuis XP avec l'outil XBR en mode "StretchBlt avec HaltTone".

    Nom : compar_stretchBZ_stretchblt.png
Affichages : 162
Taille : 10,9 Ko

    Y a pas photo, hein !


    Voilà. J'en suis là. Les problèmes Lazarus sont peut-être réglés en 2.0, mais ils ne sont pas bloquants.
    Par contre, l'aspect esthétique à 2 balles du Stretch est assez ennuyeux.

    Bon dimanche,
    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

  12. #172
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bon, ce fut une horreur et un combat dément contre l'adversité et la gestion des événements, qui n'a de "gestion" que le nom, et qu'on ferait mieux d'appeler "pagaille globale".


    Tout ça pour dire que j'ai trouvé une autre manière de stretcher, plus jolie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.pboxDstPaint(Sender: TObject);
    begin
      if not rempliD then exit; // sécurité
     
      SetStretchBltMode(pboxDst.Canvas.Handle, HALFTONE);
      StretchBlt(pboxDst.Canvas.Handle, 0, 0, pboxDst.Width, pboxDst.Height,
                 pboxSrc.Canvas.Handle, 0, 0, pboxSrc.Width, pboxSrc.Height,
                 SRCCOPY);
    end;
    plus, dans le change du trackbar,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      with BmpViewerDest do begin
        Width := dstRect.Right;
        Height:= dstRect.Bottom;
        //FastBitmap.Assign(BmpViewerOrig.FastBitmap);
        //Stretch := True; // ne redimensionne pas le bitmap, juste la taille du viewer
        //FastBitmap.Stretch(Width, Height, True);
      end;
      rempliD := True;
      BmpViewerDest.Update;
    end;
    À gauche l'ancienne (post précédent), à droite la nouvelle :

    Nom : nouveaustretch.png
Affichages : 168
Taille : 11,0 Ko

    Mais à partir de là, pour avoir quelque chose d'affiché au F9, accrochez-vous aux branches, c'est la tempête...

    Le mieux que j'ai pu avoir, c'est ça, par intermittence (j'adoooore l'intermittence en informatique...)

    Nom : bestrectangle.png
Affichages : 168
Taille : 7,1 Ko

    sinon c'était du tout blanc, , et au final du final, pour l'avoir à chaque F9, j'enlève l'appel du FormCreate et je le mets là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      Update; // nécessaire !
      trkScaleChange(nil);
    end;
    et PAS dans le FormShow ! Dans la liste des événements (surveillés à coups de ShowMessage), c'est l'Activate en dernier.

    Si j'osais je cliquerais sur , mais j'ai un tas d'autres choses à voir, avant, comme par exemple le fait que le refresh de la paintbox n'est pas automatique :
    si je fais une copie d'écran de tout le bureau, il y a un coup de flicker et au réaffichage la paintbox est vide,
    Il faut alors faire circuler une autre fenêtre par-dessus pour forcer un réaffichage...
    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

  13. #173
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonsoir,
    Une question pratique : comment utiliser StretchBlt avec BMPViewer ?

    Par exemple, extrait d'une étude fonctionnelle à base de TBitmap, ceci est sympa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      dst.Width := aRect.Right;
      dst.Height:= aRect.Bottom;
      SetStretchBltMode(dst.Canvas.Handle, HALFTONE);
      StretchBlt(dst.Canvas.Handle, 0, 0, dst.Width, dst.Height,
                 src.Canvas.Handle, 0, 0, src.Width, src.Height,
                 SRCCOPY);
      dst.Canvas.Changed; // mandatory pour avoir la suite qui fonctionne bien
    Mais quand je tente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      BmpViewerDest.Width  := dstRect.Right;
      BmpViewerDest.Height := dstRect.Bottom;
      SetStretchBltMode(BmpViewerDest.Bitmap.Canvas.Handle, HALFTONE);
      StretchBlt(BmpViewerDest.Bitmap.Canvas.Handle, 0, 0, BmpViewerDest.Width, BmpViewerDest.Height,
                 BmpViewerOrig.Bitmap.Canvas.Handle, 0, 0, BmpViewerOrig.Width, BmpViewerOrig.Height,
                 SRCCOPY);
      BmpViewerDest.Bitmap.Canvas.Changed;
      rempliD := True;
    rien n'est affiché en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.pboxDstPaint(Sender: TObject);
    begin
      if not rempliD then exit;
      BmpViewerDest.FastBitmap.Draw(pboxDst.Canvas, 0,0);// met le bmp dans la pbox
    end;
    même en utilisant BmpViewerDest.Update; avant "la peinture"...

    Une idée, une astuce, une direction ?
    Merci,
    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

  14. #174
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Salut,

    (ça tourne au monologue, c't'histoire...)

    Citation Envoyé par Jipété Voir le message
    J'ai vu dans tes démos que tu mettais Parent := Self; mais j'ai du mal avec cette idée, par rapport à la notion de "parent" : je ne peux pas être mon propre parent, ça n'a pas de sens ! Par contre, je peux être suis le parent de mon fils.
    Concernant ce qui précède, j'ai trouvé ça
    The Parent := Parent assignment is just nonsense
    là, ce matin.

    Concernant le stretching du compo, j'ai d'abord vérifié que la paintbox réagit bien, comme ça (trouvé sur un forum, je ne sais plus où) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.pboxDstPaint(Sender: TObject);
    begin
      if not rempliD then exit;
      // 2 lignes pour tester le rectangle de destination
      pboxDst.Canvas.Brush.Color:=clNavy;
      pboxDst.Canvas.Clear; // Clear "remplit" avec la Brush.Color (tiens tiens...)
     
      // 1 seul petit carré en haut à gauche
      //BmpViewerDest.FastBitmap.Draw(pboxDst.Canvas, 0,0);// met le bmp dans la pbox
    end;
    Et elle fonctionne bien, très bien.
    Si je décommente la dernière ligne, je n'ai qu'un seul pixel, même pas de la bonne couleur.

    Ce "1 pixel" semble confirmé par de petits ajouts pour tests après la commande de Stretching (tmp_bmp est un simple TBitmap créé avant la tentative de redimensionnement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ...
      BmpViewerDest.Bitmap.Canvas.Changed;
      // BmpViewerDest.Bitmap.SaveToFile(chemin+'viewer.bmp'); // 0 byte
      // (BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin+'dstviewer.bmp'); // 1 seul px (size 1x1)
      tmp_bmp.Assign(BmpViewerDest.FastBitmap.GetBitmap);
      tmp_bmp.SaveToFile(chemin+'tmp.bmp'); // idem, 1x1
    J'ai aussi tenté, tant qu'à y être,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SetStretchBltMode((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, HALFTONE);
      StretchBlt((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerDest.Width, BmpViewerDest.Height,
                 (BmpViewerOrig.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerOrig.Width, BmpViewerOrig.Height,
                 SRCCOPY);
      (BmpViewerDest.FastBitmap.GetBitmap).Canvas.Changed;
      tmp_bmp.Assign(BmpViewerDest.FastBitmap.GetBitmap);
      tmp_bmp.SaveToFile(chemin+'tmp.bmp'); // idem, 1x1
    J'ai également pris garde à initialiser correctement le bitmap interne, au cas où,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      BmpViewerDest.Width  := dstRect.Right;
      BmpViewerDest.Height := dstRect.Bottom;
      BmpViewerDest.Bitmap.PixelFormat:=pf32bit;
      BmpViewerDest.Bitmap.Width :=dstRect.Right;
      BmpViewerDest.Bitmap.Height:=dstRect.Bottom;
      SetStretchBltMode  ...
    mais sans plus de résultat.

    Ce que j'en conclus, c'est que TBMPViewer.Bitmap ne fonctionne pas comme un TBitmap, malgré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       TBMPViewer = Class(TGraphicControl)
       Private
         ...
         FBitmap:       Graphics.TBitmap;
    ou alors je n'ai rien compris (ce qui n'est pas impossible).
    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

  15. #175
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 763
    Points : 959
    Points
    959
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Il y a toujours plus de lecteurs que d'écrivains !
    Je confirme

  16. #176
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 763
    Points : 959
    Points
    959
    Par défaut
    Je revient sur ton source pour XBR, et en version 64 bits, j'ai des erreurs de compilation, du coup, je regarde le source et HORREUR, je tombe sur cela:
    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
     
    procedure BmpFlouXY4(Bmp: tBitMap; TraineeX, TraineeY: byte; const ProgressCallBack: TObjectProc = nil);
    // Flou avec moyenne sur 4 pixels
    type tScanYX = array of array of integer; // Tableaux des adresses des pixels
    var X, Y, Z, WS, HS: Integer;
      pixS: tScanYX;
      cN, cS, cE, cO, clMix: tRGBQuad;
     
      procedure Initialisations; // Initialisation du BitMap
      var x, y: integer;
        Scan0: Integer; // Valeur du pointeur d'entrée dans le Bitmap.
        MLS: Integer; //   Memory Line Size (en bytes) du Bitmap.
        Bpp: Integer; //   Bytes par pixel des Bitmaps.
      begin
        // BitMap-Source
        Bmp.PixelFormat := pf32bit; Bpp := 4; Scan0 := Integer(Bmp.ScanLine[0]); MLS := Integer(Bmp.ScanLine[1]) - Scan0;
        WS := Bmp.Width; HS := Bmp.Height;
        SetLength(pixS, HS, WS);
        for y := 0 to HS - 1 do begin
          for x := 0 to WS - 1 do pixS[y, x] := Scan0 + y * MLS + x * Bpp;
        end;
      end;
    Pas étonnant que cela plante quand je compile en 64 bits...

    Pourquoi que l'on utilise pas ceci : POINTER ?

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type tScanYX = array of array of pointer; // Tableaux des adresses des pixels
    Suivi de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Scan0: Pointer; // Valeur du pointeur d'entrée dans le Bitmap.
    Et pour Finir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Bmp.PixelFormat := pf32bit; Bpp := 4; Scan0 := Bmp.ScanLine[0]; MLS :=Integer(Bmp.ScanLine[1] - Scan0);

  17. #177
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Citation Envoyé par Jipété Voir le message
    Aurais-tu fait une modif dans uBMPViewer en oubliant de nous en informer ?
    Confirme-nous juste ce point : tes gif's ont bien été réalisés sous Linux ?
    Oui c'est bien sous LINUX

    Les projets : minimalist.zip


    [QUOTE=Jipété;10828595]Jérôme pour enfoncer le clou du TRect et de l'erreur commise par tout le monde : dans canvas.inc / TCanvas.Draw on trouve
    ARect := Bounds(X, Y, SrcGraphic.Width, SrcGraphic.Height);, regarde bien les noms des propriétés...

    Et le code de bounds, c'est quoi ????? c'est la qu'il faut regarder. Dans ton exemple cela fonctionne car LEFT/TOP = ZERO.

    De plus lors d'une boucle pour accéder aux pixels avec For x:= R.Left to R.Right do tu te prendras un gros SIGSEGV (Si Width = 320 tu vas de 0 à 320, au lieu de 0 à 319) enfin bref c'est une source d'erreur que de vouloir l'utiliser ainsi


    Citation Envoyé par Jipété Voir le message
    Salut,

    (ça tourne au monologue, c't'histoire...)


    Concernant ce qui précède, j'ai trouvé ça là, ce matin.
    Dans mes exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.FormCreate(Sender : TObject);
    begin
      BmpViewer := TBMPViewer.Create(self);
      BmpViewer.Parent := Self;
      BmpViewer.Align := alClient;
      BmpViewer.AutoStretchMode := smStretchAll;
      BmpViewer.OnLoadError := @DoOnBitmapLoadError
    SELF = TMainForm

    Donc normal, j'ai lu vite fait le lien que tu donnes

    The Parent := Parent assignment is just nonsense
    Dans le contexte ce commentaire est pertinent car dans le code donné self fait référence à l'objet lui même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With UnObjet do
    begin
      Parent := self;
    Citation Envoyé par Jipété Voir le message
    Bonsoir,
    Une question pratique : comment utiliser StretchBlt avec BMPViewer ?
    Citation Envoyé par Jipété Voir le message
    Concernant le stretching du compo, j'ai d'abord vérifié que la paintbox réagit bien, comme ça (trouvé sur un forum, je ne sais plus où) :
    ...
    Et elle fonctionne bien, très bien.
    Si je décommente la dernière ligne, je n'ai qu'un seul pixel, même pas de la bonne couleur.
    ...
    Ce "1 pixel" semble confirmé par de petits ajouts pour tests après la commande de Stretching (tmp_bmp est un simple TBitmap créé avant la tentative de redimensionnement) :
    ...
    J'ai aussi tenté, tant qu'à y être,
    ...
    J'ai également pris garde à initialiser correctement le bitmap interne, au cas où,
    ...
    mais sans plus de résultat.
    ...
    Ce que j'en conclus, c'est que TBMPViewer.Bitmap ne fonctionne pas comme un TBitmap, malgré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       TBMPViewer = Class(TGraphicControl)
       Private
         ...
         FBitmap:       Graphics.TBitmap;
    ou alors je n'ai rien compris (ce qui n'est pas impossible).

    Ton problème c'est que tu amalgame TFastBitmap avec TBitmap et TBMPViewer avec TImge comme je l'ai déja dis ce sont des classes et composants DIFFERENTS
    Tu m'a signalé que tu préfèrais "TBMPViewer.Bitmap" plustôt que "TBMPViewer.GetBitmap"

    LES DONNEES QUI SONT AFFICHEES PAR TBMPVIEWER NE SONT PAS DANS FBITMAP MAIS DANS FLOADER.FASTBITMAP.
    FBITMAP EST COMME JE L'AI DEJA DIS POUR CONVERTIR LE TFASTBITMAP VERS UN TBITMAP POUR ËTRE AFFICHE DANS PAINT PAR LA FONCTION NATIVE STRETCHDRAW .
    DE PLUS LA VARIABLE FBITMAP N'EST PAS ACCESSIBLE EN PUBLIC ou PUBLISHED.


    Ton tu pourras essayé tant que tu veux stretchBit sur "TBMPViewer.Bitmap" cela ne fonctionnera pas LES DONNEES DE L'IMAGE SONT DANS LE FASTBITMAP

    Notes que STRECTHDRAW en interne utilise StretchBit.

    donc

    Juste en laissant faire Le TBMPViewer avec "AutoStretchMode := smStretchAll;"

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  18. #178
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par der§en Voir le message
    Je reviens sur ton source pour XBR, et en version 64 bits, j'ai des erreurs de compilation,
    Hopopop, ce n'est pas mon source.
    Et tu aurais pu indiquer les erreurs...

    Citation Envoyé par der§en Voir le message
    Pourquoi que l'on utilise pas ceci : POINTER ?
    Je ne sais pas. Faudrait poser la question aux développeurs d'origine, dans le forum Delphi

    Pour moi, en 32 bits ça compile, et après avoir supprimé une ligne stupide qui met en vrac BmpS dans "initialisations", ça s'exécute mais il y a encore des soucis...

    Pour XBR il y a un fil plus à propos.

    Citation Envoyé par BeanzMaster Voir le message
    Et le code de bounds, c'est quoi ????? c'est là qu'il faut regarder.
    Promis, dès que j'ai 5 minutes.

    Citation Envoyé par BeanzMaster Voir le message
    SELF = TMainForm
    Vu.
    Me suis encore pris les pied dans le tapis, normal, à force d'épuisement...

    Citation Envoyé par BeanzMaster Voir le message
    LES DONNEES DE L'IMAGE SONT DANS LE FASTBITMAP
    Là, utilisé ce matin sans résultat ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SetStretchBltMode((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, HALFTONE);
      StretchBlt((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerDest.Width, BmpViewerDest.Height,
                 (BmpViewerOrig.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerOrig.Width, BmpViewerOrig.Height,
                 SRCCOPY);
      (BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin+'dstviewer.bmp'); // 1 seul px (size 1x1)
    Citation Envoyé par BeanzMaster Voir le message
    donc
    Juste en laissant faire Le TBMPViewer avec "AutoStretchMode := smStretchAll;"
    Avec quelles valeurs de "scale" ? Je ne comprends pas comment ça peut fonctionner si on ne lui indique pas ce qu'on veut obtenir.

    Citation Envoyé par BeanzMaster Voir le message
    DE PLUS LA VARIABLE FBITMAP N'EST PAS ACCESSIBLE EN PUBLIC ou PUBLISHED.
    Ah !
    Nom : bitmap_proposé.png
Affichages : 259
Taille : 12,0 Ko
    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

  19. #179
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message


    Là, utilisé ce matin sans résultat ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SetStretchBltMode((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, HALFTONE);
      StretchBlt((BmpViewerDest.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerDest.Width, BmpViewerDest.Height,
                 (BmpViewerOrig.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerOrig.Width, BmpViewerOrig.Height,
                 SRCCOPY);
      (BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin+'dstviewer.bmp'); // 1 seul px (size 1x1)
    Ici tu utilises un TBITMAP = BmpViewerDest.FastBitmap.GetBitmap tu n'utilises pas un TFastBitmap.
    Pour pouvoir utiliser StretchBlt il faut que tu procèdes en 4 temps

    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
    25
    26
     
    Var
      TmpBmp : TBitmap;
     
      // Etape 1 --> CREATION D'UN TBITMAP DE DESTINATION
      TmpBmp := TBitmap.Create;
      TmpBmp.pixelFormat := pf32bit;
      TmpBmp.Width := BmpViewerDest.Width;
      TmpBmp.Height := BmpViewerDest.Height;
     
      // Etape 2--> MODIFICATION DES DONNEES ORIGINELLES  VERS LE TBITMAP DE DESTINATION
      SetStretchBltMode((TmpBmp.Canvas.Handle, HALFTONE);
      StretchBlt((TmpBmp.Canvas.Handle, 0, 0, BmpViewerDest.Width, BmpViewerDest.Height,
                 (BmpViewerOrig.FastBitmap.GetBitmap).Canvas.Handle, 0, 0, BmpViewerOrig.Width, BmpViewerOrig.Height,
                 SRCCOPY);
     
     // Etape 3 --> IMPORTATION DU TBITMAP DE DESTINATION MODIFIE PAR STRETCHBLT VERS LE TFASTBITMAP DU TBMPVIEWER
      BmpViewerDest.FastBitmap.ImportFromBitmap(TmpBmp);
     
      // Etape 4 --> OBLIGATOIRE APPEL UPDATEBITMAP EN INTERNE ET MET A JOUR LA PROPRIETE "F"BITMAP ET AFFICHE LES NOUVELLES DONNEES
      BmpViewerDest.Invalidate;
     
      // Autres Etapes :
      BmpViewerDest.Bitmap.SaveToFile(chemin+'dstviewer.bmp');  //IDEM QUE : TmpBmp.SaveToFile(chemin+'dstviewer.bmp'); 
     
      FreeAndNil(TmpBmp);

    Citation Envoyé par Jipété Voir le message
    Avec quelles valeurs de "scale" ? Je ne comprends pas comment ça peut fonctionner si on ne lui indique pas ce qu'on veut obtenir.
    Il n'y a pas de valeur de "Scale" tout est en fonction des dimensions du TBMPViewer, l'image s'adapte d'elle même (ce qui revient à la même chose que le code ci-dessus, sauf que le TFastBitmap originel n'est pas modifié. C'est uniquement à l'affichage que l'image est adaptée aux dimensions du TBMPViewer.

    Citation Envoyé par Jipété Voir le message
    Ah !
    Nom : bitmap_proposé.png
Affichages : 259
Taille : 12,0 Ko
    Je comprend mieux,
    Je le redis TBMPViewer ne travail pas avec un TBITMAP. Le FBitmap est une CONVERSION mise à jour via la procedure UpdateBitmap qui convertie les données du TFastBitmap vers un TBitmap.
    Cette propriété BITMAP c'est toi qui l'a voulue et je t'ai suggéré de la mettre en place dans l'état ou elle est à l'heure actuelle, une peu trop simplement. Et ceci, car tu n'aimais pas "GetBitmap" Et c'est bien pour éviter ce genre de confusion que je ne l'ai pas mise à la base.

    Voila en espérant que tu ne te mettes plus de bâtons dans les roues.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  20. #180
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Merci de ta patience.

    Non non, je ne me mets pas de bâtons dans les roues, le hasard s'en charge : je suppose que vu le niveau de détails et d'explications de ton bout de code, tout ce qu'il y avait à faire c'est un copier/coller dans la proc du trackbar ?
    Ce que j'ai fait.
    Voulant conserver son utilisation, j'ai juste rajouté ça, précédé par le calcul conservé du scaling :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      BmpViewerDest.Width := dstRect.Right;
      BmpViewerDest.Height:= dstRect.Bottom;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      BmpViewerDest.FastBitmap.Width := dstRect.Right;
      BmpViewerDest.FastBitmap.Height:= dstRect.Bottom;
    dans le deux cas le résultat est le même : rien d'affiché.

    Et c'est normal, car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // Autres Etapes :
      BmpViewerDest.Bitmap.SaveToFile(chemin+'dstviewer.bmp');  //IDEM QUE : TmpBmp.SaveToFile(chemin+'dstviewer.bmp');
    génère un fichier de 0 octet.

    Les bras m'en tombent...

    Pour ne pas mourir idiot, j'ai ajouté un enregistrement du fichier pour "voir" ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TmpBmp := TBitmap.Create;
      TmpBmp.pixelFormat := pf32bit;
      TmpBmp.Width  := BmpViewerDest.Width;
      TmpBmp.Height := BmpViewerDest.Height;
      TmpBmp.SaveToFile(chemin+'TmpBmp.bmp');
    et j'ai vu, et je gagne une image noire (normal) de 90x90 -- ces valeurs par défaut me parlent, alors je tente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      TmpBmp.Width  := BmpViewerDest.FastBitmap.Width;
      TmpBmp.Height := BmpViewerDest.FastBitmap.Height;
      TmpBmp.SaveToFile(chemin+'TmpBmp.bmp');
    C'est mieux, j'ai une image 256x128

    mais tout en bas c'est toujours tout pourri, à 0 octet.


    Tu vois, ça, c'est pas clair du tout :
    Citation Envoyé par BeanzMaster Voir le message
    Il n'y a pas de valeur de "Scale" tout est en fonction des dimensions du TBMPViewer, l'image s'adapte d'elle même (ce qui revient à la même chose que le code ci-dessus, sauf que le TFastBitmap originel n'est pas modifié. C'est uniquement à l'affichage que l'image est adaptée aux dimensions du TBMPViewer.
    Il n'y a pas de valeur de "Scale" tout est en fonction des dimensions du TBMPViewer
    pour que les dimensions du TBMPViewer changent en fonction du trackbar, il faut bien un calcul de scaling :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      scale: single;
    begin
      scale := trkScale.Position / 100;
    On retrouve le même dans XBR et partout ailleurs, suivi par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with dstRect do begin // calcul des dimensions de la cible
        Left   := 0;
        Top    := 0;
        Right  := round(srcRect.Right  * scale);
        Bottom := round(srcRect.Bottom * scale);
      end;
    Et il faut ensuite appliquer ces valeurs aux propriétés du TBMPViewer.

    C'est uniquement à l'affichage que l'image est adaptée aux dimensions du TBMPViewer.
    (tu noteras que tu n'as pas fermé ta parenthèse ouvrante commencée à la phrase précédente : la phrase ci-dessus en fait-elle partie ?)
    C'est uniquement à l'affichage dans la PaintBox ?
    Au moment de l'affichage dans la PB ?
    l'image est adaptée aux dimensions du TBMPViewer. Quelle image ? Le rendu par la PB ?

    Toutes ces choses sont évidentes pour toi, normal c'est ton bébé, mais c'est un vrai brouillard pour moi...

    +++
    De mon côté, je me suis amusé à basculer tout le code à base de TBMPViewer dans un autre projet à base de bête TBitmap, comme ça, pour voir, ça m'a pris 3 minutes montre en main, j'ai gardé les noms, pour aller plus vite, et quand je parle de magie noire ça fait rigoler Gilles et pourtant...

    Nom : f9_avec_bitmap.gif
Affichages : 416
Taille : 61,1 Ko

    Parce que mine de rien, la proc du trackbar étant appelée au lancement du prog et à chaque appui sur les touches page préc./page suivante, pour cette suite d'images elle a donc été appelée 4 fois, avec 3 rendus différents...
    La même proc !

    La suite à demain -- ou à jamais.
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 9 sur 10 PremièrePremière ... 5678910 DernièreDernière

Discussions similaires

  1. Déplacer des fichiers Excel sous Windows avec SAS
    Par Antoun dans le forum Outils BI
    Réponses: 6
    Dernier message: 19/11/2009, 17h05
  2. [Vxi] liens avec des fichiers .jpg, bmp, ou gif
    Par chendo dans le forum Designer
    Réponses: 1
    Dernier message: 14/10/2009, 09h48
  3. Gestion des fichiers users sous linux
    Par darkvodka dans le forum C++
    Réponses: 2
    Dernier message: 29/09/2007, 19h04
  4. Créer et utiliser des fichiers excel sous linux
    Par cronos6 dans le forum Zope
    Réponses: 2
    Dernier message: 02/06/2006, 09h14
  5. Lire des fichiers iso sous linux
    Par wodel dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 28/11/2005, 10h17

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