目前已经正确获得指向所要绘制的指针 m_lpBits,(存有相应的像素值),此灰度图像用SetPixel可以正常显示,StretchDIBits画出的图像倾斜????详细情况如下:
当用SetPixel 函数时,
for(int j=0; j<nHeight; j++)
{
for(int k=0; k<nWidth; k++)
{
int b=this->m_pFr->m_pView->GetDocument()->m_lpBits[j*nWidth+k];
int g=b;
int r=b;
pDC->SetPixel(k,j,RGB(r,g,b));
}
}
显示结果正确。
当用 StretchDIBits 函数时,
CRect rc;
GetClientRect(&rc);
if (rc.Width()<rc.Height())
RC_temp=rc.Width(); //为了取小值。
else
RC_temp=rc.Height();
SetStretchBltMode(*pDC,COLORONCOLOR); //这句要注意。
StretchDIBits(*pDC,0,0,RC_temp,RC_temp,
0,0,nWidth,nHeight,
this->m_pFr->m_pView->GetDocument()->m_lpBits,pbmi,DIB_RGB_COLORS,SRCCOPY);
显示出的结果是倾斜的。
今天折腾一天,终于搞定了。这是显示位图时的 经典的4字节对齐问题,要求显示每行数据的字节数是4的整倍数
。通过创建一个缓冲区m_pImageBuffer,有 nHeight行,(nWidth+3)/4*4列,然后把m_lpBits里的像素值正确的赋进m_pImageBuffer,最后显示m_pImageBuffer,就对了!
代码如下:
CRect rc;
GetClientRect(&rc);
if (rc.Width()<rc.Height())
RC_temp=rc.Width(); //为了取小值。
else
RC_temp=rc.Height();
SetStretchBltMode(*pDC,COLORONCOLOR); //这句要注意。
int nLineWidth = (nWidth+3)/4*4; //凑成大于等于nColumn的最小的4的整倍数
BYTE *m_pImageBuffer;
m_pImageBuffer =new BYTE[nLineWidth*nHeight];
for(int i = 0; i < nHeight; i++)
{memcpy(m_pImageBuffer+i*nLineWidth, this->m_pFr->m_pView->GetDocument()->m_lpBits+i*nWidth, nWidth);}
StretchDIBits(*pDC,0,0,RC_temp,RC_temp,
0,0,nWidth,nHeight,
m_pImageBuffer,pbmi,DIB_RGB_COLORS,SRCCOPY);
显示正确!
参看:http://topic.csdn.net/u/20090506/13/bb75beb9-1d8b-4666-89df-876244614b0e.html