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

Windows Discussion :

[C] Manipulation du format bitmap


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut [C] Manipulation du format bitmap
    Bonjour à tous,
    je voudrais savoir comment manipuler le format bitmap avec l'API Windows, donc :
    - passer d'un fichier à un espace mémoire (on a acces directement à l'image)
    - passer de l'espace mémoire à un objet bitmap (que l'on manipule avec un handle HBITMAP et qui peut être sélectionné avec un Device Context)

    Après, pour afficher le bitmap dans un DC et tout ça je crois avoir compris, mais je m'embrouille avec les structures comme BITMAPFILEHEADER, BITMAPINFOHEADER, RGBQUAD, BITMAPCOREINFO, BITMAPINFO, BITMAP...

    Et en passant, je voudrais savoir si il n'y a pas d'autre moyen d'afficher d'un bloc une image que l'on a en mémoire que le format bitmap (avec SetPixel c'est beaucoup trop lent).

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Le plus simple pour charger un bitmap en mémoire et y avoir directement accès:
    1. Charger le bitmap avec LoadImage() et les flags LR_LOADFROMFILE et LR_CREATEDIBSECTION
    2. Faire un GetObject() sur le bitmap pour récupérer un pointeur vers sa mémoire.


    Le plus simple pour créer un bitmap en mémoire avec un format donné, c'est utiliser la fonction CreateDIBSection(). Les formats 24 et 32 bits sont les plus simples à créer (pas de palette) et le format 32bits est le plus simple des deux à utiliser en mémoire.
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    HBITMAP CreateDIBSection(
    HDC hdc, // handle to device context
    CONST BITMAPINFO *pbmi, // pointer to structure containing bitmap size, format, and color data
    UINT iUsage, // color data type indicator: RGB values or palette indices
    VOID *ppvBits, // pointer to variable to receive a pointer to the bitmap's bit values
    HANDLE hSection, // optional handle to a file mapping object
    DWORD dwOffset // offset to the bitmap bit values within the file mapping object
    );

    Pourquoi y a-t-il besion d'un device context alors qu'on est censé créer un device INDEPENDENT bitmap ??? Et à quoi servent toutes ces fonctions qui paraissent bien inutiles à première vue ?: CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDiscardableBitmap.......

    Et pourquoi dans ma doc qui doit faire une bonne vingtaine de pages sur le sujet, il n'y a aucune réference à CreateDIBSection? Ou est donc la mémoire du bitmap quand on a juste un handle et quel est l'interet que le programme ne puisse pas avoir accès à cette mémoire facilement ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    Je suppose que tu pensais à LoadImage à la place de LoadBitmap ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Pourquoi y a-t-il besion d'un device context alors qu'on est censé créer un device INDEPENDENT bitmap ???
    Ce paramètre n'est utilisé que si tu passes la valeur DIB_PAL_COLORS dans le paramètre iUsage. Normalement, on utilise la valeur DIB_RGB_COLORS et on passe un handle NULL.
    Et à quoi servent toutes ces fonctions qui paraissent bien inutiles à première vue ?: CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDiscardableBitmap.......
    • CreateBitmap() crée un DDB.
    • CreateBitmapIndirect() est pareil, mais avec une structure au lieu de directement les paramètres.
    • CreateCompatibleBitmap() crée aussi un DDB, mais avec le même format de couleur que le bitmap actuellement sélectionné dans le DC passé en paramètre.
    • CreateDIBitmap crée un DDB à partir d'un DIB.
    • CreateDiscardableBitmap() est un relicat de Win16.

    Donc en fait, toutes ces fonctions servent à créer des DDB, ce qui me parait inutile de nos jours. On peut les considérer toutes comme des reliquats de Win16 (les DIB n'étaient pas utilisables directement sous Win16, c'est pourquoi on faisait pratiquement tout avec des DDB).
    Et pourquoi dans ma doc qui doit faire une bonne vingtaine de pages sur le sujet, il n'y a aucune réference à CreateDIBSection?
    On ne sait pas de quand date ta doc. Si elle date de Win16, c'est normal.
    Ou est donc la mémoire du bitmap quand on a juste un handle et quel est l'interet que le programme ne puisse pas avoir accès à cette mémoire facilement ?
    L'intéret des DIB, c'est justement qu'on peut.
    Je suppose que tu pensais à LoadImage à la place de LoadBitmap ?
    Corrigé.
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut
    C'est bien, maintenant je sais charger un bitmap, et même l'afficher (waou) mais comment faire pour le sauvegarder dans un autre fichier ?: Après un appel à GetObject, on ne retrouve qu'une parties des informations contenues au dépard dans le fichier.

    Je les réinvente comme elle sont pas trop dures à trouver (mais c'est embètant quand même, des valeurs comme la résolution paraissent pas évidentes).
    Ou alors je copie le début du fichier initial sans rien changer et après j'écris ma version de l'image que j'aurais modifiée.

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

Discussions similaires

  1. acquisition d'une image au format bitmap puis pgm
    Par MzelleBatz dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 25/02/2008, 15h50
  2. Réponses: 4
    Dernier message: 14/02/2008, 14h18
  3. pb compact framework .NET : format BITMAP
    Par Guntreg dans le forum C#
    Réponses: 1
    Dernier message: 06/09/2007, 17h42
  4. [débutant]comment manipuler des fichiers bitmap
    Par caty_info dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 04/04/2007, 10h20
  5. Manipuler le format retourné pour une date.
    Par BlackMinou dans le forum Oracle
    Réponses: 3
    Dernier message: 05/04/2006, 18h01

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