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. #181
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

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

    J'espère que Gilles passe par là, ce post lui est dédié...

    La nuit portant conseil et me souvenant que les compos Mitchell s'en sortent pas trop mal, ce matin je génère un projet à base de ces compos + TImage/TBitmap.

    Et tant qu'à y être je génère aussi deux fichiers "exotiques" en rognant 1 ligne et 1 colonne de celui qu'on voit depuis un moment, soit 127x63 en 24 et 32 bits, et roule ma poule.

    Tout fonctionnerait bien (vous notez le conditionnel) s'il n'y avait pas une blague avec StretchBlt qui fait sauter le byte Alpha dans la destination quand la source est en pf32bits, ce n'est pas trop grave, je vais bricoler une moulinette qui le rajoute.

    Par contre, voilà le truc dément pour Gilles, quelque part entre le calcul du scaling et le Stretch proprement dit (j'ai gardé les commentaires de Jérôme en majuscule pour se repérer) :
    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
      // Etape 1 --> CREATION D'UN TBITMAP DE DESTINATION
      // jpt : sert à rien avec TImage/TBitmap, adaptation des dimensions, plutôt
     
      with imgDst do begin
        Width  := dstRect.Right;
        Height := dstRect.Bottom;
        // si ligne pf dessous présente, alors image affichée noire,
        // indépendamment du pf de la source, 24 comme 32 !
        // en jouant avec page préc/page suiv ça la fait apparaître.
        Picture.Bitmap.PixelFormat := imgSrc.Picture.Bitmap.PixelFormat; // LA LIGNE !
        Picture.Bitmap.Width  := Width;
        Picture.Bitmap.Height := Height;
      end;
     
      // Etape 2--> MODIFICATION DES DONNEES ORIGINELLES  VERS LE TBITMAP DE DESTINATION
    Oui oui, vous avez bien lu, même si la source est en pf 24 et donc aucun changement pour la destination, la présence de LA LIGNE fait que l'image est noire.
    J'ai essayé 10 fois, histoire d'être sûr que je ne suis pas fou et, non, c'est bien le compilo qui se prend les pieds dans le tapis et génère un code mal fichu.

    Bon, ok, c'est une vieille version, alors, quelqu'un pour tester avec une 3.0 ?
    Vous avez juste besoin de 2 TImage, imgSrc et imgDst, direct depuis la palette des compos, je ne leur ai changé aucune propriété (à part le nom).
    Changement du LoadFile :
    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
        imgSrc.Picture.Bitmap.Assign(MitchellTask(f));
        Result  := True;
      finally
      end;
    end;
    Petite modif à la fin de la MitchellTask :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ...
      end;
      ci.Free;
      with imgSrc do begin
        Width  := srcRect.Right;
        Height := srcRect.Bottom;
      end;
    end;
    La proc pour le trackbar
    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
    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   := 0;
        Top    := 0;
        Right  := round(srcRect.Right  * scale);
        Bottom := round(srcRect.Bottom * scale);
      end;
    Caption := its(dstRect.Right)+'--'+its(dstRect.Bottom); // valeurs ok
     
      // Etape 1 --> CREATION D'UN TBITMAP DE DESTINATION
      // jpt : sert à rien avec TImage/TBitmap, adaptation des dimensions, plutôt
     
      with imgDst do begin
        Width  := dstRect.Right;
        Height := dstRect.Bottom;
        // si ligne pf dessous présente, alors image affichée noire,
        // indépendamment du pf de la source, 24 comme 32 !
        // en jouant avec page préc/page suiv ça la fait apparaître.
        Picture.Bitmap.PixelFormat := imgSrc.Picture.Bitmap.PixelFormat; // LA LIGNE ! 
        Picture.Bitmap.Width  := Width;
        Picture.Bitmap.Height := Height;
      end;
     
      // Etape 2--> MODIFICATION DES DONNEES ORIGINELLES  VERS LE TBITMAP DE DESTINATION
      SetStretchBltMode(imgDst.Picture.Bitmap.Canvas.Handle, HALFTONE);
      StretchBlt(imgDst.Picture.Bitmap.Canvas.Handle, 0, 0, imgDst.Picture.Bitmap.Width, imgDst.Picture.Bitmap.Height,
        imgSrc.Picture.Bitmap.Canvas.Handle, 0, 0, imgSrc.Picture.Bitmap.Width, imgSrc.Picture.Bitmap.Height,
         SRCCOPY);
      //if imgSrc.Picture.Bitmap.PixelFormat = pf32bit then ConvertToPF32(imgDst);
      imgDst.Picture.Bitmap.Canvas.Changed; // jpt mandatory sinon fichier vide dessous
     
      // Autres Etapes :
      imgDst.Picture.Bitmap.SaveToFile(chemin+'imgDst.bmp');
      // fichier Dst en pf24 si Src 32, sans doute à cause du StrechBlt, d'où le Convert (à écrire)
    end;
    Et 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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      f: string;
    begin
      //f := ProgramDirectory+'embedded_xbr32.bmp';
      //f := ProgramDirectory+'embedded_xbr24.bmp';
      // lclci ok avec valeurs exotiques
      //f := ProgramDirectory+'embedded_xbr_127x63x32_vh1.bmp';
      f := ProgramDirectory+'embedded_xbr_127x63x24_vh1.bmp';
     
      // SRC --  setup srcRect dans Mitchelltask
      if not LoadFile(f) then begin
        ShowMessage('Erreur de chargement de ' + f + ', impossible de continuer.');
        Exit;
      end;
     
      // pour récupérer de la place pour la copie
      if imgSrc.Width < pnl4display.ClientWidth
        then sboxSrc.ClientWidth := imgSrc.Width + imgSrc.Left+2; // +2 sinon HScrollBar visible à tort
     
      trkScaleChange(nil);
    end;
    Je vous fais grâce des fichiers exotiques, le problème est présent avec les valeurs standard 128x64.
    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. #182
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

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

    cette histoire farfelue me fait penser à une gestion curieuse des événements, constatée depuis mon abandon de Delphi et mon passage à Linux.

    Regardez :

    Nom : gestion_événements.png
Affichages : 213
Taille : 23,6 Ko

    Malgré la demande du Show et le forçage dessous de la file d'attente des messages système, la fiche n'est pas visible.

    Si je me souviens bien, ce même code fonctionnait correctement sous Delphi.

    Ce qui est très curieux dans l'affaire du setting du PixelFormat de ce matin, c'est que sa présence impacte le déroulement des événements, et je ne sais pas où ça peut bien se cacher, surtout si des modifications des dimensions n'ont pas cet effet pervers...



    L'intrigue du Bounds et du -1 ou pas


    Elle s'explique en regardant ce que j'ai rajouté dans la MitchellTask, en trichant un peu je l'avoue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        srcRect.Left:=0; srcRect.Top:=0;
        srcRect.Right  := ImageBitmap.Width;
        srcRect.Bottom := ImageBitmap.Height;
    car en fait j'utilise ce srcRect comme un transporteur de valeurs (dont je pourrais me passer, d'ailleurs) entre la source et la destination.

    Qu'en dit l'aide ?
    Citation Envoyé par help
    Bounds returns a TRect record with the given origin (ALeft,ATop) and dimensions (AWidth,AHeight) filled in. The bottom-right corner is calculated by adding AWidth to ALeft and AHeight to ATop. As a result, a rectangle with width/height set to 0 is exactly 1 pixel.
    Dans classesh.inc on peut lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function Rect  (ALeft, ATop, ARight, ABottom: Integer): TRect;
    function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
    Et que fait Bounds ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
    begin
      with Result do
      begin
        Left   := ALeft;
        Top    := ATop;
        Right  := ALeft + AWidth;
        Bottom := ATop  + AHeight;
      end;
    end;
    et donc, si Left = 0 et Top = 0 aussi, alors Right du TRect retourné peut être vu comme sa Width.

    Ce qui est curieux, c'est la dernière phrase de l'aide, que je recopie ici :
    a rectangle with width/height set to 0 is exactly 1 pixel
    ce qui sous-entendrait que Left et Top valent 1 ? Ce n'est dit nulle part.

    En fait, il faut le penser autrement : quand je regarde le point de coordonnées 0,0, je ne regarde pas le point 0,1 qui est un autre point, ni le point 1,0 ni le 1,1. Je suis sur le 0,0, il existe, il fait 1 pixel de large sur 1 pixel (le même, donc) de haut.

    Le problème c'est qu'on mélange les pixels et les coordonnées, du coup on se retrouve avec des trucs farfelus genre Right := ALeft + AWidth; avec 9 := 0 + 10 -- mais comment est-ce possible ?
    Coordonnée 9 = Coordonnée 0 suivie d'un déplacement de 9 autres points puisqu'on est déjà sur le premier.
    De là où on est (le premier) jusqu'au dernier, il y en a 10 mais on n'a fait que 9 pas pour l'atteindre.

    Bref, toujours vérifier ses valeurs à coups de ShowMessage ou Caption := avant de valider :
    Nom : Bounds.png
