我从别人的软件里看到有个文件,他自定义了扩展名的。不过我知道头几个字节是他自定义的内容,然后就是BM文件格式了,我想知道怎么动态读入内存生成BMP对象,谢谢了 

解决方案 »

  1.   

    读取前几个字节后跟读普通位图一样啊,申请空间,将后半段读入,然后用BitBlt显示即可
      

  2.   

    简单封装一个位图类,用于从文件中加载位图文件
    class CDIB
    {
    private:

    int m_nWidth;
    int m_nHeight;
    int m_nBitCount;
    int m_nPaletteSize;

    BYTE* m_lpBitmap;
    BYTE* m_lpBits;
    BITMAPINFOHEADER* m_lpBMPHdr;
    RGBQUAD* m_lpPalette;
    BOOL LoadDib(BYTE* lpDib);
    public:
    CDIB();
    ~CDIB();
    void Clear();
    BYTE* GetBits(){return m_lpBits;};
    BOOL IsEmpty(){return !m_lpBits;}
    BOOL LoadFromFile(CFile *pf);
    BOOL LoadFromFile(LPCTSTR filename);
    }CDIB::CDIB()
    {
    m_lpBitmap=NULL;
    m_lpBits=NULL;
    m_lpPalette=NULL;
    m_lpBMPHdr=NULL;
    m_nWidth=m_nHeight=0;
    m_nBitCount=0;
    }CDIB::~CDIB()
    {
    Clear();
    }
    void CDIB::Clear()
    {
    if (m_lpBitmap) delete[] m_lpBits;
    m_sErr="";
    m_lpBits=NULL;
    m_lpBMPHdr=NULL;
    m_lpPalette=NULL;
    m_nWidth=m_nHeight=0;
    m_nBitCount=0;
    }BOOL CDIB::LoadFromFile(LPCTSTR filename)
    {
    CFile f;
    if (!f.Open(filename,CFile::modeRead)) return FALSE;
    BOOL r=LoadFromFile(&f);
    f.Close();
    return r;
    }
    BOOL CDIB::LoadFromFile(CFile *pf)
    {
    BYTE* lpDib;
    BITMAPFILEHEADER* pFileHdr=NULL;
    int nLen;
    nLen=pf->GetLength();
    m_lpBitmap=new BYTE[nLen];
    pf->Read(m_lpBitmap,nLen);
    pFileHdr=(BITMAPFILEHEADER*)m_lpBitmap;
    if(pFileHdr->bfSize!=nLen)
    {
    delete[] m_lpBitmap;
    m_lpBitmap=NULL;
    return FALSE;;
    }
    if (m_lpBitmap[0]!='B'&&m_lpBitmap[1]!='M')
    {
    delete[] m_lpBitmap;
    m_lpBitmap=NULL;
    return FALSE;
    }
    lpDib=m_lpBitmap+sizeof(BITMAPFILEHEADER);
    m_lpBMPHdr=(BITMAPINFOHEADER*)(lpDib);
    BOOL ret=LoadDib(lpDib);
    return ret;
    }
    BOOL CDIB::LoadDib(BYTE *lpDib)
    {
    BYTE *lpBits;
    BITMAPINFOHEADER *pInfo;
    int nWidth,nHeight,nBitCount,nByteWidth;
    RGBQUAD *pPalette;
    unsigned int PaletteSize; pInfo=(BITMAPINFOHEADER *)lpDib;//取出位图文件信息,位图第二部分数据
    lpBits=lpDib+sizeof(BITMAPINFOHEADER); nWidth=pInfo->biWidth;
    nHeight=pInfo->biHeight;
    nBitCount=pInfo->biBitCount;
    nByteWidth=BYTE_PER_LINE(nWidth,nBitCount);
    switch (nBitCount)
    {
    case 24:
    m_lpPalette=NULL;
    m_nPaletteSize=0;
    m_lpBits=lpBits;
    break;
    case 8:
    case 4:
    case 1:
    m_nPaletteSize=PaletteSize=1<<pInfo->biBitCount;
    if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed;
    pPalette=(RGBQUAD *)lpBits;
    lpBits+=sizeof(RGBQUAD)*PaletteSize;//根据调色板个数定位位图数据段的指针位置
    m_lpPalette=pPalette;
    m_lpBits=lpBits;
    break;
    default:
    m_sErr="无效位图";
    return FALSE;
    }
    m_nBitCount=nBitCount;
    m_nWidth=nWidth;
    m_nHeight=nHeight;
    return TRUE;
    }