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

bbshliu 2009-05-06 01:38:05
一副用摄像机采集的659*494的灰度图像,用StretchDIBits显示到PictureBox上倾斜,麻烦看下是什么原因。


int ret = 0;
//b包含图像信息和数据
int nColumn = b.getSizeX();
int nRow = b.getSizeY();
int nSize = b.getSize();
BITMAPINFOHEADER bi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = nColumn;
bi.biHeight = nRow;
bi.biPlanes = 1;
bi.biBitCount = 8;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
BITMAPINFO* pbi = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
pbi->bmiHeader = bi;
// 初始化成员
for (int i=0;i<256;i++)
{
pbi->bmiColors[i].rgbBlue = i;
pbi->bmiColors[i].rgbGreen = i;
pbi->bmiColors[i].rgbRed = i;
pbi->bmiColors[i].rgbReserved = 0;
}

HDC hdc = m_Picture.GetDC()->GetSafeHdc();
char *pixel = (char *)b.getBuffer();
//正常
for(int j = 0; j < nRow; j++)
for (int i = 0; i < nColumn; i++)
{
BYTE p = pixel[j * nColumn + i];
COLORREF color = RGB(p, p, p);
::SetPixel(hdc,i,j,color);
}
//倾斜
SetStretchBltMode(hdc, COLORONCOLOR);
ret = ::StretchDIBits(hdc,
rect.left, rect.top, nColumn, nRow,
0, 0, nColumn, nRow,
b.getBuffer(), pbi, DIB_RGB_COLORS, SRCCOPY);

...全文
391 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbshliu 2009-05-06
  • 打赏
  • 举报
回复
thx
zhangyan_wt 2009-05-06
  • 打赏
  • 举报
回复
经典的4字节对齐问题,要求每行数据的字节数是4的整倍数。
最好把b整理一下,比如创建一个缓冲区c,nRow行,(nColumn+3)/4*4列,

int nLineWidth = (nColumn+3)/4*4; //凑成大于等于nColumn的最小的4的整倍数
BYTE *c = new BYTE[nRow* nLineWidth];
for(i = 0; i < nRow; i++)
memcpy(c+i*nLineWidth, b+i*nColumn, nColumn);

然后显示c
bbshliu 2009-05-06
  • 打赏
  • 举报
回复
我也发现是那个有点问题,麻烦请再指点指点
laviewpbt 2009-05-06
  • 打赏
  • 举报
回复
扫描行宽度问题

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