Affichages : 217
Taille : 8,0 Ko
    Ici j'ai utilisé un fichier de 127x63,

    Car je trouve que l'aide explique mal : a rectangle with width/height set to 0 is exactly 1 pixel. Comment un rectangle qui n'a ni hauteur ni largeur peut-il quand même présenter un carré de 1 pixel ?

    Ils auraient dû dire a rectangle with right/bottom set to 0 is exactly 1 pixel (sous-entendu left et top aussi à 0, compliquons pas les choses.)
    Mais il est vrai qu'un pixel n'a besoin que de deux coordonnées.
    Bref, ils auraient encore mieux fait de se taire,
    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. #183
    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 JP

    J'ai pris un peu de temps pour faire une petita application pour montrer l'utilisation de TBMPViewer avec et sans StretchBlt

    Le projet : BMPViewerVSStretchBlt.zip

    La capture sous Windows

    Nom : stretchblt_win.gif
Affichages : 208
Taille : 695,0 Ko


    et la capture sous Linux sans aucun changement dans le code

    Nom : deepin-screen-recorder_Select area_20190319234507.gif
Affichages : 210
Taille : 1,38 Mo


    Si cela ne fonctionne pas c'est surement du à version 1.4 de Lazarus

    Citation Envoyé par Jipété Voir le message

    Le problème c'est qu'on mélange les pixels et les coordonnées, du coup on se retrouve avec des trucs farfelus genre Right := ALeft + AWidth; avec 9 := 0 + 10 -- mais comment est-ce possible ?
    Coordonnée 9 = Coordonnée 0 suivie d'un déplacement de 9 autres points puisqu'on est déjà sur le premier.
    De là où on est (le premier) jusqu'au dernier, il y en a 10 mais on n'a fait que 9 pas pour l'atteindre.
    D'ou ma réponse dans un post précédent. De plus si tu veux Cross-Compiler entre Linux et Windows , il faut en plus faire attention à l'unité ou est déclaré le TRect . Car si sous Windows l'unité "Windows" est déclaré après celle de Lazarus alors c'est le TRect de Windows qui est utilisé et le comportement est différent.

    Pour moi TRect Left,Top, Bottom, Right sont des positions et ne concernent en rien le Width et le Height (C'est d'ailleurs sur ces deux dernières valeurs, qu'il y a un différence entre le TRect natif de Lazarus et celui de Windows si je me souviens bien.
    Bref? pour ma part dans mon projet j'ai recréé ce type pour éviter de me prendre la tête en cross-compilation comme ça, par tout pareil (Write once, compil everywhere !)

    Bonne fin de soirée

    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Vit' fait :
    Citation Envoyé par Jipété Voir le message
    Ce qui est très curieux dans l'affaire du setting du PixelFormat de ce matin, c'est que sa présence impacte le déroulement des événements, et je ne sais pas où ça peut bien se cacher, surtout si des modifications des dimensions n'ont pas cet effet pervers...
    Sauf que ce qu'on voit n'a rien à voir avec ce qui se passe dans la vraie vie : si l'image est noire, c'est parce que le PixelFormat est mis à 32 bits et que ça met sa pagaille classique dans la gestion des bitmaps...

    Vais peut-être m'orienter vers un convertisseur 24->32 après traitement, si la source est 32 (ce qui est mon cas habituellement -- et quand c'est bon en 32 je teste ensuite en 24).

    Et je n'ai pas l'explication du pourquoi l'image est bien enregistrée (mais en 24 bits) et surtout, pourquoi elle finit par bien s'afficher en jouant avec la position du curseur d'échelle. Magique !

    EDIT : Ah lol ! On a posté quasiment ensemble.
    J'étudierai ça demain, ce soir je suis naze.

    Grand merci à toi
    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. #185
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Si cela ne fonctionne pas c'est surement dû à version 1.4 de Lazarus
    Donc ma version va très bien,

    Salut, J.

    et bravo !

    Ça fonctionne sans changer une virgule, donc, oui, bravo

    Maintenant, ne pas changer une virgule, c'est mal me connaître,

    D'abord, 3 lignes de cosmétique qui améliorent le quotidien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of String);
    begin
      Rempli := False;
      BmpViewerOrigin.LoadFromFile(FileNames[0]);
      Caption := ExtractFileName(FileNames[0]); // jpt
      pnlViewerSrc.Width := BmpViewerOrigin.FastBitmap.Width + 4; // jpt
      TrackBar1Change(self);
      BringToFront; // jpt
    end;

    Un microscopique détail dans FormCreate, où je regrette juste des lignes en commentaire sans explications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      with BmpViewerDest do
      begin
       Parent := sbViewerDest;
       Align  := alNone;
       Top := 0;
       Left := 0;
    //jpt   Width := 90;// jpt : sert à rien, non ? puisque déjà dans
    //jpt   Height := 90;// class function TBMPViewer.GetControlClassDefaultSize : TSize;
       //AutoSize :=True;
       //AutoStretchMode := smStretchAll;
    //   Center := False; // le dessin de l'image est centré dans le viewer
      end
    ;

    Et une question à propos de la création du 1er objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Parent := sbViewerOrig;
        Align  := alClient;
        AutoSize := True;
    Si alClient, à quoi sert AutoSize := True; ? --> Commenté, pas vu de différence.



    Quant au Trackbar, c'est le gros morceau.
    Dans la partie du haut, on doit pouvoir simplifier ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      if chkStretchBlt.Checked then
      begin
        TmpBmp := TBitmap.Create;
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
       // TmpBmp.PixelFormat := pf32bit; // commenté, soit (pourquoi ?). Mais si décommenté, DOIT être avant les dimensions.
    //jpt    SrcBmp := BmpViewerOrigin.Bitmap; // ça sert à quoi, ça ?
        SetStretchBltMode(TmpBmp.Handle, HALFTONE);
    {jpt    StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                   SrcBmp.Canvas.Handle, 0, 0, SrcBmp.Width, SrcBmp.Height,
                   SRCCOPY);    }
        StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                  BmpViewerOrigin.Bitmap.Canvas.Handle, 0, 0, BmpViewerOrigin.Bitmap.Width, BmpViewerOrigin.Bitmap.Height,
                  SRCCOPY);
    et voilà le résultat des tests, rajouté dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        with BmpViewerDest do
        begin
          AutoStretchMode := smManual;
          Width  := W; Height := H;
          FastBitmap.ImportFromBitmap(TmpBmp);
          //(BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin + 'stretch.bmp');
          //TmpBmp.SaveToFile(chemin + 'tmpbmp.bmp');
          // test avec src pf32 --> tmpbmp pf24, bmpVDest ok
          // idem avec src pf24
          Invalidate;
        end;
        FreeAndNil(TmpBmp);
      end
    La partie du bas peut se simplifier ainsi :
    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
      else
    //jpt  begin
    {jpt    if not(Rempli) then
        begin
          BmpViewerDest.FastBitmap.Assign(BmpViewerOrigin.FastBitmap);
          (BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin + 'no_stretch.bmp');
          Rempli := True;
        end;
        with BmpViewerDest do
        begin // calcul des dimensions de la cible
          AutoStretchMode := smStretchAll;
          Width  := W;
          Height := H;
          Invalidate;
        end;            }
        with BmpViewerDest do begin
          if not(Rempli) then
          begin
            FastBitmap.Assign(BmpViewerOrigin.FastBitmap);
            //(FastBitmap.GetBitmap).SaveToFile(chemin + 'no_stretch.bmp');
            Rempli := True;
          end;
          // calcul des dimensions de la cible
          AutoStretchMode := smStretchAll;
          Width  := W; Height := H;
          Invalidate;
        end;
    // jpt  end;
    et en regardant ces dernières lignes, je commence à entrevoir pourquoi je ne comprends pas certains trucs : je considère dans mon pauvre petit cerveau que si on a Auto(matique)StretchMode := smStretchAll; alors on n'a pas besoin d'imposer les dimensions, or il les faut, j'ai testé.
    Donc ce n'est pas automatique. Mais si je mets smManual comme dans la partie if chkStretchBlt.Checked, ça ne va pas non plus.

    Il y a donc pour moi là un gros problème de noms de choses qui ne font pas ce qu'elles sont censées faire et qui fait que ça ne rentre pas dans mes neurones.

    C'est un peu comme avec cet Invalidate, 'tain, le mec qui a inventé ça il faudrait le pendre par les pieds dans le désert du Nevada jusqu'à ce que les fourmis ne nous laissent que son squelette !
    Comment envisager intellectuellement de travailler avec un objet qui a été invalidé !?
    Truc de malade...
    Update c'était pas assez bien ?
    Bref...
    J'ai testé pour vous, ça fonctionne tout autant (à moins qu'il n'y ait des pièges cachés ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        ...
    //      Invalidate;
          Update;
        end;
        FreeAndNil(TmpBmp);
      end
     
      else
      ...
    //      Invalidate;
          Update;
        end;

    Enfin, soyons sérieux deux minutes : j'active l'enregistrement du fichier temporaire dans la partie chkStretchBlt.Checked, F9, je coche la case, je drag-n-drope un fichier et là, par magie, la copie s'effectue alors que le fichier temporaire est... plein de "0", donc tout noir !
    (En écrivant ce qui précède, la lumière se fait : il suffit de rajouter une ligne magique, après le StretchBlt : TmpBmp.Canvas.Changed; et là, le fichier de test n'est plus tout noir, ouf !
    Oui, désolé, mais en écrivant pour le post ça me met sur la voie de solutions, parfois.)


    Le seul truc qui me chagrine, c'est que si on part d'un fichier pf24 on se retrouve après traitement avec un fichier pf32.
    C'est grave docteur ?

    Mais encore une fois,
    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

  6. #186
    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
    Donc ma version va très bien,

    Salut, J.

    et bravo !

    Ça fonctionne sans changer une virgule, donc, oui, bravo

    Maintenant, ne pas changer une virgule, c'est mal me connaître,

    Salut, avant d'aller plus loin j'ai fait ca vite après le boulot donc un peu fatiguer.

    Citation Envoyé par Jipété Voir le message
    Un microscopique détail dans FormCreate, où je regrette juste des lignes en commentaire sans explications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      with BmpViewerDest do
      begin
       Parent := sbViewerDest;
       Align  := alNone;
       Top := 0;
       Left := 0;
    //jpt   Width := 90;// jpt : sert à rien, non ? puisque déjà dans
    //jpt   Height := 90;// class function TBMPViewer.GetControlClassDefaultSize : TSize;
       //AutoSize :=True;
       //AutoStretchMode := smStretchAll;
    //   Center := False; // le dessin de l'image est centré dans le viewer
      end
    ;

    Et une question à propos de la création du 1er objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Parent := sbViewerOrig;
        Align  := alClient;
        AutoSize := True;
    Si alClient, à quoi sert AutoSize := True; ? --> Commenté, pas vu de différence.
    Pource qui est des commentaire, c'est que j'ai commencé avec 1 seul TBmpViewer et oublié de les effacer.

    Pour ce qui est de l'autosize en fait Align devrait être sur alNone j'ai oublié de changé. AutoSize lorsqu'il est activé va faire en sorte que le TBmpViewer soit redimensionné à la taille de l'image chargée.

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        with BmpViewerDest do
        begin
         ....
          // calcul des dimensions de la cible
          AutoStretchMode := smStretchAll;
          Width  := W; Height := H;
          Invalidate;
        end;
    end;
    et en regardant ces dernières lignes, je commence à entrevoir pourquoi je ne comprends pas certains trucs : je considère dans mon pauvre petit cerveau que si on a Auto(matique)StretchMode := smStretchAll; alors on n'a pas besoin d'imposer les dimensions, or il les faut, j'ai testé.
    Si Auto(matique)StretchMode := smStretchAll; c'est l'image qui s'adapte au TBmpViewer pas le TBMPViewer qui s'adapte à l'image et donc pour pouvoir effectuer ce que tu souhaites ici dans ce cas précis il faut ajuster manuellement les dimensions du TBMPViewer

    Citation Envoyé par Jipété Voir le message
    Donc ce n'est pas automatique. Mais si je mets smManual comme dans la partie if chkStretchBlt.Checked, ça ne va pas non plus.
    Non regardes le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                   SrcBmp.Canvas.Handle, 0, 0, SrcBmp.Width, SrcBmp.Height,
                   SRCCOPY);
     
        with BmpViewerDest do
        begin
          AutoStretchMode := smManual;
          Width  := W;
          Height := H;
          FastBitmap.ImportFromBitmap(TmpBmp);
          Invalidate;
        end;
    Ici tu as déja redimensionné l'image avec StretchBit il faut juste ajuster les dimensions du TBMPViewer pour qu'il ne Stretch pas une seconde fois l'image cela ne sert à rien. D'ou le AutoStretchMode := smManual;Mais ici dans ce cas le resultat du stretch est conservé.

    Citation Envoyé par Jipété Voir le message
    Il y a donc pour moi là un gros problème de noms de choses qui ne font pas ce qu'elles sont censées faire et qui fait que ça ne rentre pas dans mes neurones.

    C'est un peu comme avec cet Invalidate, 'tain, le mec qui a inventé ça il faudrait le pendre par les pieds dans le désert du Nevada jusqu'à ce que les fourmis ne nous laissent que son squelette !
    Comment envisager intellectuellement de travailler avec un objet qui a été invalidé !?
    Truc de malade...
    Update c'était pas assez bien ?
    Bref...
    J'ai testé pour vous, ça fonctionne tout autant (à moins qu'il n'y ait des pièges cachés ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        ...
    //      Invalidate;
          Update;
        end;
        FreeAndNil(TmpBmp);
      end
     
      else
      ...
    //      Invalidate;
          Update;
        end;
    En fait Update doit appeler Invalidate en interne. Mais bon si cela marche alors pas de soucis

    Citation Envoyé par Jipété Voir le message
    Enfin, soyons sérieux deux minutes : j'active l'enregistrement du fichier temporaire dans la partie chkStretchBlt.Checked, F9, je coche la case, je drag-n-drope un fichier et là, par magie, la copie s'effectue alors que le fichier temporaire est... plein de "0", donc tout noir !
    (En écrivant ce qui précède, la lumière se fait : il suffit de rajouter une ligne magique, après le StretchBlt : TmpBmp.Canvas.Changed; et là, le fichier de test n'est plus tout noir, ouf !
    Oui, désolé, mais en écrivant pour le post ça me met sur la voie de solutions, parfois.)
    Bon a savoir dans tous les cas sous Windows on en a pas besoin. (enfin presque)

    J'ai fait un petit test avec un bmp en 32 bits avec de la transparence (ce qui est bizarre c'est que ce n'est pas avec tout ce genre de fichiers)

    Avec mon code original lors du stretchBlt on perd ces données sur l'alpha

    Nom : 2019-03-20_163106.jpeg
