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 :

Problèmes de rendu avec TLazIntfImage


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut Problèmes de rendu avec TLazIntfImage
    Bonsoir,

    Je me suis récemment créé un fichier graphique pour faire des tests, et je suis tombé sur un comportement curieux avec TLazInftImage et le code fourni dans l'aide pour lire/écrire un fichier .xpm.

    Partant de ce fichier de tests créé avec The Gimp, j'en ai généré ensuite un .bmp ainsi qu'un .xpm, qu'on va appeler "original" et qui m'a servi de point de départ pour tester le code fourni dans l'aide (après corrections, voir mon post à ce propos).

    Le code Lazarus a bien créé un fichier copié_par_code.xpm et il a juste 21 bytes de moins que l'original.
    L'original ayant une taille de 800x600, le .bmp pèse 1 920 122 octets et le .xpm 3 036 754 octets.

    Je résume les soucis dans ce tableau, mais déjà un mot à titre de comparaison, concernant la rapidité d'ouverture de The Gimp : un fichier .jp2 (fichier de vue aérienne fourni par l'IGN, qui serait un .jpeg surcompressé) de 7 Mo s'ouvre en 5 à 7 secondes, et regardez maintenant le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Ouverture avec |   Fichier original    |  Fichier copié_par_code
    ---------------|-----------------------|--------------------------
    The Gimp       |instantanée | rendu OK |35 secondes | rendu OK
    ImageMagick    |instantanée | rendu OK |instantanée | rendu abimé
    Code Lazarus   |instantanée | rendu OK |instantanée | rendu OK
    En ce qui concerne le "rendu abimé", vous pouvez le voir au bas de ce montage où se trouve en haut l'original :
    Nom : compar_xpm.png
