问一问:一般图像的象素值是如何在内存中存放的?我们现在已经知道数据存放地址的头指针,但是不大清楚内部数据结构,所以想问问如何取一段内存的数据并返回一个二维矩阵存放图像的象素值?
谢谢各位大哥

解决方案 »

  1.   

    是位图吗
    给你一个连接,上面有文档和源码
    位图文件读写
    http://www.vckbase.com/document/viewdoc/?id=674#A11
      

  2.   

    用GetDIBits就是了int GetDIBits(
      HDC hdc,           // handle to DC
      HBITMAP hbmp,      // handle to bitmap
      UINT uStartScan,   // first scan line to set
      UINT cScanLines,   // number of scan lines to copy
      LPVOID lpvBits,    // array for bitmap bits
      LPBITMAPINFO lpbi, // bitmap data buffer
      UINT uUsage        // RGB or palette index
    );
      

  3.   

    你想在内存中操作图片,我举一个操作位图的例子希望对你有帮助。
    一般情况下是使用bitBlt函数来处理的,比如我要按宽度来获取图片一列象素点值
    for (int i=0; i<width /*图片宽度*/; i++)
    {
       pDC->BitBlt(i /*目标x坐标*/, 0 /*目标y坐标*/, 1 /*宽*/,height /*高*/,
                   &mendc /*存有图片的设备*/, i /*源x坐标*/, 0 /*源y坐标*/,
                   SRCCOPY /*拷贝操作*/); 
    }
    一般位图的象素结构大小与颜色值有关系,比如16色的图片,一个象素点用16位来表示有565,或555第一位为透明值。所以你如果要直接获取的话你要先知道图片的颜色格式。按行扫描的方式来获取!
      

  4.   

    读入位图的位数据    CString m_LoadBmpName;
    static char szFilter[] = "位图文件 (*.bmp;*.dib)|*.bmp;*.dib|All Files (*.*)|*.*||";
    CFileDialog dlg(TRUE,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
    if(dlg.DoModal() == IDOK)
    {
    UpdateData(TRUE);
    m_LoadBmpName = dlg.GetPathName();
    }
    BeginWaitCursor(); CFile file;
    if(!file.Open(m_LoadBmpName,CFile::modeRead))
    {
    TRACE0("Can't Open DIB File..\n");
            EndWaitCursor();
    return;
    }
    DWORD dwFileStart = file.GetPosition();
    BITMAPFILEHEADER bmfh;
    int nBytes;
    nBytes = file.Read(&bmfh,sizeof(BITMAPFILEHEADER));
    if(nBytes != sizeof(bmfh))
    {
    TRACE0("Failed To Read File Header..\n");
            EndWaitCursor();
    return;
    }
    if(bmfh.bfType != 0x4d42)
    {
    TRACE0("It's Not A DIB File..");
            EndWaitCursor();
    return;
    }
             int nBitsSize = bmfh.bfSize - bmfh.bfOffBits;
    BYTE *pBits = (BYTE *)malloc(nBitsSize);     //申请内存块
    if(!pBits)
    {
    TRACE0("Out of Memory For DIB Bits..\n");
            EndWaitCursor();
    return;
    }
    file.Seek(dwFileStart + bmfh.bfOffBits,CFile::begin); //jump到位数据地址
    nBytes = file.Read(pBits,nBitsSize);   //读入pBits的就是位图位数据了
    file.Close();
    if(nBytes != nBitsSize)
    {
    TRACE0("Failed To Read Bits..\n");
    free(pBits);
            EndWaitCursor();
        return;
    }
            .....................  //其它代码
            .....................