Affichages : 211
Taille : 47,3 Ko

    Et en modifiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if chkStretchBlt.Checked then
      begin
        TmpBmp := TBitmap.Create;
        TmpBmp.Width := W;
        TmpBmp.Height := H;
        TmpBmp.PixelFormat := pf32bit; // Ajout BZ
        SrcBmp := BmpViewerOrigin.Bitmap;
        SetStretchBltMode(TmpBmp.Handle, HALFTONE);
        StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                   SrcBmp.Canvas.Handle, 0, 0, SrcBmp.Width, SrcBmp.Height,
                   SRCCOPY);
        TmpBmp.Canvas.Changed; // Ajout BZ après commentaire JP sinon tout noir
    Tout est ok

    Nom : 2019-03-20_163234.jpeg
Affichages : 209
Taille : 45,4 Ko

    Citation Envoyé par Jipété Voir le message
    Le seul truc qui me chagrine, c'est que si on part d'un fichier pf24 on se retrouve après traitement avec un fichier pf32.
    C'est grave docteur ?

    Mais encore une fois,
    Le fait de se retrouvé avec un 32bits est que le TFastBitmap ne gère que des données en 32bits. Et cela quel que soit le bpp du fichier BMP 1,2,4,8,16,24,(32) tu auras toujours un 32bits au final
    Et non ce n'est pas grave car de nombreux effets utilisent l'alpha et en plus le fait que les données soient alignées on améliore les performances lors de l'écriture et lecture des pixels.

    Et enfin y'a pas que quoi

    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

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

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

    Il va falloir qu'on creuse l'aspect PixelFormat, j'ai l'impression qu'on ne s'est pas compris.

    Dans le code d'origine il y a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if chkStretchBlt.Checked then
      begin
        TmpBmp := TBitmap.Create;
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
        // TmpBmp.PixelFormat := pf32bit;
        ...
    et j'ai écrit ce matin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // TmpBmp.PixelFormat := pf32bit; // commenté, soit (pourquoi ?). Mais si décommenté, DOIT être avant les dimensions.
    1-) tu n'as pas répondu à la question pourquoi la ligne est-elle commentée ?
    2-) tu as décommenté la ligne sans tenir compte du commentaire qui disait de la mettre avant les dimensions.

    S'il faut la mettre, c'est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        TmpBmp := TBitmap.Create;
        TmpBmp.PixelFormat := pf32bit;
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
    mais je constate que ça ne sert à rien car en activant l'enregistrement du bmp pour contrôle, il est toujours en pf24, sans doute à cause de StretchBlt.
    Bon, on pourrait dire qu'on s'en fiche, ce qui compte c'est le résultat dans BMPViewerDest.
    Ceci étant dit, c'est curieux, donc autant le noter dans le code.

    Ensuite,
    on voit cette ligne TmpBmp.Canvas.Changed; // Ajout BZ après commentaire JP sinon tout noir mais c'est ennuyeux car là où elle est mise il n'y a pas de commentaire JP...

    Le commentaire JP servait à commenter l'utilisation de SrcBmp, qui pour moi est inutile, on peut directement utiliser BMPViewerOrigin. Ça te gêne ? On se contente de le lire pour le recopier par StretchBlt, à quoi bon s'encombrer d'un bmp temporaire intermédiaire ?

    J'avais donc écrit ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //jpt    SrcBmp := BmpViewerOrigin.Bitmap; // ça sert à quoi, ça ?
        SetStretchBltMode(TmpBmp.Handle, HALFTONE);
    {jpt    StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                   SrcBmp.Canvas.Handle, 0, 0, SrcBmp.Width, SrcBmp.Height,
                   SRCCOPY);    }
        StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                  BmpViewerOrigin.Bitmap.Canvas.Handle, 0, 0, BmpViewerOrigin.Bitmap.Width, BmpViewerOrigin.Bitmap.Height,
                  SRCCOPY);
    Ce n'est pas clair ?
    La 1re ligne ScrBmp := ... dégage, ainsi que le StretchBlt qui l'utilise, remplacé par celui qui va utiliser BmpViewerOrigin et hop, lumineux !



    Citation Envoyé par BeanzMaster Voir le message
    J'ai fait un petit test avec un bmp en 32 bits avec de la transparence (ce qui est bizarre c'est que ce n'est pas avec tout ce genre de fichiers)
    Il doit y avoir une raison, donc l'éditeur hexa est ton ami,


    La phrase qui tue :
    Citation Envoyé par BeanzMaster Voir le message
    AutoSize lorsqu'il est activé va faire en sorte que le TBmpViewer soit redimensionné à la taille de l'image chargée.
    C'est quoi la différence entre le TBmpViewer et l'image (les raw datas) dans le TBmpViewer ?
    C'est le même principe que le TImage, qu'on peut redimensionner sans toucher au Image.Picture.Bitmap et inversement ?

    Je me demande si ce TBmpViewer ne devrait pas s'appeler TBzViewer, ce "Bmp" dans son nom porte à confusion, àmha.

    Et si tu dois générer un nouveau fichier .pas, pense à corriger en rajoutant DstColor.AsInteger := 0; et dans FastBimap Result.AsInteger := 0; en suivant les indications que j'ai relevées ce matin (et on en avait déjà causé).

    Comme ça on aura des belles sources toutes propres,

    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        with BmpViewerDest do
        begin
          AutoStretchMode := smManual;
          ...
    Ce AutoStretchMode := smManual; est renvoyé dans le FormCreate, ça concerne le comportement de l'objet dans le prog.

    Au final,
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      BmpViewerOrigin := TBMPViewer.Create(Self);
      with BmpViewerOrigin do
      begin
        Parent := sbViewerOrig;
        Align  := alNone;
        Top := 0;
        Left := 0;
        AutoSize := True; // met le viewer à la taille de l'image chargée
      end;
     
      BmpViewerDest := TBMPViewer.Create(Self);
      with BmpViewerDest do
      begin
        Parent := sbViewerDest;
        Align  := alNone;
        Top := 0;
        Left := 0;
        AutoSize := False; // si true met le viewer à la taille de l'image chargée
        AutoStretchMode := smStretchAll; // l'image s'adapte au viewer
        // rigolo : génère un carré de 90x90 mauve si ligne dessus présente
        //AutoStretchMode := smManual; // manual ou ligne commentée -> ne dépasse pas 1/1
      end;
      Rempli := False;
    end;
    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
    procedure TForm1.TrackBar1Change(Sender: TObject);
    var
      scale: single;
      TmpBmp: TBitmap;
      W,H: Integer;
    begin
      scale := TrackBar1.Position / 100;
      lblStep.Caption := 'Step : ' + FloatToStr( round (scale*10) / 10 ); // donne des valeurs bien arrondies genre 0.3 1.2 etc.
      W := round(BmpViewerOrigin.FastBitmap.Width  * scale); // tout bon
      H := round(BmpViewerOrigin.FastBitmap.Height * scale); // :-)
     
      if chkStretchBlt.Checked then
      begin
        TmpBmp := TBitmap.Create;
        // TmpBmp.PixelFormat := pf32bit; sert à rien, c'est cassé par StretchBlt
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
        SetStretchBltMode(TmpBmp.Handle, HALFTONE);
        StretchBlt(TmpBmp.Canvas.Handle, 0, 0, W, H,
                  BmpViewerOrigin.Bitmap.Canvas.Handle, 0, 0, BmpViewerOrigin.Bitmap.Width, BmpViewerOrigin.Bitmap.Height,
                  SRCCOPY);
        TmpBmp.Canvas.Changed; // add by jpt
     
        with BmpViewerDest do
        begin
          FastBitmap.ImportFromBitmap(TmpBmp);
          Width  := W; Height := H;
          Update;
          // pour tester :
          //(BmpViewerDest.FastBitmap.GetBitmap).SaveToFile(chemin + 'stretch.bmp');
          //TmpBmp.SaveToFile(chemin + 'tmpbmp.bmp');
          // test avec src pf32 --> tmpbmp pf24, bmpDest ok
          // idem avec src pf24
        end;
        FreeAndNil(TmpBmp);
      end
     
      else // non coché
        with BmpViewerDest do 
        begin
          if not Rempli then
          begin
            FastBitmap.Assign(BmpViewerOrigin.FastBitmap);
            //(FastBitmap.GetBitmap).SaveToFile(chemin + 'no_stretch.bmp');
            Rempli := True;
          end;
          // setup des dimensions de la cible
          Width  := W; Height := H;
          Update;
        end;
    end;
    Au moins il y en a, au mieux je me porte,

    EDIT : pas compris à quoi servait le booléen rempli dans ton projet : survivance de mes codes avec pboxPaint ?
    J'ai commenté, ça fonctionne aussi bien, donc on pourrait encore alléger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      else // non coché
        with BmpViewerDest do
        begin
          FastBitmap.Assign(BmpViewerOrigin.FastBitmap);
          Width  := W; Height := H;
          Update;
          // pour tester :
          //(FastBitmap.GetBitmap).SaveToFile(chemin + 'no_stretch.bmp');
        end;
    Ou alors c'est pour améliorer les performances, partant du principe qu'à partir du moment où FastBitmap aura reçu des datas, il va s'en débrouiller avec, quelles que soient les dimensions ?
    Merci de confirmer ce point.
    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. #188
    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
    Bonsoir,

    Il va falloir qu'on creuse l'aspect PixelFormat, j'ai l'impression qu'on ne s'est pas compris.

    Dans le code d'origine il y a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if chkStretchBlt.Checked then
      begin
        TmpBmp := TBitmap.Create;
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
        // TmpBmp.PixelFormat := pf32bit;
        ...
    et j'ai écrit ce matin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // TmpBmp.PixelFormat := pf32bit; // commenté, soit (pourquoi ?). Mais si décommenté, DOIT être avant les dimensions.
    Comme les autres commentaires un truc que je n'avais pas effacé ou oublié de décommenter tout simplement. Et ce truc de avant après m'en souviens jamais vu que je n'utilise plus (trop) les TBitmaps

    Citation Envoyé par Jipété Voir le message
    1-) tu n'as pas répondu à la question pourquoi la ligne est-elle commentée ?
    2-) tu as décommenté la ligne sans tenir compte du commentaire qui disait de la mettre avant les dimensions.

    S'il faut la mettre, c'est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        TmpBmp := TBitmap.Create;
        TmpBmp.PixelFormat := pf32bit;
        TmpBmp.Width  := W;
        TmpBmp.Height := H;
    mais je constate que ça ne sert à rien car en activant l'enregistrement du bmp pour contrôle, il est toujours en pf24, sans doute à cause de StretchBlt.
    Bon, on pourrait dire qu'on s'en fiche, ce qui compte c'est le résultat dans BMPViewerDest.
    Ceci étant dit, c'est curieux, donc autant le noter dans le code.
    Oui bon a noter dans un coin quand même.

    Citation Envoyé par Jipété Voir le message
    Ensuite,
    on voit cette ligne TmpBmp.Canvas.Changed; // Ajout BZ après commentaire JP sinon tout noir mais c'est ennuyeux car là où elle est mise il n'y a pas de commentaire JP...
    Citation Envoyé par Jipété Voir le message

    Enfin, soyons sérieux deux minutes : j'active l'enregistrement du fichier temporaire dans la partie chkStretchBlt.Checked, F9, je coche la case, je drag-n-drope un fichier et là, par magie, la copie s'effectue alors que le fichier temporaire est... plein de "0", donc tout noir !
    (En écrivant ce qui précède, la lumière se fait : il suffit de rajouter une ligne magique, après le StretchBlt : TmpBmp.Canvas.Changed; et là, le fichier de test n'est plus tout noir, ouf !
    Oui, désolé, mais en écrivant pour le post ça me met sur la voie de solutions, parfois.)
    Citation Envoyé par Jipété Voir le message
    Le commentaire JP servait à commenter l'utilisation de SrcBmp, qui pour moi est inutile, on peut directement utiliser BMPViewerOrigin. Ça te gêne ? On se contente de le lire pour le recopier par StretchBlt, à quoi bon s'encombrer d'un bmp temporaire intermédiaire ?
    J'ai utilisé des variables TBitmap afin que tu puisses comprendre comment le TBMPViewer fonctionne et que tu ne te prennes plus les pieds avec l'utilisation conjointe de StretchBlt, c'est tout.

    Citation Envoyé par Jipété Voir le message
    Il doit y avoir une raison, donc l'éditeur hexa est ton ami,
    Pas le temps et je m'en f....

    Citation Envoyé par Jipété Voir le message
    La phrase qui tue :
    C'est quoi la différence entre le TBmpViewer et l'image (les raw datas) dans le TBmpViewer ?
    C'est quoi la différence entre le TImage et l'image qui s'affiche dans le TImage ?

    Citation Envoyé par Jipété Voir le message
    C'est le même principe que le TImage, qu'on peut redimensionner sans toucher au Image.Picture.Bitmap et inversement ?
    Oui c'est le même principe.

    Citation Envoyé par Jipété Voir le message
    Je me demande si ce TBmpViewer ne devrait pas s'appeler TBzViewer, ce "Bmp" dans son nom porte à confusion, àmha.
    C'est comme le TGIFViewer, il prend en charge uniquement les GIFs, ici c'est pareil TBMPViewer prend en charge uniquement les BMPs donc non. Par contre dans mon gros projet j'ai bien un composant visuel dans le même genre qui se nomme TBZImageViewer qui lui par contre, prend en charge plusieurs formats (bmp, gif, jpeg, png, pixmap, xpm, pcx, tga...)

    Citation Envoyé par Jipété Voir le message
    Et si tu dois générer un nouveau fichier .pas, pense à corriger en rajoutant DstColor.AsInteger := 0; et dans FastBimap Result.AsInteger := 0; en suivant les indications que j'ai relevées ce matin (et on en avait déjà causé).

    Comme ça on aura des belles sources toutes propres,
    Je ne ferais pas de mise à jour et je me suis déja expliqué sur ces messages d'avertissements qui n'ont aucune incidences.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uFastBitmap.pas(455,29) Warning: Function result variable  does not seem to initialized
    Ici c'est à cause de l'utilisation du WITH mais toutes les propriétés de Result qui est un TColor32 sont belle et bien initialisées. Ca sert donc a rien de rajouter un instruction supplémentaire Result.AsInteger := 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uBMPViewer.pas(2246,54) Warning: Local variable "DstColor" does not seem to be initialized
    Là par contre il y a une erreur ! mais rien à voir avec ce message d'avertissement.

    Un oubli de ma part :

    Les lignes 2246 et 2281 sont à modifier comme ceci : IsOpaque := IsOpaque and (DstLine^.alpha = 255);En plus dans ma version de Lazarus et FPC 3.0.4 ces messages d'avertissement n'apparaissent pas

    Citation Envoyé par Jipété Voir le message
    Ce AutoStretchMode := smManual; est renvoyé dans le FormCreate, ça concerne le comportement de l'objet dans le prog.

    Au final,
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      BmpViewerOrigin := TBMPViewer.Create(Self);
      with BmpViewerOrigin do
      begin
        Parent := sbViewerOrig;
        Align  := alNone;
        Top := 0;
        Left := 0;
        AutoSize := True; // met le viewer à la taille de l'image chargée
      end;
     
      BmpViewerDest := TBMPViewer.Create(Self);
      with BmpViewerDest do
      begin
        Parent := sbViewerDest;
        Align  := alNone;
        Top := 0;
        Left := 0;
        AutoSize := False; // si true met le viewer à la taille de l'image chargée
        AutoStretchMode := smStretchAll; // l'image s'adapte au viewer
        // rigolo : génère un carré de 90x90 mauve si ligne dessus présente
        //AutoStretchMode := smManual; // manual ou ligne commentée -> ne dépasse pas 1/1
      end;
      Rempli := False;
    end;
    Des fois tu pourras avoir dans ce cas une surface autre que mauve.
    Ce carré mauve je sais d'ou cela viens.
    C'est à cause du FastBitmap dans TBMPLoader qui est de 1x1 à la creation et car aucune couleur de fond est initialisé pour celui-ci.
    C'est ce FastBitmap qui est utilsé dans le TBMPViewer du coup il est automatiquement ajusté aux dimensions originelles du TBMPViewer soit 90x90 si AutoStretchMode := smStretchAll;
    Pour bien faire il faudrait rajouté un test avec un boolean genre Rempli : Boolean pour éviter ce comportement dans Paint par exemple.

    Citation Envoyé par Jipété Voir le message
    Au moins il y en a, au mieux je me porte,
    Le code de cette application n'est pas optimisé c'est clair. Je l'ai fait juste pour te comprennes mieux. A toi de l'amélioré . En plus en ce moment je n'ai vraiment pas beaucoup de temps à moi vu que je bosse à mi-temps voir plus (quand je dis à mi-temps c'est minimum 12h)
    • "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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    C'est quoi la différence entre le TImage et l'image qui s'affiche dans le TImage ?
    Le TImage c'est comme une boîte de conserve, et l'image qui s'affiche, c'est comme la sauce tomate (ou les haricots verts, hein) stockée dans la boîte.

    Mes notes sue la chose :
    There are two canvases in TImage: Image.Canvas and Image.Picture.Bitmap.Canvas. The first is canvas just like any other, the second is canvas of loaded picture. You can "textout" on the second one, but only once, after loading the picture, or in FormCreate event. It will then stay on the image.

    https://stackoverflow.com/questions/...orts-mouse-x-y
    When you access Image1.Canvas for the first time a TBitmap is created with the size of Image1. This bitmap size is not adjusted when image1 is resized. The Stretch = true renders the bitmap to the current image size, but the bitmap itself is the former size.

    You can fix this by adjusting Image1.Picture.Bitmap whenever Image1 is resized. As TImage has no OnResize you can use a TPanel as a container and make the adjustment in its OnResize event.

    http://wiki.freepascal.org/Developing_with_Graphics/fr

    Dessiner sur un Timage

    Un TImage se compose de 2 parties (2 canvas) :
    - un TGraphic, habituellement un TBitmap contenant l'image persistante (pour y écrire : imgPersiste.Picture.Graphic.Assign(SrcBitmap) ou imgPersiste.Picture.Bitmap := SrcBitmap, mais vérifier sa taille avant d'y dessiner),
    - et l'aire visuelle, volatile, laquelle est peinte à chaque OnPaint (pour y écrire : imgVolatile.Canvas.Draw(0, 0, SrcBitmap).

    Image.Picture.Graphic = canvas persistant de stockage
    Image.Canvas = canvas volatile d'affichage

    Il est plus que conseillé de dessiner sur le canvas volatile de TImage puisqu'il se charge de tout et s'occupe de sauvegarder le dessin dans le canvas persistant.


    /!\ Redimensionner le TImage ne redimensionne pas le bitmap /!\

    Le graphique (ou bitmap) est accessible par l'intermédiaire de Image1.Picture.Graphic (ou Image1.Picture.Bitmap).
    Le canvas est Image1.Picture.Bitmap.Canvas.
    Le canvas de l'aire visuelle d'un TImage est seulement accessible pendant Image1.OnPaint via Image1.Canvas.

    À l'intérieur de Image1.OnPaint, Image1.Canvas pointe vers l'aire visible volatile. En dehors de Image1.OnPaint Image1.Canvas pointe vers Image1.Picture.Bitmap.Canvas.

    Important : Ne jamais employer le OnPaint de l'évènement Image1 pour dessiner le graphique/bitmap d'un TImage. Le graphique d'un TImage est en mémoire tampon aussi tout que vous devez faire est de dessiner vers elle de n'importe où et le changement est là pour toujours. Cependant, si vous redessinez constamment, l'image clignotera. Dans ce cas-ci vous pouvez essayer les autres options.

    Dessiner sur un TImage est considéré comme étant plus lent que les autres approches.


    http://forum.lazarus.freepascal.org/...?topic=12770.0
    If image is modified through its graphic canvas, then Invalidate is called automagically. If image is modified by byte manipulation, then no call is made -> user must do it !


    http://lists.lazarus.freepascal.org/...ry/070254.html
    Very important: before you call Scanline's method, call BeginUpdate and after you are done, EndUpdate. The last one should trigger the paint method.
    And don't do that from within the paint method, leave the paint method alone!

    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. #190
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Yop !
    Citation Envoyé par BeanzMaster Voir le message
    Les lignes 2246 et 2281 sont à modifier comme ceci : IsOpaque := IsOpaque and (DstLine^.alpha = 255);
    Excellent ! 1 warning de moins,


    Citation Envoyé par BeanzMaster Voir le message
    Je ne ferai pas de mise à jour et je me suis déja expliqué sur ces messages d'avertissements qui n'ont aucune incidence.
    Oui mais ça fait désordre :

    Nom : resultasinteger.png
