Bitmap erstellen und füllen...



  • Das GetObject packt den Inhalt von bitmap in bmp. Geh mal mit der Zahl von GetLastError in die MSDN-Suchfunktion oder -Inhaltsfunktion, dort gibt es eine Tabelle, da steht mehr drin.



  • ne, unter 1240568 findet er da nix...



  • Hab den Code grad ausprobiert, weil ich ein ähnliches Problem hab. Bei mir liefert GetObject auch immer 0.



  • Ich mach dass immer so:

    ......
    .......
    .......
    int error=GetLastError();
    CString str;
    str.Format("%d",error);
    MessageBox(str);

    Mit der Zahl findet man auch was.



  • Die Tabelle findet man unter Win32 API unter Error Codes im MSDN Inhalt. Geht allerdings nur bis 11031, wohl wahr.



  • Vielleicht mach ich auch was komplett falsch. So ruf ich übrignes die Funktion auf:

    CDC pDC;
    pDC.CreateCompatibleDC(m_Graph.GetDC());
    CBitmap CBmp;
    pDC.SelectObject(&CBmp);
    CRect rect;
    m_Graph.GetWindowRect(&rect);
    pDC.BitBlt(0,0,rect.right,rect.bottom,m_Graph.GetDC(),0,0,0);
    WriteBitmap(FileName,(HBITMAP)CBmp,pDC);
    

    Vielleicht liegt ja da schon der Fehler.
    Mit GetLastError bekomm ich übrigens 0 raus, also eigentlich kein Fehler. Aber trotzdem gibt GetObject 0. hmmmm....

    Phips!



  • ich hab jetzt

    CBitmap bitmap;
    

    durch

    HBITMAP bitmap=CreateCompatibleBitmap(dc, 32, 32);
    

    ersetzt und es scheint besser. allerdings ist mein bitmap komplett schwarz...



  • Hi, bei mir hat er es jetzt so gemacht.

    void CBitmapDlg::OnButton1() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	CBitmap bitmap;
    	bitmap.LoadBitmap(IDB_BITMAP1);
    	CPaintDC memdc(this);
    	CBitmap* pOldBitmap=memdc.SelectObject(&bitmap);
         BITMAP  bmp; 
          if(GetObject((HBITMAP) bitmap, sizeof(BITMAP), &bmp)) 
          { 
            BITMAPINFOHEADER BmpInfoHdr; 
         BITMAPFILEHEADER BmpFileHdr; 
             BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); 
            BmpInfoHdr.biWidth = bmp.bmWidth; 
        BmpInfoHdr.biHeight = bmp.bmHeight; 
            BmpInfoHdr.biPlanes = bmp.bmPlanes; 
        BmpInfoHdr.biBitCount = 24; 
            BmpInfoHdr.biCompression    = BI_RGB; 
             BmpInfoHdr.biSizeImage        = bmp.bmWidth*bmp.bmHeight*3; 
             BmpFileHdr.bfType        = 0x4d42; 
             BmpFileHdr.bfReserved1        = 0; 
             BmpFileHdr.bfReserved2        = 0; 
             BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof (BITMAPINFOHEADER); 
            BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage; 
            bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage); 
            if(GetDIBits(memdc, (HBITMAP) bitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits, (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight) 
            { 
                HANDLE hFile = CreateFile("WWWWWWw.bmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); 
                if(hFile != INVALID_HANDLE_VALUE)  { 
                DWORD dwTmp; 
                WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL); 
                WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL); 
                WriteFile(hFile, bmp.bmBits,  BmpInfoHdr.biSizeImage,   &dwTmp, NULL); 
            }
    
            CloseHandle(hFile); 
    		} 
        GlobalFree(bmp.bmBits); 
    	memdc.SelectObject(pOldBitmap);
    	  }
    
    }
    


  • So macht er es auch:

    void CBitmapDlg::OnButton1() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	CBitmap bitmap,bitmap2;
    	bitmap.LoadBitmap(IDB_BITMAP1);
    	CPaintDC memdc(this);
    	CDC cDC;
    	cDC.CreateCompatibleDC(&memdc);
    	CBitmap* pOldBitmap2=cDC.SelectObject(&bitmap2);
    	cDC.BitBlt(0,0,100,100,&memdc,0,0,SRCCOPY);
    	CBitmap* pOldBitmap=memdc.SelectObject(&bitmap);
         BITMAP  bmp; 
          if(GetObject((HBITMAP) bitmap, sizeof(BITMAP), &bmp)) 
          { 
            BITMAPINFOHEADER BmpInfoHdr; 
         BITMAPFILEHEADER BmpFileHdr; 
             BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); 
            BmpInfoHdr.biWidth = bmp.bmWidth; 
        BmpInfoHdr.biHeight = bmp.bmHeight; 
            BmpInfoHdr.biPlanes = bmp.bmPlanes; 
        BmpInfoHdr.biBitCount = 24; 
            BmpInfoHdr.biCompression    = BI_RGB; 
             BmpInfoHdr.biSizeImage        = bmp.bmWidth*bmp.bmHeight*3; 
             BmpFileHdr.bfType        = 0x4d42; 
             BmpFileHdr.bfReserved1        = 0; 
             BmpFileHdr.bfReserved2        = 0; 
             BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof (BITMAPINFOHEADER); 
            BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage; 
            bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage); 
            if(GetDIBits(cDC, (HBITMAP) bitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits, (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight) 
            { 
                HANDLE hFile = CreateFile("WWWWWWaaaw.bmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); 
                if(hFile != INVALID_HANDLE_VALUE)  { 
                DWORD dwTmp; 
                WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL); 
                WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL); 
                WriteFile(hFile, bmp.bmBits,  BmpInfoHdr.biSizeImage,   &dwTmp, NULL); 
            }
    
            CloseHandle(hFile); 
    		} 
        GlobalFree(bmp.bmBits); 
    	memdc.SelectObject(pOldBitmap);
    	  }
    
    }
    


  • bei mir tut ers jetzt auch wunderbar, nur die diner die mittels

    dc.FillSolidRect
    

    ins dc geschrieben werden sind nicht im bitmap, sprich es ist leer...



  • Bei mir ist übrigens der (HBITMAP)-Cast immer NULL. Warum weiß ich allerdings auch nciht.

    Phips!



  • @LoopyC: Musst du nicht den Inhalt des Bitmaps mittels CDC::SetPixel beeinflussen? (MSDN CDC Bitmap-Functions)

    @Phips!: Spricht dafür, dass dein CBitmap leer ist.



  • Der Rechner blitted das Bitmap nicht in das Bitmap des zweiten DC's rein; jedenfalls nicht bei mir. Wenn man im zweiten Codepost in GetObject bitmap durch bitmap2 ersetzt, bekomme ich keine Ausgabe. Das könnte euch beiden helfen.



  • hm, ich revidiere mal...

    das bitmap wird jetzt zwar erstellt aber nicht gefüllt. wie füll ich das nun mit inhalt? 😕



  • ich habs jetzt so gelöst:

    http://people.freenet.de/cpp-programming.de.vu/quellcodes/code17.html

    und alles ist wunderbar 😃



  • Ja, die Funktion hab ich am Wochenende nach ein wenig googlen auch gefunden. Und damit klappts echt wunderbar. Hab grad vorhin nachgesehen, hier in der Forumssuche findet man den Link auch. Also hätte die Suche letzte Woche funktioniert.... 😉 😃

    Gruß,
    Phips!



  • Nochmal eine kurze Frage zum Verständnis. In dem Quelltext kommt folgende Zeile vor:

    bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
    

    Kann mir jemand diese &-Operation und das >> erklären? Ich hab versucht da durchzusteigen, bin aber kläglich gescheitert.

    Gruß,
    phips!


Anmelden zum Antworten