要求能够封装成这种形式
//bmp图像大小为50*50
void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
{
    //.......................   
}输入位图句柄hBitmap 输出存放这图片所有像素的像素值嗯.代码是程序员交流思想最好的方法..
呵呵希望那位高人给出点实现代码

解决方案 »

  1.   

    void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
    {
        //.......................   
      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);
      
    }
      

  2.   

    50*50的用GetPixel还没什么,要是500*500 汉死你!
      

  3.   

    感谢breakind的建议 ,只是我水平太次了.完成不了"转化成256色图,然后获取指向图像数据的指针"
    如果你方便的话,能不能贴点代码出来~~嗯,oysoft大哥的方法我也有想过,只是出于效率方面的考虑,最终放弃了
      

  4.   

    int GetBitmap( BITMAP* pBitMap );
    该函数用来获得与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中的数据吗?
      

  5.   

    理论上应该可以,
    二楼的说法有点不对,
    要求能够封装成这种形式
    //bmp图像大小为50*50
    void BmpMapToMatrix(HBITMAP hBitmap,int Matrix[50][50])
    {
    //.......................
    }
    显然是24位的图,你怎么说成是256色的图?
    你用google搜“数字图像处理入门”就可以找到你的答案了,带代码带例子的。
      

  6.   

    BOOL CReadDoc::OnOpenDocument(LPCTSTR lpszPathName) 
    {
        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());
    就可以了
      

  7.   

    汗楼上的....
    这样吧,我用GDI+写了一个关于提取位图数据的方法,你去我BLOG上去看吧
      

  8.   

    greenfields 大哥谢谢你的代码.不过我不是想打开BMP图片来显示等的界面编程   呵呵breakind大哥,我是用VC6(API...不MFC)对GDI+我有很多东西都看不懂啊..哎
    都怪我功底太差了其实我要完成的工作也不是太复杂
    就是想核实下这张图片是不是出自另一张图片(两张图片都没经过任何变换)这才想出要读取两张图片像素值来进行匹配的点子,本来我对图像处理就不怎么了解(一般只图图界面)看来要走的路还有很长
    今天找了个BMP文件格式分析的文档来看(东西多得我头大吖~)
    我想int GetBitmap( BITMAP* pBitMap )这个函数应该能帮我解决问题学习ing
      

  9.   

    我每天都要上csdn看看.以前都没怎么提问.遇到什么问题都是自己找书或上网查,然后自个解决.觉得别人肯定不会帮我的(一切都得靠自己)呵呵
    看来我错了
    breakind多次给我指导,这世界上还是有热心的人啊
    虽然这个问题还没解决,但breakind让我活起来了.
    谢谢breakind