Affichages : 331
Taille : 34,9 Ko


    Bonne journée,
    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. #191
    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
    Yop !

    Oui mais ça fait désordre :

    Nom : resultasinteger.png
Affichages : 331
Taille : 34,9 Ko


    Bonne journée,
    Pour le premier effacé maths des uses
    Et pour le deuxième un clic droit sur le message et choisir une des options (les deux premières ayant ma préférence)

    Nom : 02a.jpg
Affichages : 322
Taille : 13,2 Ko

    et hop plus de messages

    Bonne fin de journée
    • "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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Pour le premier, effacer maths des uses
    Oui, ça je savais, quand même,

    Citation Envoyé par BeanzMaster Voir le message
    Et pour le deuxième un clic droit sur le message et choisir une des options (les deux premières ayant ma préférence)

    Nom : 02a.jpg
Affichages : 322
Taille : 13,2 Ko

    et hop plus de messages
    Non, des messages cachés mais le défaut toujours présent.

    Perso, j'ai initialisé les variables et hop !, plus de signalement de warning,
    Du coup je forke,

    Trêve de plaisanterie, t'as vu ? J'ai coché !
    Grâce à toi et à ton compo de la mort qui tue,

    À lire 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

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

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

    Citation Envoyé par Jipété Voir le message
    Trêve de plaisanterie, t'as vu ? J'ai coché !
    Et aujourd'hui je le décoche, , bien obligé, il y a quelque chose qui ne va pas du tout...

    Ce matin j'ai attentivement regardé le code D7 qui fonctionne parfaitement bien, et ai tenté de le reproduire.
    Le cœur du truc c'est ça :
    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
    //D7 procedure TFrmDemoMain.bStretchXBRClick(Sender: TObject); c'est un bête TButton
    procedure TForm1.FakeBtnStretch; // appelée ici par trkScaleChange
    begin
      aBmp := StretchXBR(BmpViewerOrig.FastBitmap.GetBitmap, Scale);//, ProgressBar1.StepIt); // D7, inclut ProgressBar
      // recrée aBmp par Result
      aBmp.SaveToFile(chemin+FloatToStr(round(scale*10)/10)+'_fbs-xbr.bmp'); // fichier 1024x512 tout blanc... -->
     
      //D7 imgResized.Picture.Bitmap.Assign(aBmp);
      //D7 imgResized.Invalidate;
     
      with BmpViewerDest do
      begin
        FastBitmap.ImportFromBitmap(aBmp);
        AutoStretchMode := smStretchAll;
        Width  := round(BmpViewerOrig.FastBitmap.Width  * scale);
        Height := round(BmpViewerOrig.FastBitmap.Height * scale);
        Invalidate;
      end;
     
      // ... --> alors comment se fait-il qu'il y ait une image affichée ?
      BmpViewerDest.FastBitmap.GetBitmap.SaveToFile(chemin+'_sfp-dst.bmp'); // fichier rempli
      aBmp.free; // D7
    end;
    Voilà la copie d'écran, en arrière-plan le prog et en avant-plan l'image '_sfp-dst.bmp' dans le viewer Linux.

    Nom : code_d7.png
