内存中有一 BYTE *m_pBits 数组(600×600×3)存着图像像素,图像大小为600×600 像素,每3个字节存一颜色值(RGB)。
m_pBits 数组中的值是正确的,我在OnDraw(CDC* pDC)中写下面程序验证了一下可以正常显示:
for(int i = 0; i < 600; ++i)
  for(int j = 0; j < 600; ++j)
    pDC->SetPixel(i, j,RGB(m_pBits[3 * (i + j*600)], m_pBits[3*(i + j*600)+1], m_pBits[3*(i + j*600)+2]));
但是这种显示方法太慢。因此我写了下面代码1:
BITMAP imgBm;
imgBm.bmType = 0;
imgBm.bmWidth = 600;
imgBm.bmHeight = 600;
imgBm.bmWidthBytes = 600 * 3;
imgBm.bmPlanes = 1;
imgBm.bmBitsPixel = 24;
imgBm.bmBits = m_pBits; CBitmap imgBitmap;
imgBitmap.CreateBitmapIndirect( &imgBm );
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&imgBitmap);
pDC->BitBlt(0, 0, 600, 600, &dcMem, 0, 0, SRCCOPY);
程序中没有图像显示,我又试了代码2:
  CBitmap imgBitmap;
imgBitmap.CreateCompatibleBitmap(pDC, 600, 600);
  imgBitmap.SetBitmapBits(24 * 600 * 600, m_pBits);
  CDC dcMem;
  dcMem.CreateCompatibleDC(pDC);
  dcMem.SelectObject(&imgBitmap);
  pDC->BitBlt(0, 0, 600, 600, &dcMem, 0, 0, SRCCOPY);
也不能显示图像,我又试了代码3:
CBitmap imgBitmap;
imgBitmap.CreateCompatibleBitmap(pDC, 600, 600);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&imgBitmap);
for(int i = 0; i < 600; ++i)
  for(int j = 0; j < 600; ++j)
    dcMem.SetPixel(i, j,RGB(m_pBits[3 * (i + j*600)], m_pBits[3*(i + j*600)+1], m_pBits[3*(i + j*600)+2]));
pDC->BitBlt(0,0,600,600,&dcMem,0,0,SRCCOPY);上面代码中的BitBlt都用
pDC->StretchBlt(0,0,600,600, &dcMem, 0,0,600,600,SRCCOPY);代替试了一下都不行有谁知道错在哪里了,或有其他什么方法,多多指教,不胜感激!!!!!

解决方案 »

  1.   

    HDC hDC = ::GetDC(0);
    PBYTE pbData = new BYTE[128*128*3];
    ZeroMemory(pbData,128*128*3);
    BITMAPINFOHEADER fmtFrame = {sizeof(BITMAPINFOHEADER), 0, 0, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
    fmtFrame.biWidth = 128;
    fmtFrame.biHeight = 128;
    fmtFrame.biSizeImage =128*128*3;
    void* pBits;
    HBITMAP hBmp = CreateDIBSection(hDC, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS, (void**)&pBits, NULL, 0);
    SetDIBits(hDC, hBmp, 0, 128, pbData, (BITMAPINFO*) &fmtFrame, DIB_RGB_COLORS); CDC dc;
    dc.CreateCompatibleDC(NULL);
    CBitmap * pSaveBmp = dc.SelectObject(CBitmap::FromHandle(hBmp));....
      

  2.   

    这句话对你有用么  Each device has its own unique color format. In order to transfer a bitmap from one device to another, use theGetDIBits andSetDIBits Windows functions.
      

  3.   

    用DentistryDoctor的代码解决了,多谢
      

  4.   

    DentistryDoctor的方法是正解。顺便提一下楼主的方法一和二不能显示的原因,CreateBitmapIndirect()函数所建立的位图是32位的,而楼主的BITMAP中bmBitsPixel是24位的。因此无法显示。
    现将正确改正后的结果附上(注意颜色数组尺寸变了)
    BYTE m_Data[600*600*4];
    BITMAP imgBm;
    imgBm.bmType = 0;
    imgBm.bmWidth = 600;
    imgBm.bmHeight = 600;
    imgBm.bmWidthBytes = 600 * 4;
    imgBm.bmPlanes = 1;
    imgBm.bmBitsPixel = 32;
    imgBm.bmBits = m_pBits; CBitmap imgBitmap;
    br=imgBitmap.CreateBitmapIndirect( &imgBm );

    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    dcMem.SelectObject(&imgBitmap); pDC->BitBlt(0, 0, 600, 600, &dcMem, 0, 0, SRCCOPY);方法二的原因同上。