Affichages : 184
Taille : 290,7 Ko

    Note : le montage de ces deux images est réduit de moitié, inutile d'encombrer. Si quelqu'un veut les fichiers originaux, il suffit de demander.

    Voilà.
    Entre The Gimp qui met 35 secondes (une éternité quand on est devant l'écran...) et ImageMagick qui me massacre le bas, j'aurais tendance à penser que le fichier généré par le code Lazarus n'est peut-être pas au mieux de sa forme.
    Et à partir de là, que faire ? Que chercher ? Où ?

    J'ai fait deux tests sous XP, avec ImageMagick (version un poil plus récente que celle du tableau sous Linux) et avec XnView : l'original comme la copie s'ouvrent vite et parfaitement.

    Annexe : les codes -- le premier c'est celui de l'aide, le second c'est juste la partie "lecture" du premier.
    1 :
    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
    uses
      GraphType, IntfGraphics;
     
    procedure TForm1.Button8Click(Sender: TObject);
    var
      BmpHnd, MaskHnd: HBitmap;
      Bitmap1 : TBitmap;
      IntfImg1: TLazIntfImage;
      Reader: TLazReaderXPM;
      Writer: TLazWriterXPM;
    begin
      //1. Loading a .xpm file into a TBitmap:
      Bitmap1  := TBitmap.Create; // create a bitmap (or use an existing one)
      IntfImg1 := TLazIntfImage.Create(0,0); // create the raw image
      IntfImg1.DataDescription := GetDescriptionFromDevice(0);
      Reader := TLazReaderXPM.Create; // create the XPM reader
      IntfImg1.LoadFromFile('bmp4test255.xpm', Reader); // load the image
      IntfImg1.CreateBitmaps(BmpHnd, MaskHnd, True); // True au pif - concerne SkipMask
      Bitmap1.Handle := BmpHnd; // apply handles to the Bitmap1
      Bitmap1.MaskHandle := MaskHnd;
      Reader.Free; // clean up
      // do something with the Bitmap1
      //...
      //2. Saving a TBitmap to a .xpm file:
      IntfImg1.LoadFromBitmap(Bitmap1.Handle,Bitmap1.MaskHandle); // load the raw image from the bitmap handles
      Writer := TLazWriterXPM.Create; // create the XPM writer
      IntfImg1.SaveToFile('filename.xpm', Writer); // save image to file
      // OK, juste un poil long à écrire,
      // et très looooooooooooooong à ouvrir avec The Gimp (env. 35 sec !)
      Writer.Free; // clean up
      IntfImg1.Free;
      Bitmap1.Free;
    end;
    2 :
    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
    procedure TForm1.Button9Click(Sender: TObject);
    var
      BmpHnd, MaskHnd: HBitmap;
      Bitmap1 : TBitmap;
      IntfImg1: TLazIntfImage;
      Reader: TLazReaderXPM;
    begin
      //1. Loading a .xpm file into a TBitmap:
      Bitmap1  := TBitmap.Create; // create a bitmap (or use an existing one)
      IntfImg1 := TLazIntfImage.Create(0,0); // create the raw image
      IntfImg1.DataDescription := GetDescriptionFromDevice(0);
      Reader := TLazReaderXPM.Create; // create the XPM reader
    //  IntfImg1.LoadFromFile('filename.xpm', Reader); // load the image
    // aussi rapide avec l'original dessous qu'avec la copie dessus
      IntfImg1.LoadFromFile('bmp4test255.xpm', Reader); // load the image
      IntfImg1.CreateBitmaps(BmpHnd, MaskHnd, False); // False dans wiki - concerne SkipMask
      Bitmap1.Handle := BmpHnd; // apply handles to the Bitmap1
      Bitmap1.MaskHandle := MaskHnd;
      Reader.Free; // clean up
      // do something with the Bitmap1
      //...
      Image1.Picture.Bitmap.LoadFromIntfImage(IntfImg1);
      IntfImg1.Free;
      Bitmap1.Free;
    end;
    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. #2
    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
    Bonjour, est-ce bien ce format : https://fr.wikipedia.org/wiki/X_PixMap (ou http://www.fileformat.info/format/xpm/egff.htm) ?
    Il ne semble pas fait pour de très gros fichiers. Mais il doit faciliter la comparaison dans NotePad++, notamment pour trouver la "fuite" de 21 caractères !
    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 sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Hello
    Citation Envoyé par tourlourou Voir le message
    Euh, je n'en sais rien ! Ce n'est pas indiqué dans l'aide ni dans les exemples de code...
    J'en ai cependant ouvert un avec le bloc-notes de Linux et l'intérieur ressemble bien au premier.
    Ce qui est curieux c'est que ton premier lien écrit que ce format est plutôt prévu pour le monde *nix, or je n'ai pas eu de soucis avec XP...

    EDIT : en fait les deux liens décrivent le même type de fichier ! /EDIT

    Citation Envoyé par tourlourou Voir le message
    Il ne semble pas fait pour de très gros fichiers.

    800x600 c'est un gros fichier pour toi ? Tu verrais ce qu'on trouve sur l'IGN....

    Citation Envoyé par tourlourou Voir le message
    Mais il doit faciliter la comparaison dans NotePad++, notamment pour trouver la "fuite" de 21 caractères !
    Ce qui sous-entend qu'ensuite il va falloir mettre les mains dans le cambouis ?

    Ben j'ai jeté un œil avec mc sous Linux, voilà la première page :
    Nom : première.png
Affichages : 322
Taille : 18,5 Ko

    On voit bien que le fichier original à gauche incorpore le nom de fichier en 2e ligne, qu'il y a 1 point d'écart pour le 3e nombre de la ligne suivante (qui correspond au nombre de couleurs, d'après ton 1er lien, et la ligne "none" indiquant la transparence, ça fait bien une "couleur" de plus, à gauche, mystère résolu) et qu'enfin la 4e ligne à gauche est absente sur la copie à droite faite par le code Lazarus : différence de longueur de nom = 6, longueur de la ligne en plus = 15 en comptant CR et LF, 6 + 15 = 21 et voilà un autre mystère résolu.

    Ensuite on voit bien que les datas qui suivent sont les mêmes, ce qui change c'est les clés pour y accéder (1er caractère surement) -- le "blanc" entre " et c, de longueur variable, est identique vu avec un autre outil : 4 caractères.

    Mais au bout de 10% d'examen du fichier j'en ai eu marre de voir défiler ces colonnes, je suis allé directement à la fin du fichier (Ctrl Fin), j'ai été horrifié, j'ai fait "page précédente" et ça m'a donné ça :
    Nom : avant_dernière.png
Affichages : 277
Taille : 220,3 Ko

    Je ne sais pas quoi dire de plus... On voit bien que les codes "tombent" aux mêmes emplacements, ça doit représenter les lignes de datas, mais les datas ne sont pas du tout les mêmes.
    Y aurait-il une option liée à TLazIntfImage ? Pas la moindre idée...

    ---
    J'aime bien les explications qu'on trouve en bas de la page de ton 1er lien (lu après rédaction de ce qui précède), ce format est enfantin et la limitation dont tu parles ne semble liée qu'au fait qu'il n'y a pas de compression, comme un bmp, quoi, mais à notre époque de DD de bientôt 10 To, qui s'en soucie ?
    Le problème n'est pas là.

    EDIT ENCORE :
    sur le second lien on trouve un fichier de test, qui s'ouvre parfaitement avec The Gimp, avec ImageMagick, mais m'envoie
    "c" expected in xpm stream at line 9 column 17
    avec le code de l'aide Lazarus... /EDIT
    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. #4
    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
    Les codes sont différents mais aux mêmes endroits : tant mieux, c'est du BitMap, même si les pixels sont différemment codés. Il faudrait une moulinette pour regarder s'il y a une différence entre couleurs de pixels.

    Grosse taille 600*800 : oui, il est dit que c'est pour des icônes !
    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
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Grosse taille 600*800 : oui, il est dit que c'est pour des icônes !
    Il est dit dans le 1er lien, mais dans le second :
    Maximum Image Size NA
    D'ailleurs j'ai ouvert un de mes .jp2 (7 Mo) avec The Gimp, et je lui ai demande de l'exporter en .xpm : ça a pris une poignée de secondes et ça a généré un fichier de 70 Mo, qu'ImageMagick a parfaitement bien ouvert.

    En fait, quand on regarde le détail de la structure d'un fichier .xpm en combinant les infos de tes deux liens, j'ai presque honte d'avoir ouvert cette discussion puisqu'il s'agit d'un bête de chez bête fichier texte !
    Du coup, la conclusion s'impose : Lazarus ou FreePascal se prend les pieds dans le tapis...

    Exemple avec l'exemple du 1er lien (je me suis contenté de copier/coller le code dans mon bloc-notes puis l'enregistrer avec le nom tel qu'on peut le lire dans le fichier, nom qui saute à l'enregistrement par Lazarus...)
    Nom : compar_exemple.png
Affichages : 215
Taille : 32,7 Ko

    Je précise que ce fichier n'a pas de problèmes d'affichage.

    (et le trait au tout début de chaque fichier c'est le point d'insertion, qui a été incorporé par l'outil de copie d'écran)
    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. #6
    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
    Donc erreur dans TLazWriterXPM ? Mais Reader OK ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Donc erreur dans TLazWriterXPM ?
    Probablement.
    En tout cas, oui, erreur en ce qui concerne le nom du fichier, qui n'est pas inclus dans le fichier comme la norme, d'après tes liens, le prévoit 1.

    Citation Envoyé par tourlourou Voir le message
    Mais Reader OK ?
    Bah nan, comme je le disais ce matin,
    Nom : post_10h45.png
Affichages : 228
Taille : 8,9 Ko
    Juste la partie "Reader".
    Et, tiens, je mets les 12 premières lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* XPM */
    static char * plaid[] = {
    /* plaid pixmap 
     * width height ncolors chars_per_pixel */
    "22 22 5 2",
    /* colors */
    ".  c red       m white  s light_color ",
    "Y  c green     m black  s lines_in_mix ",
    "+  c yellow    m white  s lines_in_dark ",
    "x              m black  s dark_color ",
    "   c none               s mask ",
    /* pixels */
    Pi cette histoire de bas d'image tout brouillé, je vais essayer de creuser un peu, laisse-moi deux-trois jours...

    1 : encore que, quand on le télécharge, il s'appelle "xpm.xpm" alors que dedans il s'appelle "plaid", ce qui cependant n'empêche aucun logiciel de l'ouvrir, sauf le code de l'aide.
    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. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Halte au feu !

    Hier soir, voulant en avoir le cœur net, j'ai fait générer une image un peu plus petite (768x512) sans zones de textes ni couleurs unies, un magnifique dégradé du rouge au rouge et du blanc au noir et le coupable n'est pas TLazIntfImage mais... ImageMagick !
    Sous Linux, parce que sous Windows XP une version plus vieille d'IM ouvre parfaitement le fichier.

    En haut le reader de TLazIntfImage, en bas ImageMagick :
    Nom : compar_aec.png
Affichages : 209
Taille : 38,0 Ko (montage réduit de moitié)

    Ce qui m'a induit en erreur, c'est le fait qu'IM ouvre bien le fichier original (celui avec Lena), et puisque ça se passait mal avec les copies j'en ai déduit que c'était les copies qui étaient défectueuses ; elles doivent l'être un peu, quelque part, quand même, mais rendons à César ce qu'il a perdu : je rappelle que TLazIntfImage n'est pas capable d'ouvrir un fichier de 1456 bytes, celui trouvé dans le second lien de tourlourou
    Ce fichier est peut-être mal formé, en attendant, tous mes autres logiciels, sous Linux comme sous XP, l'ouvrent.

    Quant à The Gimp, il lui a fallu pas moins de 14 minutes 30 pour réouvrir ce fichier de dégradés qu'il avait généré en une poignée de secondes !
    14 minutes 30 sans rien voir d'autre que l'indicateur système de l'activité cpu, à bloc sur un de mes deux cœurs.
    À sa décharge, au bout de ce temps dément, le fichier qu'il présente est correct.

    Je commence à en avoir sérieusement marre de cette informatique de moins en moins fiable...
    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. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    desole pour la reponse tardive

    /* XPM */
    static char * plaid[] = {
    /* plaid pixmap
    * width height ncolors chars_per_pixel */
    "22 22 5 2",
    /* colors */
    ". c red m white s light_color ",
    "Y c green m black s lines_in_mix ",
    "+ c yellow m white s lines_in_dark ",
    "x m black s dark_color ", // l'erreur est là il manque le C ou le S selon la norme
    " c none s mask ",
    /* pixels */
    il faut croire que certain logiciel sont plus permissif que d'autre
    l'informatique n'est pas magique mais si tu ne respecte pas les norme mises en place tu vas forcement te retrouver avec des soucis
    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

Discussions similaires

  1. problème de rendu unity sur mobile avec remote4
    Par honosstoa dans le forum Unity
    Réponses: 3
    Dernier message: 25/10/2015, 15h47
  2. Problème de rendu d'un Model 3DS avec V.B.O
    Par ksta.k dans le forum C++
    Réponses: 6
    Dernier message: 22/10/2015, 23h57
  3. Réponses: 3
    Dernier message: 13/08/2010, 07h10
  4. problème de rendu avec DrawString
    Par megachameau dans le forum C#
    Réponses: 3
    Dernier message: 22/07/2010, 19h05
  5. Problème de rendu avec des listes
    Par Erwane dans le forum Scheme
    Réponses: 19
    Dernier message: 03/03/2008, 21h27

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