首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

使用内存映射显示BMP图片文件有关问题!来下

2012-03-17 
使用内存映射显示BMP图片文件问题!高手进来下!C/C++ codevoid CMainWindow::OnFileOpen()// 用户点击打开

使用内存映射显示BMP图片文件问题!高手进来下!

C/C++ code
void CMainWindow::OnFileOpen()        // 用户点击打开菜单命令时{    CFileDialog file(TRUE);    if(!file.DoModal())        return;            // 下面是映射BMP文件到内存的过程    // 打开要映射的文件    HANDLE hFile = ::CreateFile(file.GetFileName(), GENERIC_READ,         FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);        if(hFile == INVALID_HANDLE_VALUE)    {        MessageBox("读取文件出错!");                return;    }    // 创建内存映射对象    HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, NULL, NULL, NULL);    // 映射整个BMP文件到内存,返回这块内存的首地址    LPVOID lpBase = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);        // 下面是获取BMP文件信息的过程    BITMAPFILEHEADER *pFileHeader;        // bitmap file-header    BITMAPINFO *pInfoHeader;        // bitmap info-header    // 取得file-header指针,以获得位图象素    pFileHeader = (BITMAPFILEHEADER*)lpBase;    if(pFileHeader->bfType != MAKEWORD('B', 'M'))    {        MessageBox("本程序仅读取BMP文件!");        ::UnmapViewOfFile(lpBase);        ::CloseHandle(hMap);        ::CloseHandle(hFile);        return;    }    BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits;    // 取得info-header指针,以获得文件的大小    pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER));    m_nHeight = pInfoHeader->bmiHeader.biHeight;    m_nWidth = pInfoHeader->bmiHeader.biWidth;        // 下面是显示BMP文件到内存设备的过程    CClientDC dc(this);    // 创建一个与指定DC兼容的未初始化的位图,选入到内存兼容DC中    HBITMAP hBitmap = ::CreateCompatibleBitmap(dc, m_nWidth, m_nHeight);    ::SelectObject(m_hMemDC, hBitmap);    // 把象图像据放到建立的设备中    int nRet = ::SetDIBitsToDevice(m_hMemDC,        0,            // xDest        0,            // yDest        m_nWidth,        m_nHeight,        0,            // xSrc        0,            // ySrc        0,            // uStartScan  开始复制的扫描线和要复制的扫描线数        m_nHeight,        // cScanLines        pBits,            // lpvBits 指向DIB中的象素数据部分        pInfoHeader,        // lpbmi 指向BITMAPINFO结构        DIB_RGB_COLORS);    // fuColorUse 指定了DIB中数据的类型    ::InvalidateRect(m_hWnd, NULL, TRUE);    ::DeleteObject(hBitmap);    ::UnmapViewOfFile(lpBase);    ::CloseHandle(hMap);    ::CloseHandle(hFile);}


这只是部分代码!下面两句代码是什么意思呢?看了上面的解释老半天看不明白!
lpBase不是映射文件的首地址内存吗?那为什么还要加上pFileHeader->bfOffBits呢

BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits;

pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER));

明白的朋友说下,关注的朋友顶下!



[解决办法]
bfOffBits偏移量啊 意思就是图片数据从首地址开始到偏移量的位置结束 后边的那个同样取得首地址 然后取得结构体的大小进行数据的填充
[解决办法]
探讨
引用:
bfOffBits偏移量啊 意思就是图片数据从首地址开始到偏移量的位置结束 后边的那个同样取得首地址 然后取得结构体的大小进行数据的填充

BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits
这代码的意思就是使pBits指向了图片数据的开始位置!这样理解对吗?

热点排行