http://www.codeguru.com/bitmap/bitmap_to_file.shtml
http://www.codeguru.com/bitmap/window_to_file.shtml
http://www.codeguru.com/bitmap/pixel_access.shtml

解决方案 »

  1.   

    位图的头信息里能得到biBitCount他记录了你的位图文件到底是几位的(通常是1,8,24,32),然后你定义一个BYTE类型的指针,指向数据,看位图是几位就读几/8次,读三次不就读出了24位了么!
      

  2.   

    之所以是32BIT,是因为那是为了适应COLORREF或RGBQUAD类型。
    其中只有三位用来存储RGB三种颜色。你可以用把它强制的付给RGBQUAD的变量。
    就可以轻松的获得RGB三种颜色了。
      

  3.   

    任意Bit的位图都有规定的文件格式,找到数据区以后将文件格式的信息填好就可以存档了,这里不可能说的很清楚,你还是去看Charles Petzold著的
    《Windows 程序设计》的第十五章吧!
      

  4.   

    了解位图结构就可以了
    BOOL SaveDIB(HDIB hDib, LPCTSTR lpFileName) 

        BITMAPFILEHEADER    bmfHdr;    
        LPBITMAPINFOHEADER  lpBI;       
        HANDLE              fh;         
        DWORD               dwDIBSize; 
        DWORD               dwWritten;
        if (!hDib) 
            return FALSE;  
        fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 
        if (fh == INVALID_HANDLE_VALUE) 
            return FALSE;    
        lpBI = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
        if (!lpBI) 
        { 
            CloseHandle(fh); 
            return FALSE; 
        } 
        if (lpBI->biSize != sizeof(BITMAPINFOHEADER)) 
        { 
            GlobalUnlock(hDib); 
            CloseHandle(fh); 
            return FALSE; 
        }  
        bmfHdr.bfType = DIB_HEADER_MARKER;   
        dwDIBSize = *(LPDWORD)lpBI + PaletteSize((LPBYTE)lpBI);   
        if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4)) 
            dwDIBSize += lpBI->biSizeImage; 
        else 
        { 
            DWORD dwBmBitsSize; 
            dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * 
                    lpBI->biHeight; 
             dwDIBSize += dwBmBitsSize; 
             lpBI->biSizeImage = dwBmBitsSize; 
        }   
        bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER); 
        bmfHdr.bfReserved1 = 0; 
        bmfHdr.bfReserved2 = 0; 
        bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + 
                PaletteSize((LPBYTE)lpBI);      
        WriteFile(fh, (LPBYTE)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
        WriteFile(fh, (LPBYTE)lpBI, dwDIBSize, &dwWritten, NULL); 
        GlobalUnlock(hDib); 
        CloseHandle(fh); 
        if (dwWritten == 0) 
            return FALSE;
        else 
            return TRUE; 
    }