要求能够封装成这种形式
//bmp图像大小为50*50
void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
{
//.......................
}输入位图句柄hBitmap 输出存放这图片所有像素的像素值嗯.代码是程序员交流思想最好的方法..
呵呵希望那位高人给出点实现代码
//bmp图像大小为50*50
void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
{
//.......................
}输入位图句柄hBitmap 输出存放这图片所有像素的像素值嗯.代码是程序员交流思想最好的方法..
呵呵希望那位高人给出点实现代码
{
//.......................
CBitmap *pBitmap = new CBitmap;
pBitmap->Attach(hBitmap);
CDC dc;
CDC *pDC=GetDC();
bmp.CreateCompatibleBitmap(pDC, 50, 50); //用于GetPixel之用
dc.CreateCompatibleDC(pDC); //用于GetPixel之用
dc.SelectObject(&bmp); //用于GetPixel之用
for(int j=0;j<50;j++)
for(int i=0;i++;i++)
{
Matrix[i][j]=(int)pDC->GetPixel(i,j);
}
ReleaseDc(&dc);
}
如果你方便的话,能不能贴点代码出来~~嗯,oysoft大哥的方法我也有想过,只是出于效率方面的考虑,最终放弃了
该函数用来获得与DDB有关的信息,参数pBitMap指向一个BITMAP结构。BITMAP结构的定义为:typedef struct tagBITMAP { LONG bmType; //必需为0LONG bmWidth; //位图的宽度(以像素为单位)LONG bmHeight; //位图的高度(以像素为单位)LONG bmWidthBytes; //每一扫描行所需的字节数,应是偶数WORD bmPlanes; //色平面数WORD bmBitsPixel; //色平面的颜色位数LPVOID bmBits; //指向存储像素阵列的数组} BITMAP;这是GetBitmap函数的原形以及BITMAP结构的定义了只是我心里还不明白
假如我有两张图片a.bmp和b.bmp
其中a.bmp是从b.bmp中截取出来的(都没有经过任何处理)
那么我可以
b.bmp 的所指向的LPVOID bmBits; //指向存储像素阵列的数组
中找到a.bmp中的数据吗?
二楼的说法有点不对,
要求能够封装成这种形式
//bmp图像大小为50*50
void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
{
//.......................
}
显然是24位的图,你怎么说成是256色的图?
你用google搜“数字图像处理入门”就可以找到你的答案了,带代码带例子的。
{
CFile file;
CFileException fe; // 打开文件
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
// 失败
ReportSaveLoadException(lpszPathName, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 返回FALSE
return FALSE;
}
DeleteContents();
// 更改光标形状
BeginWaitCursor();
// 尝试调用ReadDIBFile()读取图像
TRY
{
m_hDIB = ::ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
// 读取失败
file.Abort();
// 恢复光标形状
EndWaitCursor();
// 报告失败
ReportSaveLoadException(lpszPathName, eLoad,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 设置DIB为空
m_hDIB = NULL;
// 返回FALSE
return FALSE;
}
END_CATCH
// 初始化DIB
InitDIBData();
// 恢复光标形状
EndWaitCursor();
// 判断读取文件是否成功
if (m_hDIB == NULL)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
return FALSE;
}
// 设置文件名称
SetPathName(lpszPathName);
// 初始化胀标记为FALSE
SetModifiedFlag(FALSE);
// 返回TRUE
return TRUE;
}然后在程序调用时
LPSTR lpDIB; //指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
就可以了
这样吧,我用GDI+写了一个关于提取位图数据的方法,你去我BLOG上去看吧
都怪我功底太差了其实我要完成的工作也不是太复杂
就是想核实下这张图片是不是出自另一张图片(两张图片都没经过任何变换)这才想出要读取两张图片像素值来进行匹配的点子,本来我对图像处理就不怎么了解(一般只图图界面)看来要走的路还有很长
今天找了个BMP文件格式分析的文档来看(东西多得我头大吖~)
我想int GetBitmap( BITMAP* pBitMap )这个函数应该能帮我解决问题学习ing
看来我错了
breakind多次给我指导,这世界上还是有热心的人啊
虽然这个问题还没解决,但breakind让我活起来了.
谢谢breakind