Bitmaps und Ihre Speicherung (VC60)



  • Hi,
    folgender Code für das Speichern eines DC's in ein File nach dem er verändert wurde:
    Das Problem bei dieser Funktion ist dass sich eine beliebige Bitmap zwar speichern lässt . Grösse wird gespeichert aber die Bitmap wird dann Schwarz.
    Ich glaube daß bei der Farbzuordnung etwas schiefgeht aber bin mir nicht sicher .
    Wäre dankbar wenn mir dazu jemand helfen könnte.

    BOOL CPicture::DCtoBitmap(HDC hDC, CPoint position,int width,int height,CString filename)
    {
    
        HDC              hdc2;
        HBITMAP          aBmp;
        BITMAPINFO       bi;
        HGDIOBJ          OldObj;
        void             *dibvalues;
        HANDLE           fileHandle;
        BITMAPFILEHEADER bmfh;
        BITMAPINFOHEADER bmih;
        DWORD            bytes_write;
        DWORD            bytes_written;
    
        hdc2=CreateCompatibleDC(hDC);
        ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
        bmih.biSize=sizeof(BITMAPINFOHEADER);
          bmih.biHeight=height;
            bmih.biWidth=width;
            bmih.biPlanes=1;
            bmih.biBitCount=24;
        bmih.biCompression=BI_RGB;
        bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; 
            bmih.biXPelsPerMeter = 0;
            bmih.biYPelsPerMeter = 0;
            bmih.biClrImportant = 0;
    
        bi.bmiHeader=bmih;
        aBmp=CreateDIBSection(hDC,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,0);
        if (aBmp==NULL)
            return 0;
    
        OldObj=SelectObject(hdc2,aBmp);
        //BitBlt(hdc2,0,0,width,height,hDC,0,0,SRCCOPY);
        BitBlt(hdc2,position.x,position.y,width,height,hDC,0,0,SRCCOPY);//Nur zum Test
        ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
        bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
            bmfh.bfType=0x4d42;
            bmfh.bfReserved1 = 0;
            bmfh.bfReserved2 = 0;
        fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL,
                                                        CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
    
         if (fileHandle==INVALID_HANDLE_VALUE)
            return 0;
        // Write the BITMAPFILEHEADER
        bytes_write=sizeof(BITMAPFILEHEADER);
        if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL))
            return 0;
    
        //Write the BITMAPINFOHEADER
        bytes_write=sizeof(BITMAPINFOHEADER);
        if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL))
            return 0;
    
        bytes_write=bmih.biSizeImage;
        if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL))
            return 0;
    
        CloseHandle(fileHandle);
        DeleteObject(SelectObject(hdc2,OldObj));
        DeleteDC(hdc2);
        return 1;
    
    }
    

Anmelden zum Antworten