灰度图像用SetPixel可以正常显示,StretchDIBits画出的图像倾斜

   


      目前已经正确获得指向所要绘制的指针 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

你可能感兴趣的:(灰度图像用SetPixel可以正常显示,StretchDIBits画出的图像倾斜)