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

本文解决了使用StretchDIBits绘制灰度图像时出现的倾斜问题。通过创建一个4字节对齐的缓冲区并正确填充原始像素值,最终实现了图像的正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   


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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值