读入一个24位位图文件 找到这个文件图像数据区域 然后和已经放在内存中的另一个图像进行比较(按位比较),我用的dib类中ReadDIBFile函数 然后该怎么做才能获得指向图像数据的指针  已经存放在内存的指针为byte * 类型 

解决方案 »

  1.   

    BOOL CDib::LoadBmp(const char* pszDibFileName)
    {
    Free();

    BITMAPFILEHEADER bmfHeader; CFile file;
    CFileException fe;
    //以读取、写独占形式打开位图
    if (!file.Open(pszDibFileName, CFile::modeRead | CFile::shareDenyWrite, &fe))
    return FALSE; try
    {
    //读入位图文件头信息
    if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
    return FALSE;
    }
    catch(CFileException* e)
    {
    e->Delete();
    } //判断是否是位图文件
    if (bmfHeader.bfType != DIB_HEADER_MARKER)
    return FALSE;

    // Allocate memory for DIB
    //分配内存
    m_pBMI = (LPBITMAPINFO)GlobalAllocPtr(GHND, bmfHeader.bfOffBits-sizeof(BITMAPFILEHEADER) + 256*sizeof(RGBQUAD));
    if (m_pBMI == 0)
    return FALSE; DWORD dwLength = file.GetLength();
    // Go read the bits.
    //分配内存
    m_pDibData = (LPBYTE)GlobalAllocPtr(GHND, dwLength - 14);//bmfHeader.bfOffBits);
    if (m_pDibData == 0)
    {
    // GlobalFreePtr(m_pBMI);
    m_pBMI = NULL;
    return FALSE;
    }
    //从文件读出到m_pBits指向的内存中
    if (file.ReadHuge(m_pDibData, dwLength-14) != (dwLength - 14))
    {
    GlobalFreePtr(m_pBMI);
    m_pBMI = NULL;
    GlobalFreePtr(m_pDibData);
    m_pDibData = NULL;
    return FALSE;
    } //将头信息读到m_pBMI
    m_pBMI=(LPBITMAPINFO)m_pDibData;
    //获取位图文件头指针和位图文件数据信息指针
    m_pBitmapInfoHeader = (BITMAPINFOHEADER*) m_pBMI;
    //宽度和高度
    m_nWidth = m_pBitmapInfoHeader->biWidth;
    m_nHeight = m_pBitmapInfoHeader->biHeight;
    //每像素的颜色位数
    m_nBitCount = (BYTE)m_pBitmapInfoHeader->biBitCount; //颜色数:
    m_nTotalColors = GetColorNumber();
        if (m_pBitmapInfoHeader->biClrUsed == 0)
            m_pBitmapInfoHeader->biClrUsed = m_nTotalColors;
        
    ///////////////////////////////////////////////////////////////////////////////
    int test=bmfHeader.bfOffBits;
    //指向位图数据的指针
    if(bmfHeader.bfOffBits > m_pBitmapInfoHeader->biSize + sizeof(bmfHeader))
    {
    //指向位图颜色索引表项的指针, 如果没有颜色表项, 则该值为NULL
    m_pRGBQuad = (RGBQUAD*)(m_pDibData + m_pBitmapInfoHeader->biSize); //颜色索引表的大小(字节)
    DWORD dwColorTableSize = m_nTotalColors * sizeof(RGBQUAD); m_pBits = m_pDibData + bmfHeader.bfOffBits - sizeof(bmfHeader);
    }
    else
    {
    m_pBits = m_pDibData + m_pBitmapInfoHeader->biSize ;
    } m_bValid=TRUE;
    //位图的大小(面积像素单位)
    m_pBitmapInfoHeader->biSizeImage = GetSize();
    //////////////////////////////////////////////////////////////////////////////// CreatePalette();
    return TRUE;
    }
      

  2.   

    再问得详细点 我很菜
    最后的m_pBits 是指向位图的数据的指针么? 它石什么类型的指针?
    是不是可以直接通过指针找到每个点的数据
      

  3.   

    LPBYTE m_pBits;//位图像素数据
    是的,就是指向RGB的值不过用的时候注意,bmp数据是倒过来的