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

MFC Discussion :

Charger une bitmap 8 bits en MFC


Sujet :

MFC

Vue hybride

Juliunus Charger une bitmap 8 bits en... 10/04/2009, 19h55
Médinoc Pour changer les options de... 11/04/2009, 18h02
stephdim méthode Attach() de la classe... 11/04/2009, 20h26
buggen25 bonsoir; Comme on peut aussi... 11/04/2009, 20h38
Médinoc Ah oui, ils sont lourds sur... 11/04/2009, 20h43
Juliunus Merci à tous ! ... 13/04/2009, 01h22
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 7
    Par défaut Charger une bitmap 8 bits en MFC
    Salut à tous,

    J'ai un problème pour charger une ressource de mon programme en utilisant MFC, mais sans que leur format soit converti.

    Je m'explique : J'utilise par exemple la séquence suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_REPERE3DB);
    BITMAP BitmapInfo = { 0 };
    bitmap.GetBitmap(&BitmapInfo);
    // ici j'alloue l'espace mémoire qu'il faut pour les données
    bitmap.GetBitmapBits( imgsize, pBitmapData );
    Sauf que... si mon écran est en 32 bits, je récupère une image 32 bits, et si l'écran est en 16 bits, j'obtiens une image 16 bits.
    Il semblerait y avoir une sorte de conversion implicite : IDB_REPERE3DB, à l'origine, est une image sur 8 bits (niveaux de gris).

    Autant ça ne me gênerait pas d'avoir du 32 bits, si je lis la composante rouge je m'y retrouve, autant en 16 bits je perds des données dans la conversion, et il est très important que lorsque j'ai une valeur à 1 sur un pixel, je lise un 1 et pas autre chose (genre un 0).


    Connaissez-vous un moyen de récupérer l'image d'origine, en 8 bits, ou en tout cas un moyen d'éviter de recevoir du 16 bits ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Pour changer les options de chargement, il faut passer par la fonction libre LoadImage().
    Le problème, c'est que je ne sais pas comment y attacher un CBitmap ensuite.

    La fonction membre FromHandle() retourne un CBitmap dont tu ne contrôles pas la durée de vie, j'ignore si ça peut quand même convenir...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Le problème, c'est que je ne sais pas comment y attacher un CBitmap ensuite.
    méthode Attach() de la classe CBitmap (ou plutot CGdiObject dont CBitmap dérive)

    il faudra surement caster de HANDLE vers HGDIOBJ

    @+

  4. #4
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    bonsoir;
    Comme on peut aussi utiliser la class atl, CImage pour charger l'image bitmap, avec une version supérieure a visual C++ 6.0.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Citation Envoyé par stephdim Voir le message
    méthode Attach() de la classe CBitmap (ou plutot CGdiObject dont CBitmap dérive)
    Ah oui, ils sont lourds sur MSDN là...
    Je ne l'avais pas vue parce que la doc de MFC ne montre pas les fonctions des classes mères, alors que la doc du Framework .Net le fait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 7
    Par défaut
    Merci à tous !

    Effectivement, la solution vient de la fonction LoadImage (http://msdn.microsoft.com/en-us/library/ms648045.aspx).

    En passant la valeur LR_CREATEDIBSECTION au dernier paramètre, j'arrive à récupérer une image telle que je la stocke (c'est-à-dire 8 bits). Ouf !


    En espérant que ça puisse servir à d'autres, voilà le code qui ne convertit pas l'image en fonction de l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HANDLE h = LoadImage(GetModuleHandle(NULL), 
    HBITMAP hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_REPERE3DB), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
    CBitmap bitmap;
    bitmap.Attach(hbm);

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

Discussions similaires

  1. Charger bitmap 1 bit
    Par Charlie111 dans le forum C++
    Réponses: 1
    Dernier message: 03/01/2011, 00h46
  2. Generer une image bitmap 24 bits avec PIL
    Par scheme dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/09/2009, 10h16
  3. Réponses: 4
    Dernier message: 28/02/2006, 14h25
  4. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59
  5. Réponses: 2
    Dernier message: 20/01/2004, 14h27

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