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 :

Ecrire dans un DIB ?


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Ecrire dans un DIB ?
    Hello
    Bon alors, j'ai un soucis simple ^^
    Je dispose d'un DIB windows et je souhaite juste tracer une ligne dans le dib, comment faire ??

    Il me semble qu'il me faudrai créer une CBitmap à partir du DIB, puis mettre la CBitmap dans un DC, puis dessiner dans le DC, puis récupérer la DIB de ma CBitmap, et le recopier dans mon DIB d'origine avec un memcpy ou un truc du genre ... est ce que cette approche est la bonne ?

    Quoi qu'il en soit, je me galere vraiment à coder tout ça vu que je ne maitrise pas vraiment le gdi windows ...

    Quelqu'un pourrait m'aider ? m'envoyer des bouts de code ?
    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, avant de parler de CBitmap:
    • Utilises-tu MFC ou non ?
    • Sous quelle forme est ta DIB au départ ?
    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
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    oui j'utilise les MFC

    pour le format du DIB, je ne sais pas, quels formats sont possibles ? Comment connaitre son format ?
    Je récupere le DIB d'une image DICOM (format médical) via une fonction d'une librairie qui n'est pas à moi, donc je ne sais pas du tout ce qu'il me retourne comme DIB...
    thx

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    alors j'ai zieuté le format de mon DIB
    y a l'entete (normal)
    y a une palette
    et y a un buffer 8 bits en niveau de gris
    voila, ca répond a ta question ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Non, ce que je voulais savoir, c'est si c'était un bête .bmp sur le disque, un truc reçu en ressource, etc.

    En API Win32, je connais la fonction LoadImage() qui aurait fait tout ce dont tu as besoin pour charger le bitmap en mémoire. Mais je ne sais pas quel est l'équivalent MFC, je n'ai jamais utilisé CBitmap....

    Et ne j'ai jamais utilisé GDI+ (classe CImage etc.) et autres...
    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
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par overseb
    Hello
    Bon alors, j'ai un soucis simple ^^
    Je dispose d'un DIB windows et je souhaite juste tracer une ligne dans le dib, comment faire ??

    Il me semble qu'il me faudrai créer une CBitmap à partir du DIB, puis mettre la CBitmap dans un DC, puis dessiner dans le DC, puis récupérer la DIB de ma CBitmap, et le recopier dans mon DIB d'origine avec un memcpy ou un truc du genre ... est ce que cette approche est la bonne ?

    Quoi qu'il en soit, je me galere vraiment à coder tout ça vu que je ne maitrise pas vraiment le gdi windows ...

    Quelqu'un pourrait m'aider ? m'envoyer des bouts de code ?
    merci
    Il faut créer un tampon avec HBITMAP, un BITMAPINFOHEADER et tout ce qui s'en suit , utiliser LineTo/MoveTo du GDI .
    Utiliser CreateDIBSection le cas échéant.
    C'est certain les bitmaps en win32 c'est compliqué
    Regarder sur codeproject.com sinon tout est dans le MSDN

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    oui c'est ce que j'essaie de faire sans résultat ...

    petit exemple incompréhensible :
    Je crée un bitmap, je la remplis d'un rectangle rouge, et je récupere ensuite le buffer de la bitmap... qui ne contient que la valeur '170' de partout ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap(&dc, width, height);
    	BITMAP bm;
    	bitmap.GetBitmap(&bm);
    	
    	CBitmap* pOldBitmap = dc.SelectObject(&bitmap);
    	CBrush brush(RGB(255, 0, 0));
    	dc.FillRect(CRect (0, 0, width, height), &brush);
    	dc.SelectObject(pOldBitmap);
    
    	BYTE* bmpBuffer = (BYTE*)GlobalAlloc(GPTR, bm.bmBitsPixel * 8 * height);
    	bitmap.GetBitmapBits(bm.bmBitsPixel * 8 * height, bmpBuffer);
    qqun voit ou j'ai fait une erreur ?
    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Essaie en appelant GdiFlush() entre le FillRect et le GetBitmapBits().
    Ta résolution est bien 32bits?

    PS: Ah, je viens de voir l'erreur: Tu ne prends pas la largeur (à moins que le bitmap fasse 8 pixels de large...)
    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.

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    alors justement ... apres ces 4 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            CDC dc;
    	dc.CreateCompatibleDC(NULL);
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap(&dc, width, height);
    	BITMAP bm;
    	bitmap.GetBitmap(&bm);
    j'obtiens : bm.bmBitsPixel = 1 et bm.bmWidthBytes = 222
    mon image fait 1764*4475, donc d'apres la doc msdn, chaque ligne de mon image fait 222*8=1776 octets pour que ça soit bien l'entier sur 16bits supérieur à ma largeur (d'apres la msdn, chaque ligne doit avoir une taille sur 16bits)
    C'est donc pour cela que mon buffer à une taille de (bm.bmBitsPixel * 8 * height) octets
    http://msdn2.microsoft.com/en-us/library/k1sf4cx2.aspx

    Donc mon 1er pb : je ne suis meme pas sur d'avoir une CBitmap sur 32 bits ?!
    comment faire ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    j'obtiens : bm.bmBitsPixel = 1
    Donc, tu as un bitmap monochrome (1 bit) et non pas 32bits.
    bm.bmWidthBytes = 222
    mon image fait 1764*4475, donc d'apres la doc msdn, chaque ligne de mon image fait 222*8=1776 octets
    Tu veux dire 1776 pixels sur 222 octets...
    (sachant que 76-64=12 : Douze pixels "fictifs" qui servent à aligner).

    C'est donc pour cela que mon buffer à une taille de (bm.bmBitsPixel * 8 * height) octets
    Perdu, c'est bm.bmWidthBytes*height octets, c'est-à-dire ((bm.bmBitsPixel*width)+7)/8 * height octets.


    PS: Je n'ai pas bon partout, par contre: je croyais que les bitmaps devaient être alignés sur 32bits et non 16...
    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.

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    hoho !
    ok merci pour les infos
    je pensais aussi que les images etaient alignés sur 23bits, mais "the bit values of a bitmap form an array of integer (2-byte) values" ...

    alors maintenant la question : pourquoi j'ai une image monochrome ??

    en tout cas merci, je reajuste ma taille

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un CompatibleDC est créé de base avec un bitmap monochrome.
    Un CompatibleBitmap généré depuis un DC contenant un bitmap monochrome est monochrome.

    Je te conseille de créer le bitmap directement avec CreateDIBSection(), parce qu'un bitmap créé avec CreateCompatibleBitmap() n'est pas un DIB mais un DDB...
    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.

Discussions similaires

  1. Ecrire dans un DIV.
    Par cocula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/02/2005, 15h01
  2. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  3. [VBS] Ecrire dans les Eventlog avec VBS
    Par Hakkou dans le forum VBScript
    Réponses: 1
    Dernier message: 04/10/2004, 14h50
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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