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 :

Ouvrir des fichiers image au format TIF


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Ouvrir des fichiers image au format TIF
    Bonsoir à toutes et à tous,

    Apparemment, à la lecture de l'unité Graphics, le format TIF est soutenu. Cependant, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image.Picture.LoadFromFile('MonFichier.tif');
    ça plante.

    Est-il réellement possible d'ouvrir des fichiers à ce format et si oui, comment faites vous ?

    Cordialement.

    Pierre

  2. #2
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonsoir

    Pour moi, ça passe, sauf pour les formats de compression "exotiques".

    Tif sans compression ou avec compression LZW ==> correctement affichés.
    Tif avec compression zip ou jpeg ==> Erreur lors du chargement.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    ... Pour moi, ça passe, sauf pour les formats de compression "exotiques".

    Tif sans compression ou avec compression LZW ==> correctement affichés ...
    Sans compression ou avec compression LZW (images crées par Xnview) ça plante chez moi (Windows ou Ubuntu, Lazarus 0.9.30) avec un message du genre :

    image attendue à 3 octets par pixel mais 4 trouvés.

    Merci de votre aide.

    Pierre

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Précision sur les fichiers .TIF que j'ai réalisés :

    Je les ai créés à partir de Xnview :

    Si l'original était un png ou un jpg, le fichier tif créé avait en 32 bit par pixel

    Si l'original était en bmp, le fichier créé avait 24 bit par pixel --> ce fichier est lu correctement par Lazarus !!!

    Merci de votre aide.

    Pierre

  5. #5
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par ChPr Voir le message
    image attendue à 3 octets par pixel mais 4 trouvés.
    4 octets par pixel => profondeur de couleur de 32 bits.
    3 octets par pixel => profondeur de couleur de 24 bits.

    Apparemment les images d'une profondeur de couleur de 32 bits ne sont pas supportées. La solution est de réduire le nombre de couleurs de tes images à 24 bits. Si cela te pose un souci, expose le problème sur le Bug Tracker de Lazarus. (Comme ce n'est pas un bug, mettre dans le champ severity: new feature)
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    ... Apparemment les images d'une profondeur de couleur de 32 bits ne sont pas supportées. La solution est de réduire le nombre de couleurs de tes images à 24 bits. Si cela te pose un souci, expose le problème sur le Bug Tracker de Lazarus. (Comme ce n'est pas un bug, mettre dans le champ severity: new feature)
    Je l'ai fait, mais je n'en espère pas grand chose vu que ma dernière intervention au sujet du presse-papier n'a même pas été pris en compte.

    Par ailleurs, n'y a-t-il pas moyen, à l'aide de la classe TTiffImage de voir les paramètres d'un fichier Tif ? Je ne vois pas trop comment faire.

    Merci de votre aide.

    Pierre

  7. #7
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je l'ai fait, mais je n'en espère pas grand chose vu que ma dernière intervention au sujet du presse-papier n'a même pas été pris en compte.
    La patience doit être de rigueur... J'ai 4 rapports en cours et le dernier événement date de début juillet.

    [Edit]
    Apparemment, cela bouge car on te demande déjà un exemple d'image. Et ce, moins de 2 heures après avoir ouvert la discussion.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    ... Apparemment, cela bouge car on te demande déjà un exemple d'image. Et ce, moins de 2 heures après avoir ouvert la discussion.
    Ca fait plaisir. J'ai envoyé une image 32 bits par pixel réalisée avec Xnview.


    Cordialement.

    Pierre

  9. #9
    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,

    2 ans et demi plus tard, où en est-on ?

    Car chez moi le canard est toujours vivant...

    Test 1 : avec The Gimp je crée une bête image 100x100 en 72 dpi, que j'exporte en tiff, de 5 manières différentes au niveau du choix de la compression :
    • sans compression,
    • lzw,
    • pack bits,
    • déflation,
    • jpeg


    et bien sûr l'ouverture du fichier compressé en jpeg dans un petit prog de test le fait planter !
    Et oui, ce genre de chose existe : une amie m'a passé des .TIFF générés par une photocopieuse d'entreprise (qui fait scanner) et qui sont arrivés comme ça !
    (il y a probablement une option pour changer ça, mais elle ne savait pas où...)

    Test 2 : là, c'est plus grave, et complètement aléatoire et hasardeux.
    Pour des tests, j'avais besoin de quelques grosses images tiff ; je suis parti d'une douzaine de .jpeg (qui pèsent environ 4 Mo) choisis totalement au hasard dans ma collection, que j'ai ouvert avec The Gimp et "Fichier / Exporter / Format Tiff / Compression LZW".
    Hé bien sur les 12 tiff générés (tailles de 5 à 20 Mo environ), il y en a un qui plante à l'ouverture dans le prog de test !
    Si je l'exporte sans compression il s'ouvre bien.

    Comme mon choix fut totalement dicté par le hasard, il aurait très bien pu n'y en avoir aucun qui plante (bug caché, latent...), ou plusieurs : j'en conclus que la gestion d'image sous Laz n'est hélas pas fiable à 100 % (à moins que ça ait changé avec cette 1.2, mais je n'y crois pas).

    Bien sûr, il va sans dire que les fichiers qui génèrent les erreurs sous Laz s'ouvrent très bien avec la visionneuse d'images de Linux, avec The Gimp, avec LibreOffice (pour importation) et avec les outils Windows dans une machine virtuelle.
    Laz 1.0.10 / FPC 2.6.2, le tout en 32 bits sous Debian Wheezy.

    Idées, commentaires, suggestions de contournement sont les bienvenus, et bon dimanche,
    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. #10
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    Salut Jipété,

    Regarde ici

    Amicalement, nullosse

  11. #11
    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 !

    Salut, Nullosse,
    Citation Envoyé par Nullosse Voir le message
    Salut Jipété,

    Regarde ici

    Amicalement, nullosse
    merci de ton lien, où je note :
    Here is an incomplete list of open / not yet implemented features of the reader:

    Compression: jpeg
    Et quand on regarde le suivi du bug posté par ChPr et qu'on constate que rien n'a bougé depuis 2 ans et demi, ben on se dit que c'est pas demain la veille que ça va être corrigé...

    Pas trop dramatique (même si ça fait désordre) car "catchable" avec Try / Except.

    Je suis beaucoup plus ennuyé par le second point que j'ai soulevé, je vais bientôt m'y pencher (ai passé la journée sur le premier point, sans solution... )

    Merci de ton soutien (je commençais à me sentir tout seul, là , et c'est un peu la misère tout ça...)
    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. #12
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    tu peux essayer d'utiliser la vampyre imaging library ici

  13. #13
    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
    Salut !
    Citation Envoyé par Nullosse Voir le message
    tu peux essayer d'utiliser la vampyre imaging library ici
    Oh, tu es trop gentil avec moi, je ne sais comment te remercier et je suis également très déçu de refuser tes propositions, mais dis-toi bien que cette lib je l'ai testée hier dans l'après-midi, et ce qu'on peut lire sur le web (support TIFF) est incomplet : support TIFF for Windows only.
    J'ai viré cette lib' en fin de journée...

    Je crains hélas qu'il n'y ait pas de solution, d'autant plus que les fichiers qui partent en erreur dans Lazarus n'ont aucun souci quand je les teste avec les outils de la suite TiffLib...

    Bonne journée quand même,

    [EDIT] Tentative d'approche en passant par l'autre côté (Free Pascal) : j'aurai besoin d'un ch'tit coup de main , merci par avance [/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

  14. #14
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    Salut,

    un dernier espoir sous linux : freeimage :
    FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by today's multimedia applications. FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit or 64-bit versions of Windows, and cross-platform (works both with Linux and Mac OS X).
    pour accéder à cette bibliothèque sous linux il y a un "Wrapper" qui était initialement prévu pour delphi mais qui semble maintenant compatible lazarus :
    // 2011-03-04 JMB Modifications to compile on Free Pascal / Lazarus 64 bits (tested on Windows 7 and linux OpenSuse) :
    // - in 64 bits, the names of the exported function are different :
    // e.g. : _FreeImage_AcquireMemory@12 in 32 bits and FreeImage_AcquireMemory in 64 bits
    // so the define WIN32 will allow to distinguish 32 and 64 bits in the calls to the freeimage library
    // - in 64 bits, the Boolean type is not correctly converted to freeimage BOOL type (integer 32 bits)
    // ==> replace Boolean with LongBool in the calls to the freeimage library
    // - as linux sees the difference between uppercase and lowercase :
    // ==> replace FreeImage_GetMetaData with FreeImage_GetMetadata in the call to the freeimage library
    //
    freeimage est disponible ici
    la dernière version du wrapper est disponible ici

    Amicalement, nullosse

  15. #15
    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 !
    Citation Envoyé par Nullosse Voir le message
    Salut,

    un dernier espoir sous linux : freeimage : (...)
    Merci pour cette piste, qui avait l'air sympathique, mais comme tu le vois, j'écris à l'imparfait...

    En effet, dans le README.linux qu'on trouve à la racine du .zip décompressé, on peut lire :
    The installation process is as simple as this :
    1) Enter the FreeImage directory
    2) Build the distribution :
    make
    make install
    3) Clean all files produced during the build process
    make clean
    Vu comme ça, ça a l'air enfantin, on est d'accord. Sauf qu'à la fin de l'exécution de make, je me prends une volée d'erreurs que même lorsque je compilais des noyaux 2.6 je n'en ai pas eu des comme ça
    Alors je suis passé par mon gestionnaire de paquets et j'ai découvert une lib installable, ce que j'ai fait et là ça s'est bien passé, mais après ?
    J'ai essayé de rajouter tout et n'importe quoi dans mon uses (en m'inspirant de cette page, qui n'a pas l'air toute jeune), ça ne trouve jamais la librairie...
    Et le web n'est pas très riche sur ce coup-là.

    Si tu savais comme ça me gonfle cette informatique qui fonctionne sur 3 pattes...
    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. #16
    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
    (...) Si tu savais comme ça me gonfle cette informatique qui fonctionne sur 3 pattes...
    Tiens, pas plus tard que cet aprème je tombe sur un truc qui a l'air géant, et qui propose en plus un wrapper entre LibTiff et Delphi !
    La solution ?
    Mais que nenni ! Liens morts, fichiers inconnus sur le site...
    Ch'suis dég', et épuisé...

    D'autant plus que tous mes autres tests (j'en ai refait cet après-midi) confirment que le problème est bien dans la librairie fpreadtiff.pas (j'ai trouvé comment modifier et recompiler le fichier).
    Mais ça se situe dans la routine de décompression LZW et c'est d'une complexité sans nom, d'autant plus que le fichier n'a pratiquement pas de commentaires
    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. #17
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    hello Jipété,

    cette fois-ci il y a un gros espoir pour toi . En effet j'ai réussi à afficher sous lazarus linux (ubuntu) toutes les images tiff de test qui se trouvent ici
    PlanarConfiguration = 1 (packed data)
    -------------------------------------
    caspian.tif 279x220 64-bit floating point (deflate) Caspian Sea from space
    cramps.tif 800x607 8-bit b&w (packbits) "cramps poster"
    cramps-tile.tif 256x256 tiled version of cramps.tif (no compression)
    dscf0013.tif 640x480 YCbCr digital camera image which lacks Reference
    Black/White values. Contains EXIF SubIFD. No compression.
    fax2d.tif 1728x1082 1-bit b&w (G3/2D) facsimile
    g3test.g3 raw Group 3 encoded fax file
    g3test.tif TIFF equivalent of g3test.g3 created by fax2tiff
    jello.tif 256x192 8-bit RGB (lzw palette) Paul Heckbert "jello"
    ladoga.tif 158x118 16-bit unsigned, single band, deflate
    off_l16.tif 333x225 8-bit CIE LogL (SGILog) office from Greg Larson
    off_luv24.tif 333x225 8-bit CIE LogLuv (SGILog24) office from " "
    off_luv32.tif 333x225 8-bit CIE LogLuv (SGILog) office from " "
    pc260001.tif 640x480 8-bit RGB digital camera image. Contains EXIF SubIFD.
    No compression.
    quad-jpeg.tif 512x384 8-bit YCbCr (jpeg) version of quad-lzw.tif
    quad-lzw.tif 512x384 8-bit RGB (lzw) "quadric surfaces"
    quad-tile.tif 512x384 tiled version of quad-lzw.tif (lzw)
    strike.tif 256x200 8-bit RGBA (lzw) "bowling pins" from Pixar
    text.tif 1512x359 4-bit b&w (thunderscan) am-express credit card
    ycbcr-cat.tif 250x325 8-bit YCbCr (lzw) "kitty" created by rgb2ycbcr

    smallliz.tif 160x160 8-bit YCbCr (OLD jpeg) lizard from HP**
    zackthecat.tif 234x213 8-bit YCbCr (OLD jpeg) tiled "ZackTheCat" from NeXT**
    La librairie que j'ai utilisée est magique ( imagemagick) . Il faut l'installer sur son système.
    J'ai créé un petit projet (en pièce jointe) qui charge une image dans un Timage. J'ai une option -L/usr/lib pour que le lieur trouve la librairie ImageMagick.
    J'espère que cela va marcher pour toi.
    Amicalement, nullosse.
    Fichiers attachés Fichiers attachés

  18. #18
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jipété
    Mais ça se situe dans la routine de décompression LZW et c'est d'une complexité sans nom, d'autant plus que le fichier n'a pratiquement pas de commentaires
    Effectivement !

    As-tu plus d'infos pour cerner le problème ?

    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
          // decompress
          if ChunkType=tctTile then // ligne 1724 de fpreadtiff.pas
            ExpectedChunkLength:=(SampleBitsPerPixel*IFD.TileWidth+7) div 8*IFD.TileLength
          else
            ExpectedChunkLength:=((SampleBitsPerPixel*IFD.ImageWidth+7) div 8)*IFD.RowsPerStrip;
          case IFD.Compression of
          TiffCompressionNone: ;
          TiffCompressionPackBits: DecodePackBits(Chunk,CurByteCnt);
          TiffCompressionLZW: DecodeLZW(Chunk,CurByteCnt); 
          TiffCompressionDeflateAdobe,
          TiffCompressionDeflateZLib: DecodeDeflate(Chunk,CurByteCnt,ExpectedChunkLength);
          else
            TiffError('compression '+TiffCompressionName(IFD.Compression)+' not supported yet');
          end;
          if CurByteCnt<=0 then continue;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFPReaderTiff.DecodeLZW(var Buffer: Pointer; var Count: PtrInt); // ligne 1905
    var
      NewBuffer: Pointer;
      NewCount: PtrInt;
    begin
      DecompressLZW(Buffer,Count,NewBuffer,NewCount);
      FreeMem(Buffer);
      Buffer:=NewBuffer;
      Count:=NewCount;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    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
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    procedure DecompressLZW(Buffer: Pointer; Count: PtrInt; out NewBuffer: PByte; // ligne 2091
      out NewCount: PtrInt);
    type
      TLZWString = packed record
        Count: integer;
        Data: PByte;
      end;
      PLZWString = ^TLZWString;
    const
      ClearCode = 256; // clear table, start with 9bit codes
      EoiCode = 257; // end of input
    var
      NewCapacity: PtrInt;
      SrcPos: PtrInt;
      SrcPosBit: integer;
      CurBitLength: integer;
      Code: Word;
      Table: PLZWString;
      TableCapacity: integer;
      TableCount: integer;
      OldCode: Word;
     
      procedure Error(const Msg: string);
      begin
        raise Exception.Create(Msg);
      end;
     
      function GetNextCode: Word;
      var
        v: Integer;
      begin
        Result:=0;
        // CurBitLength can be 9 to 12
        //writeln('GetNextCode CurBitLength=',CurBitLength,' SrcPos=',SrcPos,' SrcPosBit=',SrcPosBit,' ',hexstr(PByte(Buffer)[SrcPos],2),' ',hexstr(PByte(Buffer)[SrcPos+1],2),' ',hexstr(PByte(Buffer)[SrcPos+2],2));
        // read two or three bytes
        if CurBitLength+SrcPosBit>16 then begin
          // read from three bytes
          if SrcPos+3>Count then Error('LZW stream overrun');
          v:=PByte(Buffer)[SrcPos];
          inc(SrcPos);
          v:=(v shl 8)+PByte(Buffer)[SrcPos];
          inc(SrcPos);
          v:=(v shl 8)+PByte(Buffer)[SrcPos];
          v:=v shr (24-CurBitLength-SrcPosBit);
        end else begin
          // read from two bytes
          if SrcPos+2>Count then Error('LZW stream overrun');
          v:=PByte(Buffer)[SrcPos];
          inc(SrcPos);
          v:=(v shl 8)+PByte(Buffer)[SrcPos];
          if CurBitLength+SrcPosBit=16 then
            inc(SrcPos);
          v:=v shr (16-CurBitLength-SrcPosBit);
        end;
        Result:=v and ((1 shl CurBitLength)-1);
        SrcPosBit:=(SrcPosBit+CurBitLength) and 7;
        //writeln('GetNextCode END SrcPos=',SrcPos,' SrcPosBit=',SrcPosBit,' Result=',Result,' Result=',hexstr(Result,4));
      end;
     
      procedure ClearTable;
      var
        i: Integer;
      begin
        for i:=0 to TableCount-1 do
          ReAllocMem(Table[i].Data,0);
        TableCount:=0;
      end;
     
      procedure InitializeTable;
      begin
        CurBitLength:=9;
        ClearTable;
      end;
     
      function IsInTable(Code: word): boolean;
      begin
        Result:=Code<258+TableCount;
      end;
     
      procedure WriteStringFromCode(Code: integer; AddFirstChar: boolean = false);
      var
        s: TLZWString;
        b: byte;
      begin
        //WriteLn('WriteStringFromCode Code=',Code,' AddFirstChar=',AddFirstChar,' x=',(NewCount div 4) mod IFD.ImageWidth,' y=',(NewCount div 4) div IFD.ImageWidth,' PixelByte=',NewCount mod 4);
        if Code<256 then begin
          // write byte
          b:=Code;
          s.Data:=@b;
          s.Count:=1;
        end else if Code>=258 then begin
          // write string
          if Code-258>=TableCount then
            Error('LZW code out of bounds');
          s:=Table[Code-258];
        end else
          Error('LZW code out of bounds');
        if NewCount+s.Count+1>NewCapacity then begin
          NewCapacity:=NewCapacity*2+8;
          ReAllocMem(NewBuffer,NewCapacity);
        end;
        System.Move(s.Data^,NewBuffer[NewCount],s.Count);
        //for i:=0 to s.Count-1 do write(HexStr(NewBuffer[NewCount+i],2)); // debug
        inc(NewCount,s.Count);
        if AddFirstChar then begin
          NewBuffer[NewCount]:=s.Data^;
          //write(HexStr(NewBuffer[NewCount],2)); // debug
          inc(NewCount);
        end;
        //writeln(',WriteStringFromCode'); // debug
      end;
     
      procedure AddStringToTable(Code, AddFirstCharFromCode: integer);
      // add string from code plus first character of string from code as new string
      var
        b1, b2: byte;
        s1, s2: TLZWString;
        p: PByte;
      begin
        //WriteLn('AddStringToTable Code=',Code,' FCFCode=',AddFirstCharFromCode,' TableCount=',TableCount,' TableCapacity=',TableCapacity);
        if TableCount=4096-259 then
          Error('LZW too many codes');
        // grow table
        if TableCount>=TableCapacity then begin
          TableCapacity:=TableCapacity*2+128;
          ReAllocMem(Table,TableCapacity*SizeOf(TLZWString));
        end;
        // find string 1
        if Code<256 then begin
          // string is byte
          b1:=Code;
          s1.Data:=@b1;
          s1.Count:=1;
        end else if Code>=258 then begin
          // normal string
          if Code-258>=TableCount then
            Error('LZW code out of bounds');
          s1:=Table[Code-258];
        end else
          Error('LZW code out of bounds');
        // find string 2
        if AddFirstCharFromCode<256 then begin
          // string is byte
          b2:=AddFirstCharFromCode;
          s2.Data:=@b2;
          s2.Count:=1;
        end else begin
          // normal string
          if AddFirstCharFromCode-258>=TableCount then
            Error('LZW code out of bounds');
          s2:=Table[AddFirstCharFromCode-258];
        end;
        // set new table entry
        Table[TableCount].Count:=s1.Count+1;
        p:=nil;
        GetMem(p,s1.Count+1);
        Table[TableCount].Data:=p;
        System.Move(s1.Data^,p^,s1.Count);
        // add first character from string 2
        p[s1.Count]:=s2.Data^;
        // increase TableCount
        inc(TableCount);
        case TableCount+259 of
        512,1024,2048: inc(CurBitLength);
        end;
      end;
     
    begin
      NewBuffer:=nil;
      NewCount:=0;
      if Count=0 then exit;
      //WriteLn('DecompressLZW START Count=',Count);
      //for SrcPos:=0 to 19 do
      // write(HexStr(PByte(Buffer)[SrcPos],2));
      //writeln();
     
      NewCapacity:=Count*2;
      ReAllocMem(NewBuffer,NewCapacity);
     
      SrcPos:=0;
      SrcPosBit:=0;
      CurBitLength:=9;
      Table:=nil;
      TableCount:=0;
      TableCapacity:=0;
      try
        repeat
          Code:=GetNextCode;
          //WriteLn('DecompressLZW Code=',Code);
          if Code=EoiCode then break;
          if Code=ClearCode then begin
            InitializeTable;
            Code:=GetNextCode;
            //WriteLn('DecompressLZW after clear Code=',Code);
            if Code=EoiCode then break;
            if Code=ClearCode then
              Error('LZW code out of bounds');
            WriteStringFromCode(Code);
            OldCode:=Code;
          end else begin
            if Code<TableCount+258 then begin
              WriteStringFromCode(Code);
              AddStringToTable(OldCode,Code);
              OldCode:=Code;
            end else if Code=TableCount+258 then begin
              WriteStringFromCode(OldCode,true);
              AddStringToTable(OldCode,OldCode);
              OldCode:=Code;
            end else
              Error('LZW code out of bounds');
          end;
        until false;
      finally
        ClearTable;
        ReAllocMem(Table,0);
      end;
     
      ReAllocMem(NewBuffer,NewCount);
    end;
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  19. #19
    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 à tous !
    Citation Envoyé par tourlourou Voir le message
    Effectivement !

    As-tu plus d'infos pour cerner le problème ?
    Non, Yves, aucune, mis à part le pdf (trouvable un peu partout) qui décrit les spéc's de TIFF 6.0, et qui, comme je le dis plus haut, est d'une complexité sans nom...
    Merci de t'être penché là-dessus, je constate en voyant tes bouts de code que tu as mis le doigt comme moi là où ça fait mal, mais qu'on n'est pas plus avancé.
    Il faudrait revoir de fond en comble ce fpreadtiff.pas, je n'ai pas le niveau, ça restera comme ça...

    Et c'est pas bien grave (quoique, j'aurais préféré ne pas faire appel à des libs extérieures, mais faut savoir se faire violence des fois ), car l'ami Nullosse a trouvé le truc !

    Citation Envoyé par Nullosse Voir le message
    hello Jipété,

    cette fois-ci il y a un gros espoir pour toi . En effet j'ai réussi à afficher sous lazarus linux (ubuntu) toutes les images tiff de test qui se trouvent ici


    La librairie que j'ai utilisée est magique ( imagemagick) . Il faut l'installer sur son système.
    J'ai créé un petit projet (en pièce jointe) qui charge une image dans un Timage. J'ai une option -L/usr/lib pour que le lieur trouve la librairie ImageMagick.
    J'espère que cela va marcher pour toi.
    Amicalement, nullosse.
    Ça fonctionne du feu de Dieu mon neveu !
    Trop bien ! ! !

    Mais attention (et là, franchement, les messages d'erreurs ne sont vraiment pas explicites, et c'est pour ça qu'on perd un temps dément...) :
    J'ai pu constater avec mon gestionnaire de paquets (Synaptic) que LibMagickWand et Core étaient installés et pourtant, à la compil de ton projet ils n'étaient pas trouvés : j'ai vraiment envisagé de passer la machine par la fenêtre, mais avant, j'ai un peu (beaucoup ? [trop ???]) googlé, et ai fini par me rendre compte que si ces librairies étaient installées dans mon système, il manquait la principale : libmagick++-dev !

    Bien sûr l'installation de celle-ci oblige à supprimer des paquets, à en mettre d'autres à jour, à en installer certains, bref on croise les doigts très fort avant de cliquer sur "Fais-le", on se fait un café pendant que ça le fait et au final ça fonctionne !
    Mille millions de mercis, car maintenant, moi aussi j'ouvre la soixantaine de fichiers de ton lien, plus celui qui me posait problème dès le départ !
    Et ce truc (ImageMajick) est même capable d'ouvrir des .Tiff compressés en Jpeg, chose dont est parfaitement incapable fpreadtiff.pas !

    Nullosse, mon pote, je t'en serre 5 très très très très fort, cette trouvaille c'est géant ! (dommage que je ne puisse pas cliquer sur )
    Encore merci, merci et... merci !

    (Question perso : t'es où, géographiquement ? Car j'ai constaté que tu postais à des heures où je fais gros dodo ! Tu serais pas sous le soleil, dans les îles ou ce genre de choses ? [just curious] )

    PS : ai essayé de recompiler FreeImage après l'install du paquet dont je viens de causer (j'avais vu passer pendant l'install des noms qui me parlaient), mais toujours les mêmes erreurs...
    Bon, je vire ce truc.
    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

  20. #20
    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
    Non, Yves, aucune, mis à part le pdf (trouvable un peu partout) qui décrit les spéc's de TIFF 6.0, et qui, comme je le dis plus haut, est d'une complexité sans nom...
    Merci de t'être penché là-dessus, je constate en voyant tes bouts de code que tu as mis le doigt comme moi là où ça fait mal, mais qu'on n'est pas plus avancé.
    Il faudrait revoir de fond en comble ce fpreadtiff.pas, je n'ai pas le niveau, ça restera comme ça...
    Yves, j'ai répondu un peu vite ce matin...

    En fait, le message d'erreur "LZW stream overrun" généré par mon fichier maudit vient de cette fonction "GetNextCode", où j'ai constaté ce qui suit :

    - décommenter au début la ligne //writeln('GetNextCode CurBitLength=',CurBitLength,'... ne sert qu'à flooder la console de données totalement inexploitables à mon niveau ;

    - modifier juste après
    if SrcPos+3>Count then Error('LZW stream overrun'); en
    if SrcPos+3>Count then Error('(a)-LZW stream overrun '+IntToStr(SrcPos)+'--'+IntToStr(Count));
    me donne le message d'erreur "Error while reading stream: (a)-LZW stream overrun 375229--375230", ce qui nous avance assez peu puisqu'on ne sait pas quoi faire de ces valeurs, à part confirmer qu'il y a bien un problème.

    Voilà.

    Je vois qu'e-ric nous signale une version 2.6.4 toute fraîche, mais rien de changé dans fpreadtiff.pas à part la prise en compte de fichiers Black and white 1 bit, et c'est tout en ce qui concerne le graphisme
    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

Discussions similaires

  1. Ouvrir des fichiers de différents formats
    Par Abou Zar dans le forum Composants VCL
    Réponses: 20
    Dernier message: 01/05/2012, 10h50
  2. Inclure des images au format tif
    Par Erlen dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 13
    Dernier message: 31/03/2010, 22h53
  3. ouvrir des fichiers tif 3d
    Par svagrim dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 29/08/2007, 12h21
  4. Ouvrir un fichier image / Webutil
    Par cyrilm dans le forum Forms
    Réponses: 6
    Dernier message: 19/10/2005, 14h50
  5. compression d'image au format .tif
    Par sasaki dans le forum ASP
    Réponses: 2
    Dernier message: 09/08/2005, 10h39

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