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 :

TBitMap et Scanline [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bravo Jipété !

    Sans vouloir te commander, si tu voulais bien poster le projet complet, je serais preneur.
    Merci merci, mais merci aussi à vous tous

    Laisse-moi quelques heures, histoire de faire le ménage dans tous les commentaires et autres ShowMessage dont mon brouillon est truffé

    Citation Envoyé par Roland Chastain Voir le message
    Est-ce que ça ne mériterait pas même d'être ajouté dans nos sources (éventuellement en incluant la version BGRABitmap) ?
    Euh, honnêtement je ne sais pas, ce n'est qu'une petite bricole pour afficher des cercles

    Bon, c'est vrai aussi que quelque part on a implémenté ce ScanLine manquant au TBitmap, on est trop forts (surtout Paul ) !

    On en reparle (j'attends les commentaires d'Yves et Paul, et je suis très perturbé par cette inversion rouge/bleu )...
    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. #22
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Jipété Voir le message
    (...) je suis très perturbé par cette inversion rouge/bleu )...
    Citation Envoyé par Jipété Voir le message
    Fonctionne en RESULT.PixelFormat := pf24bit; et RESULT.PixelFormat := pf32bit;

    [ EDIT ] avec un curieux effet de bord : l'image ci-dessus vient suite à pf24bit. Si je mets pf32bit, le rouge et le bleu sont inversés [ /EDIT ]
    Bon, ben il semblerait qu'en virant cette ligne RESULT.PixelFormat := pfXXbit;, ça ne fasse ni chaud ni froid au reste du code , et à l'objet Bitmap qui semble être créé par défaut avec pf24bit.

    Donc ligne virée --> problème disparu !
    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. #23
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bon, ben il semblerait qu'en virant cette ligne RESULT.PixelFormat := pfXXbit;, ça ne fasse ni chaud ni froid au reste du code , et à l'objet Bitmap qui semble être créé par défaut avec pf24bit.

    Donc ligne virée --> problème disparu !
    ce qui voudrait dire qu'il est toujours en 32bits, puisque tu utilises un pRGBQuadArray qui est en 32 bits évidemment (non c'est pas évident ?)

    alors petit rappel sur les bitmaps

    8bit: un pixel = 1 octet = indice de la couleur dans la palette de 256 couleurs
    16bits : un word = couleur RGB (Rouge Vert Bleu) sur 5,6 et 5 bits, 65536 couleurs maxi
    24bits: 3 octets (RGBTriple) = couleur RGB 8bits chaque
    32bits: 4 octets (RGBQuad) = couleur RGBA 8 bits chaque, A est le canal alpha utilisé habituellement pour la transparence.

    ta variable "row" doit donc être d'un type compatible avec le format du Bitmap...voir dans la doc Lazarus pourquoi tu as toujours du 32 bits, car ce n'est pas le cas sous Delphi ou le format de ScanLine est directement influencé par le PixelFormat du Bitmap
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    C'est pour les problèmes de PixelFormat que j'imposais le type dans le RawImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      with RawImage // intermédiaire d'initialisation
      do begin
        Init;
        // pour compatibilité, création forcée BitMap pf24Bit dans un format BGRA 32 bits
        Description.Init_BPP32_B8G8R8_BIO_TTB(FWidth, FHeight);
        CreateData(True);
      end;
    Le RawImage servant à initialiser un TLazIntfImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ScanlineImage:=TLazIntfImage.Create(0,0);
      with ScanlineImage
      do begin
        SetRawImage(RawImage);
        ScanlineSize:=DataDescription.BytesPerLine;
      end;
    Le TLazIntfImage est indépendant de la plateforme et propose GetDataLineStart(aRow: integer) qui est l'équivalent du ScanLine.

    Pour BGRA, je reprends juste une définition de type qui n'est pas dans mes uses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses
      Classes, SysUtils, Graphics, Math, IntfGraphics, LclIntf, GraphType, LCLType, FPImage;
     
    type
      // pixel au format RGB (le canal Alpha est ajouté pour compatibilité)
      TBGRAPixel=packed record
      {$IFDEF FPC_LITTLE_ENDIAN}
        Blue, Green, Red, Alpha: Byte; // Delphi, Intel, par exemple
      {$ELSE}
        Alpha, Red, Green, Blue: Byte; // PowerPC
      {$ENDIF}
      end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ce qui voudrait dire qu'il est toujours en 32bits, puisque tu utilises un pRGBQuadArray qui est en 32 bits évidemment (non c'est pas évident ?)
    Ben vi, c'est évident, sauf que mon ShowMessage est formel : pf24bit.

    Pourquoi crois-tu que j'ai écrit que ça me perturbait ce truc ?

    Citation Envoyé par Paul TOTH Voir le message
    (...) voir dans la doc Lazarus pourquoi tu as toujours du 32 bits, car ce n'est pas le cas sous Delphi ou le format de ScanLine est directement influencé par le PixelFormat du Bitmap
    Nooooon, pas la doc Lazarus, c'est une vraie misère et une plaie sans nom, ce truc

    Ce que je trouve dans custombitmap.inc, c'est le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TCustomBitmap.Create;
    begin
      inherited Create;
      FPixelFormat := pfDevice;
    end;
    Mais mon test avec ShowMessage incluait tous les pfXXX possibles et il m'a toujours sorti pf24bit.

    Citation Envoyé par tourlourou Voir le message
    C'est pour ça que je forçais le type dans le RawImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      with RawImage // intermédiaire d'initialisation
      do begin
        Init;
        // pour compatibilité, création forcée BitMap pf24Bit dans un format BGRA 32 bits
        Description.Init_BPP32_B8G8R8_BIO_TTB(FWidth, FHeight);
        CreateData(True);
      end;
    J'ai essayé, Yves, j'ai essayé plein de variantes de cet Init_... mais ça n'a rien changé

    À la demande générale de Roland, le code de l'unité, et une image finale (pour ceux qui voudront tester : un TImage de 480x480, 2 boutons {fonction 'Print' non implémentée [spécifique à Windows]}, un TComboBox, un TLabel et 3 TCheckBox).
    Nom : rgb-cmy.png
