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 :

Copie d'image : résultat bon ou mauvais selon le type d'image [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Page 7 !
    J'avais dit que je reviendrais, alors coucou me revoilou

    Citation Envoyé par BeanzMaster Voir le message
    pour le DownSample tu peux essayer ça en modifiant par rapport à ton "système"
    M'en suis pas sorti (trop de TBZ...)

    Citation Envoyé par BeanzMaster Voir le message
    et pour le stretch (exemple de davdata "un peu modifié") les performances sont plus que raisonnable et meilleur que le StretchDraw de la LCL:
    Mêmes causes que ci-dessus, plus le fait que dans aucune de tes procs je n'ai vu comment lui passer simplement l'image source à redimensionner.
    Merci d'avoir tenté, mais ne te prends pas la tête avec ça.

    Citation Envoyé par ThWilliam Voir le message
    Je me souviens d'avoir fait des tests de réduction d'image sous Delphi :

    StretchDraw : très rapide, mais mauvaise qualité en cas de forte réduction (image trop accentuée)
    StretchBlt : très rapide, bonne qualité. (je crois que Linux l'accepte)
    Avec GraphicEx : lent, très bonne qualité.
    J'ai mis en gras le mot qui tue

    Si on fait abstraction de GraphicEx, les deux autres sont utilisables sous Linux/Laz1.4, mais je me demande si le premier (haut niveau) ne s'appuierait pas sur le second (bas niveau), quand on voit la manière dont il faut configurer les paramètres, plus un en commun, le SetStretchBltMode(dst.Canvas.Handle, HALFTONE); qu'on retrouve à l'identique juste avant d'appeller la première ou la seconde manière...
    En tout état de cause, question timing d'exécution c'est pareil, et question qualité graphique du résultat c'est pareil aussi avec mon fichier 800x600.

    Citation Envoyé par ThWilliam Voir le message
    Et sous Lazarus avec BGRABitmap :
    SimpleStretch : relativement rapide, mais image un peu floue en cas de forte réduction.
    FineInterpolation : lent, très bonne qualité
    Ça me fait penser aux deux manières de faire natives dans Laz, j'avais testé, ça a donné ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      // Execute the StretchDdraw via TFPSharpInterpolation
      //DestCanvas.Interpolation := TFPSharpInterpolation.Create; // une horreur, gardé pour mémoire [origine]
      DestCanvas.Interpolation := TMitchelInterpolation.Create; // OK
      DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage);

    Bon, jusque là on a plutôt joué avec le mode "réduction d'image", et si on essayait de l'agrandir, l'image source ?

    Ben les résultats c'est l'inverse -- à gauche l'original, au milieu l'agrandissement avec StretchDraw/StretchBlt (pas vu de diff.) et à droite les procédures à coups de Scanline et méthode des moyennes sur carrés de 4 : c'est nettement supérieur !
    Nom : agrandissement.png
Affichages : 291
Taille : 87,4 Ko

    En résumé : StretchBlt pour réduire, du Scanline sur carrés de 4 pour agrandir.
    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. #122
    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
    Page 7 !
    J'avais dit que je reviendrais, alors coucou me revoilou


    M'en suis pas sorti (trop de TBZ...)


    Mêmes causes que ci-dessus, plus le fait que dans aucune de tes procs je n'ai vu comment lui passer simplement l'image source à redimensionner.
    Merci d'avoir tenté, mais ne te prends pas la tête avec ça.
    Salut j'ai pas trop le temps mais en gros
    Faut juste transtyper
    TBZColorPointer = PTRGBQuad
    TBZBitmap =TBitmap
    ScanLine = RawImage.GetLiuneStart

    Tiens voila l'exemple du Stretch avec des TBitmap en 32Bits

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
    {$ASMMODE INTEL}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
      StdCtrls, ExtDlgs, FPImage;
     
    type
      TRGBQuad = packed record
        R,G,B,A : Byte
      end;
      PRGBQuad = ^TRGBQuad;
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        OpenPictureDialog: TOpenPictureDialog;
        Panel1: TPanel;
        Panel2: TPanel;
        pnlSrc: TPanel;
        pnlDst: TPanel;
        procedure Button1Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
        procedure FormShow(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
        SrcBmp : TBitmap;
        DstBmp : TBitmap;
     
        procedure UpdateSrcView;
        procedure UpdateDstView;
     
        Procedure MyStretch(Const NewWidth:Integer;Const NewHeight:Integer;Const KeepRatio:Boolean=false);
      end;
     
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    function RGBQuadToFPColor(Const RGBA: TRGBQuad) : TFPcolor;
    begin
      with Result do
      begin
        Red   :=(RGBA.R shl 8) or RGBA.R;
        Green :=(RGBA.G shl 8) or RGBA.G;
        Blue  :=(RGBA.B shl 8) or RGBA.B;
        Alpha :=255-RGBA.A;
        Alpha :=(RGBA.A shl 8) or RGBA.A;
      end;
    end;
     
    function Clamp(const V,Min,Max : integer) : integer;  assembler; nostackframe;
    asm
    {$IFDEF CPUX86_64}
            MOV     EAX,ECX
            MOV     ECX,R8D
    {$ENDIF}
            CMP     EDX,EAX
            CMOVG   EAX,EDX
            CMP     ECX,EAX
            CMOVL   EAX,ECX
    end;
     
     
    procedure KeepAspectRatio(Const SrcW,SrcH:Integer; var NewWidth, NewHeight:Integer);
    begin
      // KEEP RATIO
        if SrcW <> SrcH then
            begin
              if SrcH > SrcW then
              begin
               // NewHeight := wHeight;
                NewWidth := (NewHeight * SrcW) div SrcH;
              end
              else
              begin
               // newWidth := wWidth;
                NewHeight := (NewWidth * SrcH) div SrcW;
              end;
            end;
    end;
     
    Procedure TForm1.MyStretch(Const NewWidth:Integer;Const NewHeight:Integer;Const KeepRatio:Boolean=false);
    Var
      NH,NW,SrcW,SrcH,X,Y : Integer;
      //SrcWMax,SrcHMax: Integer;
      destwidth,destheight : Integer;
      fx,fy,fxstep,fystep :Single;
      U, V, U2, V2 : Integer;
      AColor : TRGBQuad;
     // DstPtr:PByte; //PRGBQuad;
      SrcPtr:PRGBQuad;
    begin
     
      NW:=NewWidth;
      NH:=NewHeight;
     
      SrcW:=SrcBmp.Width;
      SrcH:=SrcBmp.Height;
     
      if KeepRatio then KeepAspectRatio(SrcW,SrcH,NW,NH);
     
      with DstBmp do
      begin
        SetSize(NW,NH);
      end;
      destwidth := NW-1;
      destheight := NH-1;
      fx := SrcW / NW;
      fy := SrcH /NH;
      fxstep := 0.99999*fx;
      fystep := 0.99999*fy;
      V2:=0;
      //DstPtr:=DstBmp.RawImage.GetLineStart(0); //PRGBQuad(
      For Y:=0 to destheight do
      begin
        V := V2;
        V2  := round((fyStep+Y)*fy);
        V:=Clamp(V,0,SrcBmp.Height-1);
        U2:=0;
        SrcPtr:=PRGBQuad(SrcBmp.RawImage.GetLineStart(V));
        For X:=0 to destwidth do
        begin
          U:= U2;
          U2 := round((fxStep+X)*fx);
          U2:=Clamp(U2,0,SrcBmp.Width-1);
          AColor:=(SrcPtr+U)^;
          DstBmp.Canvas.Colors[x,y]:=RGBQuadToFPColor(AColor);
        end;
      end;
     
    end; 
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
     SrcBmp:=TBitmap.Create;
     DstBmp:=TBitmap.Create;
    end;
     
     
    procedure TForm1.UpdateSrcView;
    begin
      with pnlSrc.Canvas do
       begin
         Lock;
         Draw(0,0,SrcBmp);
         Unlock;
      end;
    end;
     
    procedure TForm1.UpdateDstView;
    begin
      with pnlDst.Canvas do
       begin
         Lock;
         Draw(0,0,DstBmp);
         Unlock;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OpenPictureDialog.Execute then
      begin
        SrcBmp.LoadFromFile(OpenPictureDialog.FileName);
        UpdateSrcView;
      end;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      MyStretch(SrcBmp.Width*2, SrcBmp.Height*2,true);
      UpdateDstView;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      SrcBmp.Free;
      DstBmp.Free;
    end;
     
    end.
    Je mettrai le DowSample et le StretchSmooth en utilisant un pointer comme destination à la place du DstBmp.Canvas.Colors[x,y]:=RGBQuadToFPColor(AColor); plus tard si tu veux. Faut que reparte bosser là.

    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Faut juste transtyper
    TBZColorPointer = PTRGBQuad
    TBZBitmap =TBitmap
    ScanLine = RawImage.GetLineStart
    Oui, ça j'avais compris, d'autant plus qu'un commentaire mettait sur la piste et que de mon côté j'avais remarqué récemment le TRGBAquad dans Graphics.pas, mais ça n'a pas suffi, alors bon.


    Citation Envoyé par BeanzMaster Voir le message
    Tiens voila l'exemple du Stretch avec des TBitmap en 32Bits
    Euh, ça fonctionne, ça, chez toi ?
    T'es sûr que tu ne te fais pas des nœuds entre les codes d'essais, les codes ratés, les codes à moitié fonctionnels, etc. ?

    Parce que chez moi non seulement ça s'affiche comme ça (Linux à g, XP à d) :
    Nom : essai_bz.png
Affichages : 399
Taille : 95,9 Ko

    mais en plus sous Linux si une fenêtre quelconque recouvre la fiche de ton exemple, hop !, plus d'images.

    Et c'est looooooooooooooooooooooooooong ! Avec mon fichier de test 800x600, environ 4 secondes avec ta fonction "MyStretch", environ 30 millisecondes avec StretchBlt, y a photo !

    J'ai dit en début d'après-midi de ne plus se prendre la tête : je vais utiliser StretchBlt qui me donne une bien meilleure qualité en réduction sur les images avec texte que les routines avec pointeurs et carrés de pixels, je devrais d'ailleurs cliquer sur mais j'attends un peu.
    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

  4. #124
    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
    Oui, ça j'avais compris, d'autant plus qu'un commentaire mettait sur la piste et que de mon côté j'avais remarqué récemment le TRGBAquad dans Graphics.pas, mais ça n'a pas suffi, alors bon.



    Euh, ça fonctionne, ça, chez toi ?
    T'es sûr que tu ne te fais pas des nœuds entre les codes d'essais, les codes ratés, les codes à moitié fonctionnels, etc. ?

    Parce que chez moi non seulement ça s'affiche comme ça (Linux à g, XP à d) :
    Eye.BMP est en 24Bits normal l'exemple ne fonctionne qu'avec du 32bits
    Nom : 2017-05-10_222049.jpg
Affichages : 307
Taille : 89,2 Ko
    Nom : 2017-05-10_220934.jpg
Affichages : 306
Taille : 22,8 Ko
    Nom : 2017-05-10_221046.jpg
Affichages : 300
Taille : 30,6 Ko


    Le fait que l'on passe par le RawImage faut se taper la description pour ajuster la lecture et l'écriture des pixels en fonctions du pixelformats, le padding de fin de ligne ect.... bref une misère avec TLazIntfImage çela donnera de meilleur resultats

    Citation Envoyé par Jipété Voir le message
    mais en plus sous Linux si une fenêtre quelconque recouvre la fiche de ton exemple, hop !, plus d'images.
    Comportement normal car on dessine qu'une seule fois sur les panels. Sinon faut passer par le OnPaint de la fiche pour actualiser l'affichage automatiquement

    Citation Envoyé par Jipété Voir le message
    Et c'est looooooooooooooooooooooooooong ! Avec mon fichier de test 800x600, environ 4 secondes avec ta fonction "MyStretch", environ 30 millisecondes avec StretchBlt, y a photo !
    Ici c'est normal que ce soit plus long car pour l'écriture des pixels on passe par le Canvas du bitmap du coup c'est beaucoup plus long (environ 500x plus long) que d'accéder directement au RawImage.Data

    Citation Envoyé par Jipété Voir le message
    J'ai dit en début d'après-midi de ne plus se prendre la tête : je vais utiliser StretchBlt qui me donne une bien meilleure qualité en réduction sur les images avec texte que les routines avec pointeurs et carrés de pixels, je devrais d'ailleurs cliquer sur mais j'attends un peu.
    Ouep je sais c'était juste pour te donner un exemple qui te permettes de mieux appréhender les petits codes que j'ai mis Et normal que StretchBlt donne une bien meilleure qualité y' a du Lissage avec

    EDIT : Attention avec les fichier BMP les valeurs Rouge et Bleue étant Inversées faut donc déclarer TRGBQuad comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type   TRGBQuad = packed record
        B,G,R,A : Byte
      end;
      PRGBQuad = ^TRGBQuad;
    Pour le 24bits faut juste virer le Alpha normalement, mais attention au padding de fin de ligne lors de la lecture

    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Eye.BMP est en 24Bits normal l'exemple ne fonctionne qu'avec du 32bits
    Comme je me doutais d'un coup tordu de ce genre, j'ai aussi testé avec un fichier 32 bits, et le résultat est identique, ce qui est bien ennuyeux...
    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. #126
    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
    Comme je me doutais d'un coup tordu de ce genre, j'ai aussi testé avec un fichier 32 bits, et le résultat est identique, ce qui est bien ennuyeux...
    Bizarre car chez moi le 32bits comme tu peux le voir ça passe sous Windows avec le fichier test de "DavData" et d'autres
    • "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. #127
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Citation Envoyé par ThWilliam Voir le message
    Je me souviens d'avoir fait des tests de réduction d'image sous Delphi :

    StretchDraw : très rapide, mais mauvaise qualité en cas de forte réduction (image trop accentuée)
    StretchBlt : très rapide, bonne qualité. (je crois que Linux l'accepte)
    [...] je me demande si le premier (haut niveau) ne s'appuierait pas sur le second (bas niveau), quand on voit la manière dont il faut configurer les paramètres, plus un en commun, le SetStretchBltMode(dst.Canvas.Handle, HALFTONE); qu'on retrouve à l'identique juste avant d'appeller la première ou la seconde manière...
    En tout état de cause, question timing d'exécution c'est pareil, et question qualité graphique du résultat c'est pareil aussi avec mon fichier 800x600.
    Ola !

    Je me cite car j'ai découvert un truc qui fait que j'ai dit des bêtises ci-dessus... Explication, démonstration :

    Comme un imbécile nageant en plein bonheur, il m'a pris l'idée de comparer les réductions effectuées avec StrechDraw et StretchBlt, et malheureusement, les couleurs changent !

    Vous ne me croyez pas ? Regardez, à gauche le résultat avec Stretchdraw et à droite avec StretchBlt :
    Nom : compar_stretchs.png
Affichages : 309
Taille : 169,7 Ko

    Vous ne voyez rien ? Regardez de plus près, particulièrement la zone blanche en plein milieu, et la zone bleue à sa gauche :

    Nom : compar_stretchzoomés.png
Affichages : 401
Taille : 11,6 Ko

    Pas flagrant, dites-vous ? Alors l'une après l'autre :

    Nom : compar_stretch.gif
Affichages : 309
Taille : 48,5 Ko

    Convaincu, maintenant ?

    Et comment fait-on ? Elle est où la bonne image, celle qui respecte le mieux l'original ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    re-Bonjour,

    J'ai dû me faire des nœuds avec les copies d'écran (puisque les images étaient impossibles à générer depuis StretchBlt, voir l'autre discussion), résultat j'ai écrit une bêtise, là, il y a 3 jours :

    Citation Envoyé par Jipété Voir le message
    il m'a pris l'idée de comparer les réductions effectuées avec StrechDraw et StretchBlt, et malheureusement, les couleurs changent !

    Vous ne me croyez pas ? Regardez, à gauche le résultat avec Stretchdraw et à droite avec StretchBlt :
    Il y a bien des différences par ci par là, mais en tout état de cause les images générées par StrechXXX sont similaires.

    Je vous ai préparé un petit gif, attention ça va vite, 1/2 seconde par image et il n'y en a que 4 :
    Nom : 4_bitmaps.gif
Affichages : 303
Taille : 93,2 Ko

    Les chiffres en bas à droite c'est pour moi, pour me repérer :
    1 : 4 procédures à base de ScanLine ;
    4 : MakeThumb encore à base de ScanLine ;
    5 : la procédure d'Andnotor à base de ScanLine aussi ;
    7 : StretchBlt, 3xStretchDraw, le ScanLine de DavData.
    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. #129
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Je pensais être venu à bout de ces histoires de StretchDraw/Blt, mais c'était sans compter la perfidie de Lazarus en mode multi-plateformes...

    Je me suis généré un nouveau fichier de test, de 400x300, et j'ai mis en place un petit projet avec une réduction basée sur StretchDraw vers 300x225 et un agrandissement vers 600x450 basé sur Scanline et autres pRGBArray trouvé chez swissdelphicenter.

    Et voilà les résultats, en haut XP et StretchDraw en bas à gauche de l'image se vautre lamentablement, dessous Linux et là c'est l'agrandissement qui explose, agrandissement qui fonctionne parfaitement bien si je le compile en {$MODE DELPHI} mais là je suis resté en {$mode objfpc}.
    Nom : compar_xp_linux.png
Affichages : 285
Taille : 321,5 Ko

    J'ai dit que StretchDraw se vautrait sous XP, voilà un détail à l'échelle 1:1 (au-dessus c'est 1:2 pour éviter de mettre des images immenses où on ne voit rien) : en haut XP en bas Linux, c'est le même code (dossier partagé entre les 2 environnements) :
    Nom : compar_réduct.png
Affichages : 304
Taille : 7,9 Ko

    EDIT : après tests poussés, c'est StretchDraw qui se vautre, StretchBlt est bon -- je croyais pourtant que le code du second s'appuyait sur le premier...

    /EDIT


    Et hier soir à pas d'heure j'ai aussi découvert ça, dans l'ancien projet de test : sous Linux, à gauche l'original, à droite une demande de réduction à 300x255, et ça part en sucette, seulement j'avais demandé aussi l'enregistrement du fichier bmp (qui génère l'image toute pourrie) et croyez-le ou pas, mais l'image dans le fichier vous la voyez en bas à droite dans le visionneur où elle est on ne peut plus parfaite :
    Nom : pb_lena_300_32.jpg
Affichages : 328
Taille : 115,1 Ko

    Je donne ma langue au chat, 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

  10. #130
    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
    Bonsoir,

    je pense que c'est un problème de lecture des données par rapport au RawImage lors de l'affichage. Regardes ce qui se passe lorsque je lis un fichier BMP 32bits avec ma procedure de chargement pour le 24bits

    Nom : 2017-05-16_011306.jpg
Affichages : 309
Taille : 79,1 Ko

    Par contre te dire dans quelle méandre du processus graphique de la LCL alors là ? aucunes idées faudrait allez au dela du stretchdraw avec des F7 mais piouff, juste d'y penser, ça me donne mal à la tête.

    Bonne nuit.
    • "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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Bonjour,
    Citation Envoyé par BeanzMaster Voir le message
    Par contre te dire dans quel méandre du processus graphique de la LCL alors là ? aucune idée faudrait aller au-delà du stretchdraw avec des F7 mais piouff, juste d'y penser, ça me donne mal à la tête.

    D'autant plus qu'à ce niveau-là (les agrandissements), je n'utilise ni StretchDraw ni StretchBlt, qui sortent des résultats très moches, les routines à base de Scanline sont bien plus performantes.

    Et sinon, je me suis souvenu trop tard hier soir qu'il avait déjà fallu que je bidouille pour arriver à quelque chose : il faut impérativement passer par TLazIntfImage pour ne plus avoir de soucis, voilà le code du chargement de l'image de test et les départs vers les routines 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // src, dstup, dstdn : les TBitmap de travail, créés dans FormCreate
    procedure TForm1.btnLoadClick(Sender: TObject);
    var
      {$IFDEF FPC}
      lii: TLazIntfImage;
      {$ENDIF}
    begin
      opd.Filter := 'Bitmaps|*.bmp' ;
      {$IFDEF FPC}
      opd.InitialDir := FileUtil.ProgramDirectory;
      {$ENDIF}
      if not opd.Execute then Exit;
     
      // original
      src.LoadFromFile(opd.FileName);
      img400.Picture.Bitmap.Assign(src);
     
      // à mettre après le Load du fichier, sinon traits verticaux...
      {$IFDEF FPC} 
      lii := src.CreateIntfImage;
      src.LoadFromIntfImage(lii);
      {$ENDIF}
     
      dstup.FreeImage;
      dstup.SetSize(600,450);
      dstdn.FreeImage;
      dstdn.SetSize(300,225);
     
      // agrandissement
    //  SmoothResize1(src,dstup);  //ok
      FastSmoothResize(src,dstup); //ok
    //  BMResize(src,dstup);   // R<>B
      img600.Picture.Bitmap.Assign(dstup);
     
      // réduction
    //  if Scaled_Bmp(src,dstdn, 300,225) // cata avec StretchDraw
      if StretchBmp(src,dstdn, 300,225) // mieux, beaucoup mieux avec StretchBlt !
      then begin
        img300.Picture.Bitmap.Assign(dstdn);
      end;
     
      {$IFDEF FPC}
      lii.Free;
      {$ENDIF}
    end;
    Je suis content, ça fonctionne sous Linux et sous XP avec un fichier 24bits et un fichier 32bits


    Le seul souci qui reste et celui-ci est totalement ingérable à mon niveau, c'est le changement de teinte --subtil, selon le sujet :
    Nom : compar_teintes_lena.png
Affichages : 306
Taille : 106,3 Ko
    Le bleu du panneau "Couleur opposée" est strictement le même en haut comme en bas, 0 0 127, alors que le bleu ciel du paysage (coin supérieur droit) évolue un poil :
    143 182 200 en haut, original
    144 184 200 en bas, la copie réduite, plus lumineuse
    Quant à Lena, n'en parlons pas, pas besoin de ColorPicker pour capter les différences -- dommage...
    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. #132
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

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

    des nouvelles de l'avancement du chantier : je confirme que concernant l'agrandissement d'images, les routines à base de StretchDraw ne valent rien, comparées à celles à base de Scanline, ma préférée étant celle nommée "FastSmoothResize" ("Solve 2", déjà cité), pour le "Fast" car effectivement, à résultats identiques, c'est la plus rapide de toutes celles que j'ai testées.

    Et 7 fois plus rapide que la dernière testée ce matin à base de StretchDraw et Mitchell Filter, pour un résultat que je vous laisse juger (à g. la Stretch, à dr. la FSR) :

    Nom : compar_stretch_scanline.png
Affichages : 383
Taille : 249,0 Ko

    Pour la routine StretchDraw, je suis parti de là et je l'ai adaptée comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      // Execute the stretch draw via TFPSharpInterpolation
      ////DestCanvas.Interpolation := TFPSharpInterpolation.Create;//une horreur, gardée pour mémoire
      DestCanvas.Interpolation := TMitchelInterpolation.Create; // OK
      DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage);
    Bientôt fini, tout ça !


    Un dernier point, plus général : un truc m'a bien foutu dedans, depuis le début (et peut-être depuis des années), c'est l'outil de conversion des projets Delphi vers Lazarus.
    J'explique : quand on découvre un projet Delphi à étudier, en général on a pêché un .zip qu'on a décompacté quelque part, on demande à l'outil de nous le convertir, celui-ci fait ce qu'il a à faire et entre autres rajoute au début de chaque unité la ligne {$MODE Delphi} qu'on oublie, pressé de voir ce que va donner la conversion, et on avance comme ça en étudiant le projet.

    Puis un jour on décide d'intégrer certains bouts de ce projet ex-Delphi dans un nouveau projet Lazarus, par copier/coller des morceaux de code intéressants vers des unités Lazarus qui commencent par {$mode objfpc}{$H+} et à la compil pif ! paf ! boum !
    On commence par s'arracher les cheveux ("Comment ? Cette routine qui fonctionne très bien dans ce vieux projet pourri je la récupère toute seule vers ce tout nouveau tout beau tout neuf tout vide projet et ça ne compile plus ? ? ?"), on pleure on hurle on trépigne, puis on examine tout à la loupe et vous l'avez compris, la différence vient de ce {$MODE xxx}.
    Et croyez-le ou pas (ou mieux, testez !), mais la gestion de la présence des chapeaux des pointeurs est différente selon le mode.
    Hé oui...
    Ça aussi, notez-le sur vos tablettes.

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

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

    Je reviens viteuf' sur mon dernier post :
    Citation Envoyé par Jipété Voir le message
    je confirme que concernant l'agrandissement d'images, les routines à base de StretchDraw ne valent rien, comparées à celles à base de Scanline, ma préférée étant celle nommée "FastSmoothResize" ("Solve 2", déjà cité), pour le "Fast" car effectivement, à résultats identiques, c'est la plus rapide de toutes celles que j'ai testées.
    [...]
    Bientôt fini, tout ça !
    En fait c'est tout l'inverse...

    D'où l'image du week-end, divisée en deux parties :
    • à gauche de très forts agrandissements d'un fichier de 8x6, fond rouge et carré bleu de 3x3 avec dessous 3 resize à 150 % soit 12x9, le premier avec le code du hollandais (davdata), dessous un SmoothResize trouvé je ne sais plus trop où et en bas le FastSmoothResize qui me faisait kiffer mais...
    • à droite un très fort grossissement de ma nouvelle image de test après agrandissement à 150 %, avec le bord inférieur droit de Lena en haut et le coin supérieur de l'avion en bas.


    Nom : compar_agrand_8x6+lena.jpg
Affichages : 276
Taille : 29,2 Ko

    Analyse du côté droit :
    l'image originale de l'avion est entourée par un rectangle gris très foncé (44 44 44) de 1 px, on voit le côté supérieur, et on voit bien sur ce côté droit que la couleur a changé.
    Tout le long de l'image on trouve une dernière colonne (et la taille de l'image est juste, je l'ai vérifiée) avec une couleur farfelue mais inspirée de la colonne qui est à sa gauche.
    Si j'en parle c'est parce que ça se voit bien même quand j'affiche en 1/1.

    C'est ce qui m'a incité à générer ce fichier rouge-bleu de 8x6 mais où le défaut de la dernière colonne farfelue n'apparaît pas...
    Moi y en a pas comprendre.
    Moi y en a pas pouvoir dépatouiller le bug, du coup (d'autant plus que le code est imbuvable...)

    Pour enfoncer le clou, 4 zones très agrandies montrant bien les défauts de redimensionnement :
    Nom : 4_zoom_lena.jpg
Affichages : 270
Taille : 16,1 Ko

    en haut c'est le coin supérieur droit de l'image de test agrandie à 150 %, dessous c'est la partie centrale (passage de Lena à l'avion), en bas le coin inférieur droit de l'avion et à gauche c'est la partie séparant l'avion d'une zone où la dernière ligne est blanche sur l'original : ici c'est autre chose, un gris à 170 170 170...

    J'avais trouvé chez les voisins de Delphi un tuto de Nut62 et Nono40 utilisant les 7 filtres classiques (Lanczos, etc.) mais certains rendus mettent 10 fois plus de temps à s'exécuter ! 10 fois !
    Bah, c'est peut-être le prix à payer pour avoir une bonne qualité...
    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. #134
    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
    Bonjour,

    J'avais trouvé chez les voisins de Delphi un tuto de Nut62 et Nono40 utilisant les 7 filtres classiques (Lanczos, etc.) mais certains rendus mettent 10 fois plus de temps à s'exécuter ! 10 fois !
    Bah, c'est peut-être le prix à payer pour avoir une bonne qualité...
    Salut et oui c'est le prix Le liens des voisins il est pas bon

    Petites questions les dimensions de tes images de test elle sont Paire/Impaire, car avec le smooth on perd souvent les 1ere et dernière colonne/ ligne car la somme des pixels est faite sur la base d'un carré 3x3, il faut donc traité les 1ere et dernière Ligne/Colonne légèrement différemment. Pour ne plus avoir ces "artefacts".
    • "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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Le lien des voisins il est pas bon

    C'est sûr que ça n'est pas très visible : en bas du 1er article :
    Nom : lien.png
Affichages : 248
Taille : 8,0 Ko

    Citation Envoyé par BeanzMaster Voir le message
    Petites questions les dimensions de tes images de test elle sont Paire/Impaire, car avec le smooth on perd souvent les 1re et dernière colonne/ ligne car la somme des pixels est faite sur la base d'un carré 3x3, il faut donc traiter les 1re et dernière Ligne/Colonne légèrement différemment. Pour ne plus avoir ces "artefacts".
    Si tu le dis !
    Pour le moment je fais simple, très très simple ! 400x300 -- Compliquons pas les choses

    Mais ce n'est pas à moi de mettre les mains dans le cambouis, je me contente d'essayer d'utiliser les moteurs et, en l'espèce, le resample.pas (pas celui dans le zip des voisins, celui qu'on peut trouver avec DoubleCommander [version 1.03, donc], j'en ai déjà parlé) malgré des temps d'exécution bien plus élevés donne des résultats qui me semblent corrects, pour le moment.
    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

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

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

    après avoir parcouru des chemins de traverse, me voilà de retour et aux origines : j'aimerais bien réussir à terminer ce qui est au départ de cette discussion, la copie des datas d'un bitmap dans une Array of bytes (step one, ça c'est fait ça roule), et step two, la création d'un bitmap à partir d'une Array of bytes et c'est là qu'on rigole, jaune :

    Soit une Array of bytes contenant les bonnes datas (en provenance d'une autre procédure qui les récupère dans un fichier bitmap), telles qu'on peut les voir dans la partie basse de l'image (fichier .bin, il y a 3 pixels de 3 bytes chacun [00 8B FF, 00 FF FF, FF FF 00] et au bout 3 bytes de padding à 00) :
    Nom : compar_bin_bmp.png
Affichages : 148
Taille : 26,2 Ko

    (je passe sur les initialisations diverses et variées pour ne pas alourdir et aller à l'essentiel)
    Soit une bête boucle pour récupérer les datas dans l'Array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pb := cible.RawImage.Data; // pb: pBytes, cible c'est le TBitmap de destination
    for i := 0 to LongueurDatas-1 do begin
      pb^ := Bytes[i]; // Bytes c'est les datas (Array of bytes)
      Memo1.Lines.Add(inttostr(i) +' '+inttostr(Bytes[i]) +' '+inttostr(pb^));
      bs.WriteByte(pb^); // bs c'est un TBytesStream qui va générer le .bin de contrôle
      inc(pb);
    end;
    Soit un log (la ligne Memo1... ci-dessus) parfait :
    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
     i byte pb^
     0  000 000  pixel orange -- oui, R et B sont inversés
     1  139 139
     2  255 255
     
     3  000 000  pixel jaune
     4  255 255
     5  255 255
     
     6  255 255  pixel cyan
     7  255 255
     8  000 000
     
     9  000 000  padding
    10  000 000
    11  000 000
    (c'est moi qui ai rajouté les sauts de lignes après coup pour séparer les pixels et augmenter la lisibilité)

    Comment expliquer que les datas dans le .bmp soient pourries à partir du deuxième pixel (original à gauche, copie après le damier, image agrandie pour la lisibilité) ?
    Nom : compar_bitmaps.png
Affichages : 123
Taille : 336 octets

    Si vous regardez l'image hexa du fichier .bmp, vous verrez que des pixels ont sauté (un 00 et un FF)...
    Une explication ?
    (parce que j'ai tout tenté [ça fait deux jours que je suis là-dessus], si je mettais tous mes essais avec commentaires divers et variés, vous partiriez en courant.)
    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

  17. #137
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 410
    Points : 5 801
    Points
    5 801
    Par défaut
    salut

    ta cible est bien un bitmap 24 bit et pas 32
    si c'est une 32 il te faudra pour chaque couleur ajouter un byte et zapper le padding
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Yop !
    Citation Envoyé par anapurna Voir le message
    ta cible est bien un bitmap 24 bit et pas 32
    Oui, 24 !

    J'avance étape par étape : pour le moment, source 24 cible 24.
    Mais normalement ça ne devrait pas entrer en ligne de compte puisque je recopie des bytes, des bêtes bytes. C'est d'ailleurs bien indiqué sur l'image, case 1E, qui contient 18hex soit 24dec.
    Comment se fait-il que certains disparaissent dans la zone "datas" du fichier-cible, that's the question !
    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. #139
    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
    Bonjour,

    après avoir parcouru des chemins de traverse, me voilà de retour et aux origines : j'aimerais bien réussir à terminer ce qui est au départ de cette discussion, la copie des datas d'un bitmap dans une Array of bytes (step one, ça c'est fait ça roule), et step two, la création d'un bitmap à partir d'une Array of bytes et c'est là qu'on rigole, jaune :

    Soit une Array of bytes contenant les bonnes datas (en provenance d'une autre procédure qui les récupère dans un fichier bitmap), telles qu'on peut les voir dans la partie basse de l'image (fichier .bin, il y a 3 pixels de 3 bytes chacun [00 8B FF, 00 FF FF, FF FF 00] et au bout 3 bytes de padding à 00) :
    Nom : compar_bin_bmp.png
Affichages : 148
Taille : 26,2 Ko

    Comment expliquer que les datas dans le .bmp soient pourries à partir du deuxième pixel (original à gauche, copie après le damier, image agrandie pour la lisibilité) ?
    Nom : compar_bitmaps.png
Affichages : 123
Taille : 336 octets
    Salut JP bon ce qu'on voir tout de suite c'est que le TBitmap lit 4 octets par pixel on le voie sur ta 2eme capture orange/blanc/noir (00 8B FF 00/FF FF, FF FF/00 00 00 00)
    Donc petite question comment as tu initialisé le RawImage (car attention les donnée dans le raw image sont inscrite en 32bits. Dans le RawImage.description. Il faut initialiser le BitCount à 24. (tres important pour la lecture, comme ça normalement il devrait lire que les 24bits. Surtout comme j'ai pu le voir dans l'unité "IntfGraphic" cette variable est initialiser lors du chargement de données) Ensuite c'est comme mon histoire de bitfield vas falloir que tu passes en paramètres je pense les "Red, Green, Blue, Alpha Shift et Prec" car il me semble pas que le RawImage les initialises (à vérifier). Un truc à vérifier aussi, est de charger un bmp 24 et voir si les pixels sont codés sur 24 ou 32bits dans le RawImage.Data et également analyser la description du RawImage.

    Voilà ce que donne TBItmap.RawImage.Description avec un fichier BMP 24 bits (par contre j'ai pas analysé le data)

    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
    Format=ricfRGBA
    HasPalette->False
    HasMask->False
    Depth=24
    Width=127
    Height=64
    BitOrder=riboBitsInOrder
    ByteOrder=riboLSBFirst
    LineOrder=riloTopToBottom
    LineEnd=rileDWordBoundary
    BitsPerPixel=24
    BytesPerLine->384
    RedPrec=8
    RedShift=16
    GreenPrec=8
    GreenShift=8
    BluePrec=8
    BlueShift=0
    AlphaPrec=0
    AlphaShift=0
    Vérifies avec ton bitmap de destination. A part ces paramètres dans le rawimage je vois pas d'autres choses qui pourrais faire que cela ne fonctionne pas. Le truc sur c'est que c'est là dedans que ça se passe.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Yep !, man,
    Citation Envoyé par BeanzMaster Voir le message
    Salut JP bon ce qu'on voir tout de suite c'est que le TBitmap lit 4 octets par pixel on le voie sur ta 2eme capture orange/blanc/noir (00 8B FF 00/FF FF, FF FF/00 00 00 00)
    Non ! Tu t'es mélangé les pinceaux, il est normal qu'on ait orange/blanc/noir, regarde l'affichage hexa des données (titre : xxx_bytes2bmp.bmp) où on lit bien 00 8B FF, FF FF FF, 00 00 00 + 3 bytes de padding.

    La question c'est pourquoi les pixels 2 et 3 sont mauvais alors que le 1 est bon (00 8B FF), à comparer avec le bon .bin en incruste dessous ?

    Et j'ai essayé des tas de trucs avec RawImage.Description.Init_BPP24 ou 32 et toutes les options possibles ensuite, c'est toujours un échec.

    Le seul cas correct (et encore, les lignes sont inversées et je ne sais pas comment les remettre à l'endroit pour le moment), c'est quand la source et la destination sont en pf32bit.


    Citation Envoyé par BeanzMaster Voir le message
    Voilà ce que donne TBItmap.RawImage.Description avec un fichier BMP 24 bits (par contre j'ai pas analysé le data)
    NE ME PARLE PLUS DE RawImage.Description, regarde : je me suis bricolé à la va-vite un petit outil qui ouvre un fichier .bmp et affiche les données du TBitmapInfoHeader en haut et du Bitmap.RawImage.Description en bas (à gauche le TBitmap de chargement, à droite le TImage.Picture.Bitmap d'affichage, tout en bas le xxx.PixelFormat), là on peut admirer Lena dans mon nouveau fichier de test, en mode fichier 32 bits, et j'ai mis en rouge ce que je considère mauvais et en vert ce qui est good :
    (dans la partie TBitmapInfoHeader ce qui est repéré par "(moi)" ça indique que c'est moi qui fais des calculs, basés sur les données précédentes)
    Nom : bmp_format.jpg
Affichages : 266
Taille : 129,3 Ko

    Je ne sais pas où on va avec le graphisme dans Lazarus, mais on y va et ça risque de faire mal.
    Un exemple ?
    Me suis rendu compte qu'une instruction que j'utilisais souvent, Bitmap.SetSize(aWidth, aHeight); sous son air anodin et évident, est une brave cochonnerie qui fait des copies des données ! Pourquoi ? J'ai lu dans le code // for delphi compatibility copy old image !
    Ah !
    Parce que dans mon vieux D7 SetSize n'existe pas...

    On y trouve aussi ça : // use slow copy of pixeldata till rawimage can also copy to larger destination et bien sûr l'aide toujours indigente n'en dit pas un mot...

    Bref, suis repassé à Bitmap.Width et Bitmap.Height, dommage...
    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 7 sur 8 PremièrePremière ... 345678 DernièreDernière

Discussions similaires

  1. Résultat \backslashbox très mauvais
    Par ToTo13 dans le forum Mise en forme
    Réponses: 8
    Dernier message: 09/06/2011, 23h53
  2. Image d'un bouton : mauvais rendu
    Par t.n.b.g dans le forum WinDev
    Réponses: 1
    Dernier message: 24/06/2008, 16h00
  3. Réponses: 1
    Dernier message: 13/05/2008, 11h44
  4. Pom tantot bon tantot mauvais ?
    Par spekal dans le forum Maven
    Réponses: 3
    Dernier message: 21/11/2006, 12h04
  5. Rendu images Photoshop=>Flash très mauvais
    Par jul2006 dans le forum Flash
    Réponses: 8
    Dernier message: 12/09/2006, 14h35

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