StretchDIBits用法?帮我诊断以下。

namedo 2009-01-22 10:05:44

unsigned char* pixel;

pixel 指向一片512*512字节的内存,表示一张8位灰度图片。我现在要用StretchDIBits函数把它显示出来,
看看我的代码有什么问题。


hdc = BeginPaint(hWnd, &ps);
BITMAPINFO bmi;
BITMAPINFOHEADER bi;
RGBQUAD lut[255];
int i;

bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth = nColumn;
bi.biHeight = nRow;
bi.biPlanes = 1;


bi.biBitCount = 8;
bi.biClrUsed = 256;
bi.biClrImportant = 256;

bi.biCompression = 0;
bi.biSizeImage = 512*512;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;

for (i=0;i<256;i++)
{
lut[i].rgbBlue = i;
lut[i].rgbGreen = i;
lut[i].rgbRed = i;
lut[i].rgbReserved = 0;
}
bmi.bmiHeader = bi;
bmi.bmiColors[0] = lut[0];
StretchDIBits(hdc,0,0,512,512,0,0,512,512,pixel,&bmi,DIB_PAL_COLORS,SRCCOPY);

EndPaint(hWnd, &ps);


pixel指向的像素区没有问题,因为我用SetPixel函数显示没问题。

for(j = 0;j<nColumn;j++)
for (i = 0;i < nRow;i ++)
{
color = RGB(*pixel,*pixel,*pixel);
::SetPixel(hdc,i,j,color);
pixel++;
}

...全文
419 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhonghua123 2011-08-03
  • 打赏
  • 举报
回复
运行到StretchDIBits的时候提示有内存错误。
zhonghua123 2011-08-03
  • 打赏
  • 举报
回复
我用了Mackz的方法,但是还是有问题,不知哪里出现问题了。求助!
namedo 2009-01-23
  • 打赏
  • 举报
回复
Mackz 说的很对。我昨天已经找的错误的地方了,还是同样谢谢你!
菜牛 2009-01-23
  • 打赏
  • 举报
回复
BITMAPINFO里面的位图信息头和调色板要求是连续的,你的方式只是把调色板第一个项目lut[0]赋值给了BITMAPINFO的bmiColors[0],但是并没有连续,可以自己看看内存布局。一般这么分配:

BITMAPINFO* pbi = new BYTE[sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD)];
pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
...// 初始化成员
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;
}
StretchDIBits( hdc, 0, 0, 512, 512, 0, 0, 512, 512, pixel, pbi, DIB_RGB_COLORS, SRCCOPY );
// 其实你不缩放的话,用SetDIBitsToDevice函数更快
cnzdgs 2009-01-22
  • 打赏
  • 举报
回复
RGBQUAD lut[255]; => RGBQUAD lut[256];
namedo 2009-01-22
  • 打赏
  • 举报
回复
纠正一个错误:

hdc = BeginPaint(hWnd, &ps);
BITMAPINFO bmi;
BITMAPINFOHEADER bi;
RGBQUAD lut[256]; //先前写成了lut[255]
int i;


还是有问题。
fishion 2009-01-22
  • 打赏
  • 举报
回复
你的怎么会是12个参数的,而MSDN里只有11个参数的
namedo 2009-01-22
  • 打赏
  • 举报
回复
还是不行啊。
vc1000 2009-01-22
  • 打赏
  • 举报
回复
StretchDIBits(hdc,0,0,512,512,0,0,512,512,pixel,&bmi,DIB_RGB_COLORS,SRCCOPY);
vc1000 2009-01-22
  • 打赏
  • 举报
回复
将DIB_PAL_COLORS换成DIB_RGB_COLORS试试看

19,464

社区成员

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

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