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 :

sauvgarder les données de CDC sous forme d'une image


Sujet :

MFC

  1. #1
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut sauvgarder les données de CDC sous forme d'une image
    Slt les amis. J'ai une probleme et j'espere qui vous m'aidiez a le résolu. ma probleme consiste a sauvgarder les données de contexte graphique sous forme d'une image (Bmp,...). bon si vous n'avez pas une reponse precise j'espere qui vous me donnez le principe et je veut essayer de completer le reste. merci d'avoir m'aider.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    avec Visual 2005 , la classe CImage fait le boulot il suffit de lui attacher le bitmap et d'appeler la fonction de sauvegarde.

  3. #3
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut aide pour la Classe CImage
    slt, je vue ta remarque pour la classe CImage, mais est ce qu'il n'y a pas d'autre methode pour sauvgarder le contenu de CDC sans la classe CImage (bon qqu ma renseigné à la fonction CreateDIBSection mais je ne sais quelle est son utilité).
    Et est ce que la migration vers Visual 2005 est diffcile!
    merci pour ton aide...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    avec VC6.0 tu peux utiliser la classe CPicture mentionnée ici :
    http://c.developpez.com/faq/vc/?page...gndBitmapOnDlg

  5. #5
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Merci pour la classe CPicture
    La classe CPicture ne permet pas de sauvgardé le contenu de CDC mais seulement le contenu de l'image chargée en avance. Mais J'essayé de trouvé une solution pour ma problème. la solution consiste a déclaré dans Ma CView(CTestSaveView) 4 variables*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CRect m_Drawing;
    HBITMAP m_Bm;
    BYTE *m_BmByte;
    BITMAPINFOHEADER m_BMIH;
    Puis dans la fonction membre
    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
    void CTestSaveView::OnInitialUpdate() 
    {
        CView::OnInitialUpdate();
        
        // TODO: Add your specialized code here and/or call the base class
         // device context for painting
        CDC *pDC=GetDC();
        // TODO: Add your message handler code here
        CTestSaveDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        ////////////////////////////////////////////////////////////
        GetClientRect(&m_Drawing);
        ScreenToClient(&m_Drawing);
    
        if(pDC==NULL)
            return ;
        InitBMTH();
        m_Bm = CreateDIBSection(pDC->GetSafeHdc(), (CONST BITMAPINFO*)&m_BMIH ,DIB_RGB_COLORS, (void**)&m_BmByte, NULL, 0);
        if((m_Bm == NULL) || (m_BmByte == NULL))
        {
            //We could not create the bitmap -- quit
            AfxMessageBox("Impossible", MB_OK | MB_ICONSTOP);
            PostQuitMessage(0);
        }
        
    }
    Vous pouvez ensuite declaré une fonction qui vous nommez Dessin*(Dans cette fonction vous pouvez dessiné tous ce qui vous voulez):

    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
    void CTestSaveView::Dessin()
    {
        CDC* pDC = GetDC();
        if(pDC != NULL)
        {
            CDC dcMem;
            //Create a memory dc and select the drawing surface into it
            if(dcMem.CreateCompatibleDC(pDC) == TRUE)
            {
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(dcMem.GetSafeHdc(), m_Bm);    
                /////////////////////////////////////////////////////////////////////////////////////
                dcMem.FillSolidRect(0, 0, m_Drawing.Width(), m_Drawing.Height(), RGB(255,0,0));
                BOOL bResult = BitBlt(pDC->GetSafeHdc(),                         m_Drawing.left,                            m_Drawing.top,                            m_Drawing.Width(),                        m_Drawing.Height(),
                        dcMem.GetSafeHdc(), 0, 0,                              SRCCOPY);
                //And deselect the drawing surface
                SelectObject(dcMem.GetSafeHdc(), hOldBitmap);
            }
            ReleaseDC(pDC);
        }
    }
    Ensuite vous definissez le message CTestSaveView*:: OnFileSave comme suit
    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
    void CTestSaveView::OnFileSave() 
    {
        // TODO: Add your command handler code here
    
        CFileDialog dlg(FALSE, DEFAULT_BITMAP_FILE_EXTENSION, DEFAULT_BITMAP_FILE_NAME, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Windows Bitmap Files (*.BMP; *.DIB)|*.BMP; *.DIB||" , NULL);
        if(dlg.DoModal() == IDOK)
        {
            CString szPathName = dlg.GetPathName();
            //Create a new file for writing
            FILE *pFile = fopen(szPathName, "wb");
            if(pFile == NULL)
            {
                AfxMessageBox("Erreur");
                return;
            }
            BITMAPFILEHEADER bmfh;    
            int nBitsOffset = sizeof(BITMAPFILEHEADER) + m_BMIH.biSize; 
            LONG lImageSize = m_BMIH.biSizeImage;
            LONG lFileSize = nBitsOffset + lImageSize;
            bmfh.bfType = 'B'+('M'<<8);            
            bmfh.bfOffBits = nBitsOffset;        
            bmfh.bfSize = lFileSize;                
            bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
            
            UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1, sizeof(BITMAPFILEHEADER), pFile);
            UINT nWrittenInfoHeaderSize = fwrite(&m_BMIH, 1, sizeof(BITMAPINFOHEADER), pFile);
            UINT nWrittenDIBDataSize = fwrite(m_BmByte, 1, lImageSize, pFile);
            fclose(pFile);        
        }    
    }
    Si vous trouvez autre solution vous pouvez me renseigné (On est la pour apprendre*!)
    Pense à mettre la balise de code, Merci Farscape Et Merci Farscape pour ton aide vraiment merci.

  6. #6
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Le reste du code
    J'oublié de mettre le reste du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CTestSaveView:: CTestSaveView()
    {
    	// TODO: add construction code here
    	m_Bm = NULL;
    	m_BmByte = NULL;
    	memset(&m_BMIH, 0, sizeof(BITMAPINFOHEADER));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CTestSaveView::InitBMTH()
    {
    m_BMIH.biSize = sizeof(BITMAPINFOHEADER);
    m_BMIH.biBitCount = 24;
    m_BMIH.biPlanes = 1;
    m_BMIH.biCompression = BI_RGB;
    m_BMIH.biWidth = m_Drawing.Width();
    m_BMIH.biHeight = m_Drawing.Height();
    m_BMIH.biSizeImage = ((((m_BMIH.biWidth * m_BMIH.biBitCount) + 31) & ~31) >> 3) *m_BMIH.biHeight;
    }

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

Discussions similaires

  1. Sauvegarder une scène GLScene sous forme d'une image
    Par essof_salhi dans le forum Delphi
    Réponses: 4
    Dernier message: 12/06/2014, 01h45
  2. Réponses: 2
    Dernier message: 30/01/2013, 14h57
  3. Réponses: 5
    Dernier message: 06/09/2012, 18h15
  4. [Débutant] sauvegarder le contenu d'un axis sous forme d'une image
    Par miss_angel dans le forum Images
    Réponses: 10
    Dernier message: 20/01/2011, 16h10
  5. Réponses: 0
    Dernier message: 28/03/2008, 13h24

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