急!怎样把内存中的数据块显示出来??

einhep 2011-08-25 02:48:19

int CMyFile::Draw(PVOID pdata1)
{

DATA* pd = (DATA*)pdata1;
CDC* dc = pd->pdc;
int data_h = pd->h;
int dc_h = pd->rby - pd->lty+1;
int dc_w = pd->rbx - pd->ltx+1;
int colorwidth = 4*((dc_w*8+31)/32);
short* p = pd->pdata;

LPBITMAPINFO bi;
bi = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];//申请空间

bi->bmiHeader.biBitCount = 8;
bi->bmiHeader.biClrImportant = 0;
bi->bmiHeader.biCompression = BI_RGB;
bi->bmiHeader.biHeight = dc_h;
bi->bmiHeader.biPlanes = 1;
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi->bmiHeader.biSizeImage = 0;
bi->bmiHeader.biWidth = dc_w;
bi->bmiHeader.biXPelsPerMeter = 0;
bi->bmiHeader.biYPelsPerMeter = 0;

for (int ii = 0; ii < 256;ii++)
{
bi->bmiColors[ii].rgbBlue = ii;
bi->bmiColors[ii].rgbGreen= ii;
bi->bmiColors[ii].rgbRed = ii;
bi->bmiColors[ii].rgbReserved = 0;
}

BYTE* lpBits;
CDC* memdc=new CDC();
memdc->CreateCompatibleDC(dc);
HBITMAP hBitmap=::CreateDIBSection(memdc->m_hDC,bi,DIB_RGB_COLORS,(void**)&lpBits,NULL,0);
if (!hBitmap)
{
AfxMessageBox(TEXT("111"));
}
ASSERT(hBitmap!=NULL);

int j =0;
float ratio = (float)pd->h/(float)dc_h;
for(int i = 0; i < colorwidth;++i)
{
for (j = 0;j < dc_h;++j)
{
//lpBits[i*dc_h+j] = ((p[(int)( pd->h * i +j*ratio)]+32768)>>8);
}
}

HBITMAP oldbitmap = (HBITMAP)memdc->SelectObject(hBitmap);
dc->BitBlt(pd->ltx,pd->lty,dc_w,dc_h,memdc,0,0,SRCCOPY);
memdc->SelectObject(oldbitmap);

delete bi;
DeleteObject(hBitmap);
memdc->DeleteDC();
delete memdc;

return 1;
}


我用的CreateDIBSection函数 总是得不到正确的图像
...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
einhep 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ndy_w 的回复:]

1 行
2 4byte aligned
[/Quote]

哦了 谢谢
ndy_w 2011-08-25
  • 打赏
  • 举报
回复
1 行
2 4byte aligned
einhep 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ndy_w 的回复:]

CreateDIBSection出来的不要selectObject,它不是compatiblebitmap。用SetDIBitsToDevice直接画到你的dc上就行了。
[/Quote]
1请问CreateDIBSection得到的内存中图像数据是按行存储的么,例如第一行,然后第二行。还是按列存储的
2请问每行需要4字节对齐么?

谢谢大神啦!
einhep 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ndy_w 的回复:]

CreateDIBSection出来的不要selectObject,它不是compatiblebitmap。用SetDIBitsToDevice直接画到你的dc上就行了。
[/Quote]
1请问CreateDIBSection得到的内存中图像数据是按行存储的么,例如第一行,然后第二行。还是按列存储的
2请问每行需要4字节对齐么?

谢谢大神啦!
ndy_w 2011-08-25
  • 打赏
  • 举报
回复
CreateDIBSection出来的不要selectObject,它不是compatiblebitmap。用SetDIBitsToDevice直接画到你的dc上就行了。

19,469

社区成员

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

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