Affichages : 182
Taille : 27,1 Ko

    C'est une vraie question : d'où sort cette image ?
    Comment a-t-elle pu "atterrir" dans BmpViewerDest.FastBitmap puisque aBmp est vide juste avant ?

    Pour en avoir le cœur net, j'ai forcé un Clear :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      with BmpViewerDest do
      begin
        FastBitmap.Clear(clrWhite);
        FastBitmap.ImportFromBitmap(aBmp);
        ...
    et l'image sortie d'on ne sait où s'affiche...
    Ça dépasse mon entendement,
    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. #194
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ça dépasse mon entendement,
    J'ai trouvé.

    C'est incroyable mais c'est comme ça, et à ce niveau-là faut plus se poser de questions, faut noter et faire.

    La procédure présentée dans le post précédent est écrite dans l'unité de l'ihm, et on y a bien vu un appel à une fonction, dans une unité à part.
    Dans cette unité il y a l'utilisation de StretchBlt, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        StretchBlt(Result.Canvas.Handle, 0, 0, WR, HR,
            Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, SRCCOPY);
    (oui, en plus ça surprend, un strech de Result sur Result, mais en D7 ça fonctionne).

    La solution consistait à rajouter une ligne à la suite des deux précédentes :
    On aurait pu penser que ce genre de chose aurait été automatique, mais non...

    La matinée pour trouver ça (et d'autres choses, mais j'ai une bonne nouvelle... -- le temps de rédiger une réponse lisible et intelligible)
    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 10 sur 10 PremièrePremière ... 678910

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