挺着急的 初学vc能力有限 请教关于DIB位图的问题 读入一个24位位图文件 找到这个文件图像数据区域 然后和已经放在内存中的另一个图像进行比较(按位比较),我用的dib类中ReadDIBFile函数 然后该怎么做才能获得指向图像数据的指针 已经存放在内存的指针为byte * 类型 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;} 再问得详细点 我很菜最后的m_pBits 是指向位图的数据的指针么? 它石什么类型的指针?是不是可以直接通过指针找到每个点的数据 LPBYTE m_pBits;//位图像素数据是的,就是指向RGB的值不过用的时候注意,bmp数据是倒过来的 为什么I/O多路复用属于并发服务器模型呢? 求助多线程操作vector时迭代器失效 求购围棋游戏的源代码,,(在线等) CXTOutlookBar类的问题,用过这个的来帮帮忙.谢 急!如何卸载COM控件? 怎样初始化ToolBar上Button的状态? 菜鸟问个问题,希望大牛帮个忙 急!为何不能写入?? 注册表项枚举问题,请教。 大家知道为什么这么多人问“屏幕取词”吗? 急问!一个自动化传递参数的问题! 多个组件使用相同的自定义结构体,怎么办?
{
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;
}
最后的m_pBits 是指向位图的数据的指针么? 它石什么类型的指针?
是不是可以直接通过指针找到每个点的数据
是的,就是指向RGB的值不过用的时候注意,bmp数据是倒过来的