我在内存区域里有象素数据,(不是bmp文件)。我把象素值映射到0~255范围内。没有头信息和调色板。所以用Dib显示不出来。可是我现在想看一下我对数据处理的结果。怎么才能看到象素数据对应的灰度图哪?

解决方案 »

  1.   

    如果你只是调试用,可以考虑这个函数:
    CDC::SetPixel 
    比较慢。
      

  2.   

    想要运行快的话
    分配一块内存得到指针,
    自己根据你要的数据设定文件信息头,位图信息头,调色板。
    然后将你的内存区域里有象素数据转化为相应的位图数据,注意宽度字节对齐。
    再调用CreateDIBitmap
      

  3.   

    比较简单但低效的方法:
    调用
    BYTE* ColorBuf; //你的颜色缓冲区
    int w; //你的宽度
    int h; //你的高度
    for (int i=0; i<h; i++)
    {
      for (int j=0; j<w; j++)
      {
        int c = ColorBuf[i*w + j];
        SetPixel(hDC, j, i, RGB(c,c,c));
      }
    }比较复杂但高效的方法:
    构造一个int StretchDIBits();需要的BITMAPINFO, lpBits参数;
    typedef struct tagBITMAPINFO { 
      BITMAPINFOHEADER bmiHeader; 
      RGBQUAD          bmiColors[256]; 
    } BITMAPINFO, *PBITMAPINFO;其中bmiColors[i].rgbRed = bmiColors[i].rgbBlue = bmiColors[i].rgbGreen = i;lpBits就是你的颜色缓冲区
      

  4.   

    设个较小的w和h再bit出来看看嘛。大了也没关系,只是多出来的是黑的罢了。
      

  5.   

    你要多详细,莫非要从WinMain()写起。
      

  6.   

    先填一个BITMAPINFOHEADER,这个较简单,
    bmpi.biHeight=rect.Height();
    bmpi.biWidth=rect.Width();
    bmpi.biBitCount=24;
    bmpi.biCompression=BI_RGB;
    bmpi.biSize=sizeof(bmpi);
    bmpi.biPlanes=1;再CreateDIBitmap,应为你已有了hDib,第四个参数直接(LPVOID)hDib就行了。
      

  7.   

    bmpi.biHeight=20;
    bmpi.biWidth=20;
      

  8.   

    知道Height和Width。我知道能显示,就是没有试出来。最好是具体一些。
      

  9.   

    一个笨方法,将内存中的图象转成24位真彩色
    再自己建一个bmp的文件头,就搞定了。
      

  10.   

    bmp=::CreateDIBitmap(hSrcDC,&bmi,CBM_INIT,pDIB,&bmi,DIB_RGB_COLORS);
      

  11.   

    下面是我定义的一个显示象素数据的一个api函数。
    所有的功能都应该在这里实现,然后在onDraw中调用这个函数即可。谢谢/////////////////////////////////////////////////////////
    ///参数:
    ///HDC hDC             输出设备DC
    ///LPRECT lpDCRect     绘制矩形区域
    ///LPSTR  lpDCMBits    指向DCM对象象素的指针
    ///LPRECT lpDCMRect    要输出的DCM区域
    ///
    /// 返回 BOOL值
    /////////////////////////////////////////////////////////BOOL WINAPI PaintDCM(HDC hDC,
     LPRECT lpDCRect,
     LPSTR    lpDCMBits,
     LPRECT  lpDCMRect)
    {
    //LPSTR lpDCMBits;  //指向象素指针
    BOOL bSuccess=FALSE; //成功标志//定义一个调色板
    typedef struct tagRGBQUAD{
    BYTE  rgbBlue;
    BYTE  rgbGreen;
    BYTE  rgbRed;
    BYTE  rgbReserved;
    } RGBQUAD; //构造一个位图头信息结构
      typedef struct tagBITMAPINFO
      { 
         BITMAPINFOHEADER bmiHeader; 
         RGBQUAD          bmiColors[256]; 
      } BITMAPINFO, *PBITMAPINFO;   /*/初始化颜色表
      for(int i=0;i<256;i++)
      {
       bmiColors[i].rgbRed = bmiColors[i].rgbBlue = bmiColors[i].rgbGreen = i;
      }
      */
           //锁定DCM
    //lpDCMBits = (LPSTR)::GlobalLock((HGLOBAL) hDCM);
    //设置显示模式
    ::SetStretchBltMode(hDC,COLORONCOLOR); //判断是调用StretchDIBits() 还是 SetDIBitsToDevice()来绘制对象
    if((RECTWIDTH(lpDCRect) == RECTWIDTH(lpDCMRect)) &&
    (RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDCMRect)))
    {
    bSuccess=::SetDIBitsToDevice(hDC,
    lpDCRect->left,
    lpDCRect->top,
    RECTWIDTH(lpDCRect),
    RECTHEIGHT(lpDCRect),
    lpDCMRect->left,
    512,
    0,
    512,
                lpDCMBits,
    NULL,
    DIB_RGB_COLORS);
    }
    else
    {
    bSuccess=::StretchDIBits(hDC,
                         lpDCRect->left,
     lpDCRect->top,
     RECTWIDTH(lpDCRect),
     RECTHEIGHT(lpDCRect),
     lpDCMRect->left,
     lpDCMRect->top,
     RECTWIDTH(lpDCMRect),
     RECTHEIGHT(lpDCMRect),
     lpDCMBits,
     NULL,
     DIB_RGB_COLORS,
     SRCCOPY);
    }
    // ::GlobalUnlock((HGLOBAL) hDCM);
     
    return bSuccess;
    }
      

  12.   

    我是参考Dib函数做的。我把参照的函数贴出来。各位帮我看看谢谢,
    这个函数是可以执行的。
    BOOL WINAPI PaintDIB(HDC     hDC,
                   LPRECT  lpDCRect,
    HDIB    hDIB,
    LPRECT  lpDIBRect,
    CPalette* pPal)
    {
    LPSTR    lpDIBHdr;            // BITMAPINFOHEADER指针
    LPSTR    lpDIBBits;           // DIB象素指针
    BOOL     bSuccess=FALSE;      // 成功标志
    HPALETTE hPal=NULL;           // DIB调色板
    HPALETTE hOldPal=NULL;        // 以前的调色板 // 判断DIB对象是否为空
    if (hDIB == NULL)
    {
    // 返回
    return FALSE;
    } // 锁定DIB
    lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIBHdr); // 获取DIB调色板,并选中它
    if (pPal != NULL)
    {
    hPal = (HPALETTE) pPal->m_hObject; // 选中调色板
    hOldPal = ::SelectPalette(hDC, hPal, TRUE);
    } // 设置显示模式
    ::SetStretchBltMode(hDC, COLORONCOLOR); // 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
    if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
       (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
    {
    // 原始大小,不用拉伸。
    bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
       lpDCRect->left,             // DestX
       lpDCRect->top,              // DestY
       RECTWIDTH(lpDCRect),        // nDestWidth
       RECTHEIGHT(lpDCRect),       // nDestHeight
       lpDIBRect->left,            // SrcX
       (int)DIBHeight(lpDIBHdr) -
      lpDIBRect->top -
      RECTHEIGHT(lpDIBRect),   // SrcY
       0,                          // nStartScan
       (WORD)DIBHeight(lpDIBHdr),  // nNumScans
       lpDIBBits,                  // lpBits
       (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
       DIB_RGB_COLORS);            // wUsage
    }
        else
    {
    // 非原始大小,拉伸。
    bSuccess = ::StretchDIBits  (hDC,            // hDC
    lpDCRect->left,                 // DestX
    lpDCRect->top,                  // DestY
    RECTWIDTH(lpDCRect),            // nDestWidth
    RECTHEIGHT(lpDCRect),           // nDestHeight
    lpDIBRect->left,                // SrcX
    lpDIBRect->top,                 // SrcY
    RECTWIDTH(lpDIBRect),           // wSrcWidth
    RECTHEIGHT(lpDIBRect),          // wSrcHeight
    lpDIBBits,                      // lpBits
    (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
    DIB_RGB_COLORS,                 // wUsage
    SRCCOPY);                       // dwROP
    }

        // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB);

    // 恢复以前的调色板
    if (hOldPal != NULL)
    {
    ::SelectPalette(hDC, hOldPal, TRUE);
    }

    // 返回
    return bSuccess;
    }
      

  13.   

    如果你只是想显示mem中的dib的话可以先不碰Palette,直接Create一个Bitmap再选到一个DC上,可以bit到::GetDC(0)上先看看效果。
      

  14.   

    BITMAPINFO bif;
    ZeroMemory(&bif,sizeof(bif));
    bif.bmiHeader.biHeight=20;
    bif.bmiHeader.biWidth=20;
    bif.bmiHeader.biBitCount=24;
    bif.bmiHeader.biCompression=BI_RGB;
    bif.bmiHeader.biPlanes=1;
    bif.bmiHeader.biSize=sizeof(bif);HDC hDC=::GetDC(0),hSrcDC=CreateCompa..DC(NULL);
    bmp=::CreateDIBitmap(hSrcDC,&(bif.bmiHeader),CBM_INIT,pDIB/*你的dib段*/,&bif,
    DIB_RGB_COLORS);
    HGDIOBJ hObj=SelectObject(hSrcDC,bmp);
    BitBlt(hDC,0,0,20,20,hSrcDC,0,0,SRCCOPY);
    SelectObject(hSrcDC,hObj);
    DeleteObject(bmp);
    ::ReleaseDC(NULL,hDC);
    DeleteDC(hSrcDC);
    试试吧。
      

  15.   

    hSrcDC=CreateCompa..DC(NULL);
    这句话是什么意思?不懂,也编译不过去。
      

  16.   

    我知道了应该是CreateCompatibleDC(NULL)不好意思。
      

  17.   

    我知道了。应该是CreateCompatibleDC(NULL)
    但是运行结果是一团黑。不过我已经很高兴了。
    我已经把我得象素数据传进去了。屏幕是一块黑的。我再看看,你要不再帮我想想?
    顺便告诉我怎么给你加分,今天上午我好像给你加过分,得
    表示一下,不过我还是非常非常感谢你。谢谢。
      

  18.   

    HDC hDC=::GetDC(0),hSrcDC=CreateCompa..DC(hDC);
      

  19.   

    bif.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);...bmp=::CreateDIBitmap(hDC,&(bif.bmiHeader),CBM_INIT,pDIB/*你的dib段*/,&bif,
    DIB_RGB_COLORS);这个方法一定可行的,我读.bmp文件就是这个方法,注意你的hDib是否正确。
      

  20.   

    bif.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);...bmp=::CreateDIBitmap(hDC,&(bif.bmiHeader),CBM_INIT,pDIB/*你的dib段*/,&bif,
    DIB_RGB_COLORS);这个方法一定可行的,我读.bmp文件就是这个方法,注意你的hDib是否正确。