内存中有一 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);代替试了一下都不行有谁知道错在哪里了,或有其他什么方法,多多指教,不胜感激!!!!!
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);代替试了一下都不行有谁知道错在哪里了,或有其他什么方法,多多指教,不胜感激!!!!!
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));....
现将正确改正后的结果附上(注意颜色数组尺寸变了)
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);方法二的原因同上。