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

C++Builder Discussion :

Problème FreeImage : mauvais chargement d'un tiff dans un Tbitmap


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut Problème FreeImage : mauvais chargement d'un tiff dans un Tbitmap
    Bonjour à tous.

    Alors voila je travaille avec C++ Builde, et mes objectifs étaient de pouvoir récupérer les dimensions en pixels d'une image .tiff (cette partie là a bien fonctionné).

    Pour ce faire j'ai téléchargé et utilisé la librairie FreeImage, en accès libre sur le net.

    La deuxième partie de mon problème est qu'il faut que j'arrive à mettre le .tif dans un TBitmap pour pouvoir l'afficher, j'ai réussi en partie à le faire, voici le code de ma fonction qui me permet d'y arriver :

    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
     
    //------------------------------------------------
    __fastcall TTiff :: TTiff(String nom_fichier)
    {
    DWORD toto;
    // On regarde si le fichier existe
     
    if(FileExists(nom_fichier))
    {
    // Création de deux objets :
    // Le pointeur sur un FreeImage Bitmap dib, dans lequel on charge le .tiff
    // Un HBITMAP qui va être un handle (ie pour moi un propriétaire sur l'image que l'on vient de charger)
    // Paramètre de la fonction utilisée :
    // - un identifiant du type d'image que l'on souhaite charger
    // - le nom du fichier (!! chaîne de caractères constante)
    // - un entier pour spécifier le type de chargement
    // ici default pour nous, pour charger directement le .tiff
     
    FreeImage_Initialise();
     
    FIBITMAP * dib = FreeImage_Load(FIF_TIFF,nom_fichier.c_str(),TIFF_DEFAULT);
     
    //ShowMessage(IntToStr(FreeImage_GetWidth(dib)));
     
    HBITMAP bitmap;
    // Si le pointeur n'est pas null
     
    if(dib != NULL)
    {
    //Création du Handle du Bitmap, en utilisant une fonction qui nous permet de réobtenir (sans les dénaturer) des infos sur l'image charger
    bitmap = CreateDIBitmap(GetDC(NULL),FreeImage_GetInfoHeader(dib),CBM_INIT,FreeImage_GetBits(dib),FreeImage_GetInfo(dib),DIB_RGB_COLORS);
    toto = GetLastError();
     
    if(toto == 8)
    {
    ShowMessage("Full");
    }
    else
    this->Handle = bitmap;
    }
    else
    //ShowMessage("merde !!");
     
    // Libération du pointeur
    FreeImage_Unload(dib);
    FreeImage_DeInitialise();
    }
    else
    ShowMessage("Le fichier .tiff n'existe pas");
    }
     
    //-----------------------------------------------
    La classe TTiff étant en héritage vis à vis de TBitMap, le souci vient du fait que la fonction bitmap = CreateDIBitmap(GetDC(NULL),FreeImage_GetInfoHeader(dib),CBM_INIT,FreeImage_GetBits(dib),FreeImage_GetInfo(dib),DIB_RGB_COLORS);, renvoie un code d'erreur quand l'image à traiter est trop volumineuse (ce qui est le cas car les .tiff que j'ai à traiter font plus de 50Mo), donc voila j'aimerais avoir vos suggestions pour contourner ce problème, sachant que je préfèrerai éviter de télécharger une nouvelle librairie, mais peut etre que dans ce cas présent l'utilisation de ScanLine serait judicieuse ?

    J'attends vos suggestions, merci d'avance .

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Si FreeImage parvient a charger le TIFF pourquoi ne pas lui confier aussi l'affichage du bitmap ? Je ne connais pas cette librairie mais elle a surement tout ce qu'il faut pour ça.

    D'autre part les tiffs de 50 megs sont-ils des TIFFS multi-pages ? auquel cas tu pourrais les charger page par page.

    Yarp
    www.senosoft.com

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    Merci beaucoup yarp pour ta réponse rapide.

    En fait le truc c'est que la première fonction celle avec laquelle on affecte une valeur à dib, fait en sorte que le dib soit "considéré" comme un bitmap (même si c'est un .tiff).

    Donc c'est cet affichage "tout bête" de ce bitmap qui ne fonctionne pas, du fait que la taille mémoire explose le tout.

    Par contre ton indication concernant le multipage me semble pertinente, connais tu un moyen simple de savoir si un .tiff est en multipages ou non ?

    Parce que si c'est le cas : il y a une méthode je crois dans la librairie qui peut se charger de décomposer l'image en multipage, quitte après à faire un réassamblage ou une boucle for pour les afficher, celà pourrait être intéressant.

    Merci d'avance pour ta prochaine suggestion.

    Zocco

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    > connais tu un moyen simple de savoir si un .tiff est en multipages ou non ?

    FreeImage. Je vois dans la doc "Accessing pages in a bitmap when there are multiple such as in TIFF".
    Les fonction sont apparemment FreeImage_OpenMultiBitmap, FreeImage_LoadMultiBitmat et très important FreeImage_GetPageCount.
    Je te laisse fouiner dans la doc de FreeImage mais tu as tout ce qu'il faut pour savoir si les 50 Meg sont découpables, sinon

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    Bonjour et merci yarp.

    J'ai effectivement essayé ce que tu m'as conseillé ce matin, mais le hic c'est que je n'ai qu'une seule page avec la methode GetPageCount, ce qui fait que je ne peux point faire le découpage que je souhaitais. J'ai essayé de plus les méthodes LockPage, InsertPage, AppendPage mais toujours ce fichu problème mémoire.

    Par contre dans la bibliothèque FreeImage, il y a une méthode GetScanLine, que je peux appliquer, donc ce que j'aimerais faire en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i = 0; i < this(le Tbitmap)->Width; ++i)
    this->Scanline[i] = FreeImage_GetScanLine(dib,i);
    Le hic c'est qu'il me dit lors de la compilation TBitmap :: Scanline n'est pas accessible. Existe-t-il un moyen de contourner cette difficulté pour effectuer une affectation à cette propriété ScanLine ?

    Merci d'avance.

    Zocco

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Dommage pour le multipage, mais 50 Meg ça c'est de l'image détaillée.

    Bon !
    Je n'ai pas lancé la machine avec BCB mais ce que tu me dit m'étonne à propos de ScanLine. Je ne suis pas un méga expert de TBitmap et TGraphic car j'utilise ma propre librairie d'image mais ScanLine est public j'en jurerais - presque

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    ... mais en lecture seule (c'est à cause de ce genre de limites que j'évite les objets VCL, en dehors de l'interface bien entendu).

    Par contre tu peux :
    1- écrire un descendant de TStream et passer par LoadFromStream
    et/ou
    2- tu regarde ce que je fait le load from stream de TBitmap et dérive TBitmap

    Yarp
    www.senosoft.com

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/03/2013, 11h52
  2. Problème de chargement d'une listView dans un thread
    Par Jérémy Lefevre dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 12/10/2011, 17h27
  3. Réponses: 2
    Dernier message: 20/04/2011, 15h26
  4. Réponses: 2
    Dernier message: 07/01/2009, 18h03
  5. Problème chargement d'une image dans canvas
    Par Hujii dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 28/04/2008, 21h33

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