Affichages : 126
Taille : 31,8 Ko

    ColorMix.pas

    Enjoy, mais méfiance, voici ce qu'on peut lire dans l'aide de TRawImage :
    This object currently is subject to refactoring, don't use it in application code.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

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

    je reviens deux minutes sur cette chose perturbante

    J'ai créé vite fait un prog de test complètement en dehors du projet de base, les résultats sont en commentaires, tout est là :
    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
    function Createbmp(i: integer): TBitmap;
    var
      bmp: TBitmap;
     
      procedure ShowPF;
      begin
        case bmp.PixelFormat of
          bmp.PixelFormat.pf1bit : ShowMessage('1');
          bmp.PixelFormat.pf4bit : ShowMessage('4');
          bmp.PixelFormat.pf8bit : ShowMessage('8');
          bmp.PixelFormat.pf15bit : ShowMessage('15');
          bmp.PixelFormat.pf16bit : ShowMessage('16');
          bmp.PixelFormat.pf24bit : ShowMessage('24');
          bmp.PixelFormat.pf32bit : ShowMessage('32');
          bmp.PixelFormat.pfCustom : ShowMessage('cust');
          bmp.PixelFormat.pfDevice : ShowMessage('dev');
        end;
        ShowMessage(IntToStr( bmp.RawImage.Description.Depth) +'---'+
                    IntToStr( bmp.RawImage.Description.BitsPerPixel) +'---'+
                    IntToStr( bmp.RawImage.Description.BytesPerLine)
                    );
      end;
    begin
      bmp := TBitmap.Create;
      bmp.SetSize(i, i); // 480
      ShowPF; // --> *24* & 24---32---1920
     
      bmp.PixelFormat := pf16bit;
      ShowPF; // --> *16* & 24---32---1920
     
      bmp.Free;
    end;
    C'est ce "1920" (= 480 x 4) et donc ce "4" qui m'a mis sur la piste du TRGBQuad.
    Mais j'avoue que tout cela est bien mystérieux, surtout quand PixelFormat est à 16 et qu'on a quand même 32 BitsPerPixel...

    Bonne journée, et bon réveillon !
    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

  7. #27
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour Jipété !

    Je viens d'essayer ton programme. Je n'obtiens pas le résultat que tu as mis en commentaire. Voici ce que j'obtiens :

    24, 24---24---1440
    16, 24---24---1440
    Je n'ai pas l'explication.

    Bon réveillon à toi !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #28
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    dans TCustomBitmap.RawimageNeeded, tu as ce code qui à mon avis fait passer le format du RawImage 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
     
    // setup ImagePtr, fill description if not set
      if ImagePtr^.Description.Format = ricfNone
      then begin
        // use query to get a default description without alpha, since alpha drawing
        // is not yet supported (unless asked for)
        // use var and not pixelformat property since it requires a rawimagedescription (which we are creating)
        case FPixelFormat of
          pf1bit: Flags := [riqfMono, riqfMask];
          pf4bit,
          pf8bit: Flags := [riqfRGB, riqfMask, riqfPalette];
          pf32bit: Flags := [riqfRGB, riqfMask, riqfAlpha];
        else
          Flags := [riqfRGB, riqfMask];
        end;
        ImagePtr^.Description := QueryDescription(Flags, ImagePtr^.Description.Width, ImagePtr^.Description.Height);
        // atleast for now let pixelformat reflect the created description
        FPixelFormatNeedsUpdate := True;
      end;
    et dans TWidgetSet.RawImage_QueryDescription

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      else if riqfRGB in AFlags
      then begin
        ADesc.Format := ricfRGBA;
    ce qui me fait dire que RawImage n'est pas comme sous Delphi un accès direct aux pixels de l'image, c'est un tableau de pixels construit dynamiquement à partir de l'image...mais c'est probablement lié au multiplateforme qui ne doit pas permettre l'accès aux pixels partout.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut tout le monde,

    tous mes vœux, plein de bonnes choses et de codes sans bugs

    Citation Envoyé par Roland Chastain Voir le message
    Bonjour Jipété !

    Je viens d'essayer ton programme. Je n'obtiens pas le résultat que tu as mis en commentaire. Voici ce que j'obtiens :

    24, 24---24---1440
    16, 24---24---1440
    Je n'ai pas l'explication.

    Bon réveillon à toi !
    1440 = 480 * 3. Tu devrais essayer de remettre row: pRGBTripleArray; juste pour voir si ça change quelque chose...

    Et sinon, OS ? 32/64 ?
    Si Linux, environnement de bureau, window manager, tout ce genre de choses...

    Perso j'ai aussi testé dans une VM qui tourne sous Debian Wheezy 7.2 / 32 et Xfce, et ça roulait. Mais cette VM est hébergée sur la machine où j'ai dépatouillé tout ça, peut-être que ça aide.

    Ou pas : mon environnement "host" est sous lxde et je n'ai pas de transparence, par exemple ; et pourtant la VM sous Xfce l'a, ainsi que mes VM's Windows, c'est un peu mystérieux pour moi que des VM's aient plus de pouvoir (si je puis dire) que la machine qui les héberge
    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. #30
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Tu devrais essayer de remettre row: pRGBTripleArray; juste pour voir si ça change quelque chose...
    Voilà, j'ai testé l'unité que tu as postée.

    Je confirme que chez moi (Windows 8), c'est bien la version TRGBTriple qui donne le bon résultat.

    A noter, j'ai dû remplacer rgbRed par rgbtRed, etc.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Yep !
    Citation Envoyé par Roland Chastain Voir le message
    Voilà, j'ai testé l'unité que tu as postée.
    Ouf ! Je croyais que tu nous avais zappés,

    Citation Envoyé par Roland Chastain Voir le message
    Je confirme que chez moi (Windows 8), c'est bien la version TRGBTriple qui donne le bon résultat.
    Impec !
    Plus qu'à faire une détection de plate-forme au lancement, et border la déclaration de row (et son utilisation, voir § suivant) par des {$IFDEF type_os} et hop !
    Je laisse ça comme un exercice pour un lecteur intéressé (comme on dit, des fois, dans des sources)

    Citation Envoyé par Roland Chastain Voir le message
    A noter, j'ai dû remplacer rgbRed par rgbtRed, etc.
    Vi, me semble bien l'avoir vécu et avoir oublié de le signaler
    Merci à toi.

    Bon wik,
    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 2 sur 2 PremièrePremière 12

Discussions similaires

  1. probleme fct TBitmap::ScanLine
    Par comrad85 dans le forum C++Builder
    Réponses: 11
    Dernier message: 19/01/2008, 23h41
  2. pb couleur avec Scanline
    Par bobymaw dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/05/2004, 22h25
  3. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39
  4. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 15h11
  5. tbitmap.free dans une function
    Par portu dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2003, 22h08

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