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 :

Portabilité code BitMap [Lazarus]


Sujet :

Lazarus Pascal

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut Portabilité code BitMap
    Bonsoir,

    J'obtiens une différence à l'exécution du même code source sous Lazarus Win7 32 bits et CodeTyphon (Lazarus 64) Ubuntu.

    J'obtiens sous Win7 l'affichage de l'image couleur attendue, mais sous Ubuntu une image reconnaissable, grise, avec des rayures colorées verticales...

    Pour éliminer certaines causes, j'ai sauvé dans un fichier le tableau RGB (PBA dans le code ci-dessous) que je passe en ScanLine à un TLazIntfImage, copié vers un BitMap qui est assigné à un TImage pour l'affichage (ouf !)

    Et le fichier correct sous Win7 donne la même image grise sous Ubuntu que celle obtenue par le traitement normal !

    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
      tms:=TMemoryStream.Create;
      tms.Write(PBA[0], FWidth*FHeight*3); // PBA = TByteArray : tableau de RGB style BitMap
      tms.SaveToFile('testbmp.bin');
      tms.Clear;
      tms.LoadFromFile('testbmp.bin');
      FillChar(PBA[0], FWidth*FHeight*3, 0);
      tms.Read(PBA[0], FWidth*FHeight*3);
      tms.Free;
      // passage au Bitmap de travail
      with ScanlineImage // TLazIntfImage
      do begin
        BeginUpdate;
          for yy:=0 to FHeight-1 // PRT = TRGBTripleArray absolute PBA
          do Move( PRT[yy*FWidth], TPRT(GetDataLineStart(yy))[0], ScanlineSize );
        EndUpdate;
      end;
      // puis à celui interne à passer
      FBitmap.LoadFromIntfImage(ScanlineImage);   
      // puis Image1.Picture.Assign(FBitmap);
    Je ne sais plus où donner de la tête !

    Merci pour vos pistes.
    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 !

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Je viens de faire le test inverse : le fichier tableau généré sous Ubuntu est bien affiché comme attendu sous Win7.

    Il y a donc une différence de comportement entre les 2 versions de Lazarus ou les 2 environnements dans le passage au TLazIntfImage ou au BitMap.

    Création du TLazIntfImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ScanlineImage:=TLazIntfImage.Create(0, 0, [riqfRGB]);
      with ScanlineImage
      do begin
        BeginUpdate;
          SetSize(FWidth, FHeight);
          CreateData;
        EndUpdate; 
      end;
    D'un côté, je suis content que mon code qui précède cette étape soit portable
    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 !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    comment est déclaré PRT ? n'y a-t-il pas une différence 32/64 bits ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Je ne crois pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type
      // pixel RGB ou YUV
      TYUV3=packed record
      case Boolean of
        True : (Blue, Green, Red: Byte); // = TRGBTriple
        False: (Y, U, V: Byte);
      end;
     
      // ligne de pixels
      TPRT=array of TYUV3;    
     
    var
      PBA: PByteArray;
      PRT: TPRT absolute PBA; // pour traiter le buffer par octet, RGBTriple, ou YUV
    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. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Voici la différence de rendu, qui ne laisse de me plonger dans la perplexité...
    Images attachées Images attachées  
    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 !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    attend "PRT = TRGBTripleArray absolute PBA" tu fais un absolute d'un record vers un pointeur ?

    PS: pourquoi utiliser un MemoryStream pour enregistrer sur disque ?!
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Merci pour tes remarques.

    TMemoryStream : je suis d'accord ! Je n'utilise presque que ça, mais partiellement en raison d'un dérivé que j'ai codé et permettant de le faire pointer sur une portion seulement de la mémoire d'un autre => découpage facile, en lecture seule, sans recopie de données, pour en fournir une section à une méthode (LoadFromStream d'une image dans un flux, par exemple).

    Pour l'absolute, il y a effectivement une différence de type, même si le compilo doit déréférencer comme si c'était la même chose. Et puis, même si ce n'est pas beau (mea culpa) on retrouve l'image, à défaut de ses couleurs. Ça ne doit donc pas interférer (à tester, cela dit).
    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 !

  8. #8
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Je remarque que tu n'as pas péciser le format des pixels. Le problème pourrait venir de là

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Merci pour tes remarques.

    TMemoryStream : je suis d'accord ! Je n'utilise presque que ça, mais partiellement en raison d'un dérivé que j'ai codé et permettant de le faire pointer sur une portion seulement de la mémoire d'un autre => découpage facile, en lecture seule, sans recopie de données, pour en fournir une section à une méthode (LoadFromStream d'une image dans un flux, par exemple).

    Pour l'absolute, il y a effectivement une différence de type, même si le compilo doit déréférencer comme si c'était la même chose. Et puis, même si ce n'est pas beau (mea culpa) on retrouve l'image, à défaut de ses couleurs. Ça ne doit donc pas interférer (à tester, cela dit).
    non mais absolute c'est très bien, faut juste savoir s'en servir

    tu as un record d'un côté et un pointeur de l'autre !

    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
     
    type
      // pixel RGB ou YUV
      TYUV3=packed record
      case Boolean of
        True : (Blue, Green, Red: Byte); // = TRGBTriple
        False: (Y, U, V: Byte);
      end;
     
      // ligne de pixels
      TPRT=array of TYUV3;    
     
    var
      PBA: PByteArray;
      PRT: ^TPRT absolute PBA; // pour traiter le buffer par octet, RGBTriple, ou YUV
    il manque un "^" devant TPRT...PByteArray c'est un type à toi ou un pointeur vers un tableau dynamique - et donc un pointeur vers un pointeur ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    @Gouyon : je pense que le code suivant suffit à définir le format des pixels
    ScanlineImage:=TLazIntfImage.Create(0, 0, [riqfRGB]);
    Mais un peu plus de documentation ne m'aurait pas fait de mal... (je n'ai pê pas su la trouver)

    @Paul : une variable de type PByteArray est un pointeur sur un tableau fixe de 32k éléments et une variable de type TPRT pointe sur un tableau ouvert : c'est moche, mais finalement ça permet de retomber sur ses pattes au fonctionnement ! Il me faudra corriger les déclarations pour être plus rigoureux, car ça m'avait échappé (d'autant plus facilement que ça fonctionne).
    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 !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    @Gouyon : je pense que le code suivant suffit à définir le format des pixels
    Mais un peu plus de documentation ne m'aurait pas fait de mal... (je n'ai pê pas su la trouver)

    @Paul : une variable de type PByteArray est un pointeur sur un tableau fixe de 32k éléments et une variable de type TPRT pointe sur un tableau ouvert : c'est moche, mais finalement ça permet de retomber sur ses pattes au fonctionnement ! Il me faudra corriger les déclarations pour être plus rigoureux, car ça m'avait échappé (d'autant plus facilement que ça fonctionne).
    ah oui, j'ai lu trop vite, c'est un tableau ouvert...donc un pointeur. En fait ça ne me serait jamais pas venu à l'idée de le faire comme ça

    en fait c'est super bizarre cette classe TLazIntfImage
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Voici la différence de rendu, qui ne laisse de me plonger dans la perplexité...
    L'analyse des deux images montre qu'il y a un problème flagrant de nombre d'octets par pixel (3 ou 4).

    L'image de gauche est celle de droite compressé sur un espace des 3/4 de celle de droite. La quart restant est rempli de je ne sais quoi.

    Maintenant, quel le problème ???

    Cordialement.

    Pierre

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    Je cerne mieux le problème, sans le comprendre complètement...

    Sous Ubuntu / Lazarus 64, le LazIntImage est bien créé avec un format pf24Bit mais stocké en interne sous forme BGRA sans canal alpha.


    RGBARGBARGBARGBARGBARGBARGBARGBARGBARGBARGBARGBA : ce qu'il attend
    RGBRGBRGBRGBRGBRGBRGBRGBRGBRG : ce que je lui colle
    RGB GBR BRG RGB GBR BRG RGB ................ : ce qu'il transmet (?) au Bitmap
    Tiens donc, ça fait du gris ?

    Bref, problème en passe d'être résolu, sauf que j'obtiens parfois une "opération de pointeur incorrecte" lors d'un ScanLine (qui n'est pas le dernier), avec certains clichés : il reste à déverminer !
    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 !

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

Discussions similaires

  1. Portabilité du code C++ de Windows -> Linux ?
    Par eraser570 dans le forum Linux
    Réponses: 29
    Dernier message: 04/09/2009, 17h02
  2. Portabilité de code Delphi
    Par ludovic tambour dans le forum EDI
    Réponses: 2
    Dernier message: 20/08/2005, 16h14
  3. [Update : Code solution][Bitmap] Se passer des ressources
    Par Clorish dans le forum Composants VCL
    Réponses: 13
    Dernier message: 13/07/2005, 12h16
  4. Comprendre un code asm relatif aux bitmaps
    Par sorry60 dans le forum Assembleur
    Réponses: 8
    Dernier message: 20/04/2005, 21h31
  5. Réponses: 13
    Dernier message: 13/03/2005, 20h56

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