pData为图像数据指针,指向内存中图像数据的首地址,可以从这个地址开始读取图像数据的灰度值,然后可以再用位图的方式做显示。思路是有,但是现在如何将这个指针和位图相关部分对应起来还不是很明白。有种说法是建立一个位图,把头全部填充好,然后数据区用pData填充,这似乎是可以的。但如何执行?有什么更具体的方法么?求问呐

解决方案 »

  1.   

    是否定义了位图头后,在用StretchDIBits函数绘制图像时lpBits设置为数据地址的pData指针,lpBitsInfo指向BITMAPINFO结构的指针就行?
      

  2.   

    有个叫 CreateDIBSection 的API哦。
    会直接返回一个ppvBits,再把你的数据memcpy给它就行了。
      

  3.   

    那是先定义位图结构(包括BITMAPINFO、BITMAPFILEHEADER、BITMAPINFOHEADER等),根据这些内容用CreateDIBSection创建位图,再用memcpy将图像数据指针pData指向的数据拷贝到ppvBits指针指向的数据,再用StretchDIBits显示位图就好?大致过程是这样的么?对于位图一块不是很了解,还望解答
      

  4.   

    通过调用GetBits类似的方法得到位图数据指针,然后将先前得到的图像数据进行memcpy就ok了
      

  5.   

    BITMAPINFOHEADER bmih;
    ::ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER));
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biBitCount = 32;  
    bmih.biWidth =  nDestWidth;
    bmih.biHeight = nDestHeight * -1;
    bmih.biCompression = BI_RGB;
    bmih.biPlanes = 1;
    BYTE* lpBits = NULL;

    HBITMAP hBitmap = ::CreateDIBSection(NULL,(BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&lpBits, NULL, 0 );
    if (NULL == hBitmap || NULL == lpBits)
    return false;然后将图像数据拷贝给 lpBits.(拷贝数据时,注意你的数据格式与创建的图片格式有可能不同)
    这样这个hBitmap就能被选入HDC,再调用BitBlt或者 StretchBlt等都可以
      

  6.   

    非常感谢回答,现在的问题是图像控件能够起作用,但是没有顺利显示图像,只能看到图像控件全被黑色填充了。是哪里的值设置错误导致读取出现差错么?
       // Copy of the image structure grabbed from the SDK.
       FlyCaptureImage   m_imageRaw;//m_imageRaw.pData表示数据指针,m_imageRaw.iCols、m_imageRaw.iRows分别表示图像的列和行   // Structure used to draw to the screen.
       BITMAPINFO        m_bitmapInfo;  CDC* pDC = GetDlgItem( IDC_ShowImage ) ->GetDC();
            // 获取 HDC(设备句柄) 来进行绘图操作,获取图像控件的句柄
    HDC hDC = pDC ->GetSafeHdc();
    CRect rect;
    GetDlgItem(IDC_ShowImage) ->GetClientRect( &rect );
    // 求出图片控件的宽和高
    int rw = rect.right - rect.left;
    int rh = rect.bottom - rect.top;            ZeroMemory(&m_bitmapInfo.bmiHeader, sizeof(BITMAPINFOHEADER)); 
                m_bitmapInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); 
    m_bitmapInfo.bmiHeader.biWidth = m_imageRaw.iCols; 
    m_bitmapInfo.bmiHeader.biHeight = -m_imageRaw.iRows; 
    m_bitmapInfo.bmiHeader.biPlanes = 1; 
    m_bitmapInfo.bmiHeader.biBitCount = 1; 
    m_bitmapInfo.bmiHeader.biCompression = BI_RGB;
    m_bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
    m_bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
    m_bitmapInfo.bmiHeader.biClrImportant  = 0;
    m_bitmapInfo.bmiHeader.biClrUsed = 0;
    m_bitmapInfo.bmiHeader.biSizeImage= 0;//m_bitmapInfo.bmiHeader.biWidth * 
    //m_bitmapInfo.bmiHeader.biHeight * ( m_bitmapInfo.bmiHeader.biBitCount / 8 ); BYTE * lpBits=NULL ;
    HBITMAP hBitmap=::CreateDIBSection(NULL,(BITMAPINFO *)&m_bitmapInfo.bmiHeader,
    DIB_RGB_COLORS,(void**)&lpBits,NULL,0) ;
    memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows));
    StretchDIBits(hDC,
    0,
    0,
    rw,
    rh,
    0,
    0,
    m_imageRaw.iCols,
    m_imageRaw.iRows,
    lpBits,
    &m_bitmapInfo,
    DIB_RGB_COLORS,
    SRCCOPY);
      

  7.   

    memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows)); 
    这里面不止宽*高, 一个像素可是 4 个字节哟(如果是32位图片的话)
      

  8.   

    上一段我的保存BMP代码,希望对楼主有帮助 int temBgBitmapX = NewBgBitmapX / 10 * 10;
    int temBgBitmapY = NewBgBitmapY / 10 * 10; //定义图形大小
    int iWidth = temBgBitmapX;
    int iHeight = temBgBitmapY;
    int iPixel = 16;
    //图形格式参数
    LPBITMAPINFO lpbmih = new BITMAPINFO;
    lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmih->bmiHeader.biWidth = iWidth;
    lpbmih->bmiHeader.biHeight = iHeight;
    lpbmih->bmiHeader.biPlanes = 1;
    lpbmih->bmiHeader.biBitCount = iPixel;
    lpbmih->bmiHeader.biCompression = BI_RGB;
    lpbmih->bmiHeader.biSizeImage = 0;
    lpbmih->bmiHeader.biXPelsPerMeter = 0;
    lpbmih->bmiHeader.biYPelsPerMeter = 0;
    lpbmih->bmiHeader.biClrUsed = 0;
    lpbmih->bmiHeader.biClrImportant = 0;

    //创建位图数据
    HDC hdc,hdcMem;
    HBITMAP hBitMap = NULL;
    CBitmap *pBitMap = NULL;      
    CDC *pMemDC = NULL;
    BYTE *pBits;

    hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
    hdcMem = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    pBitMap = new CBitmap;
    pBitMap->Attach(hBitMap);
    pMemDC = new CDC;
    pMemDC->Attach(hdcMem);
    pMemDC->SelectObject(pBitMap); CRect rc(0,0,iWidth,iHeight);
    pMemDC->SetBkMode(TRANSPARENT);
    //画出所要图像 
    DrawGIS(pMemDC,rc);
    //保存到文件并创建位图结构
    BITMAPFILEHEADER bmfh;
    ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    *((char *)&bmfh.bfType) = 'B';
    *(((char *)&bmfh.bfType) + 1) = 'M';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
    TCHAR szBMPFileName[128];
    int iBMPBytes = iWidth * iHeight * iPixel / 8; CString save_path;
    save_path = hFileDlg.GetPathName();
    strcpy(szBMPFileName,save_path);
    CFile file;
    if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
    {
    BeginWaitCursor();
    file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
    file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
    file.Write(pBits,iBMPBytes);
    file.Close();
    EndWaitCursor();
    }

    pMemDC->DeleteDC();
    delete pMemDC; pMemDC = NULL;
    delete pBitMap; pBitMap = NULL;
    delete lpbmih; lpbmih = NULL; AfxMessageBox("保存成功!!!");

    pBits就是要被拷贝的指针对象
      

  9.   


    那是你stretchblt参数填的不好