图像没法显示

zhouyongku 2009-03-17 05:05:16
定义参数:BITMAPINFOHEADER bmih;
BITMAPFILEHEADER bmfh;
LPSTR lpDIBits;
LPSTR lpDIB;
HANDLE hDIB;
CString filename;

响应“打开”按钮
//void CMyView::OnFileOpen()
{
CFileDialog dlg(true);
dlg.m_ofn.lpstrFilter="位图文件 (*.bmp)\0*.bmp\0\0";
if(IDOK==dlg.DoModal())
{
filename=dlg.GetPathName();
CFile fp(filename,CFile::modeRead);
LONG a=fp.GetLength();
hDIB=GlobalAlloc(GHND,fp.GetLength());
if(hDIB==NULL)
MessageBox("分配内存错误");
lpDIB=(LPSTR)GlobalLock(hDIB);
fp.Read(&bmfh,sizeof(bmfh));
fp.Read(&bmih,sizeof(bmih));
fp.SeekToBegin();
fp.ReadHuge(lpDIB,bmfh.bfSize);
lpDIBits=lpDIB+bmfh.bfOffBits;
BITMAPINFO *bmin=(LPBITMAPINFO)lpDIB;
}
}
在View里面响应OnDraw()函数
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
if(lpDIBits)
{
StretchDIBits(pDC->m_hDC,0,0,rect.Width(),rect.Height(),0,0,bmih.biWidth,bmih.biHeight,lpDIBits,(LPBITMAPINFO)lpDIB,DIB_RGB_COLORS,SRCCOPY);


}
}
好了,问题出来了:StretchDIBits的最后第3个参数为BITMAPINFO*,我这里强制转换后得到得结果是错误得,我调试了一下,发现数据错误,但是别得例题程序都是这样做得,却能得到正确得结果,我这里为什么不行呢?那么怎么样才能得到BITMAPINFO*呢?怎么样彩能让图像显示出来呢?(别告诉我用CBITMAP 来做哈,那太简单了)
...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
宋军港 2009-05-13
  • 打赏
  • 举报
回复
for (int i=0;i<256;i++)
{
pBmi8->bmiColors[i].rgbBlue=pBmi8->bmiColors[i].rgbGreen=pBmi8->bmiColors[i].rgbRed=i;
pBmi8->bmiColors[i].rgbReserved=0;
}
如果显示是真彩色图像24位的。没有调色板。只有灰度图8位的才需要进行调色板的赋值。
yangf1983 2009-04-21
  • 打赏
  • 举报
回复
联合利华引进了一条香皂包装生产线,结果发现这条生产线有个缺陷:常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊,他们只得请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组,综合采用了机械、微电子、自动化、X射线探测等技术,花了几十万,成功解决了问题。每当生产线上有空香皂盒通过,两旁的探测器会检测到,并且驱动一只机械手把空皂盒推走。   
 中国南方有个乡镇企业也买了同样的生产线,老板发现这个问题后大为恼火,找了个小工来说:你他妈给老子把这个问题搞定,不然你给老子爬~。小工很快想出了办法:他在生产线旁边放了台风扇猛吹,空皂盒自然会被吹走。

强人无处不在~~~
marine8086 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wnx_u 的回复:]
联合利华引进了一条香皂包装生产线,结果发现这条生产线有个缺陷:常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊,他们只得请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组,综合采用了机械、微电子、自动化、X射线探测等技术,花了几十万,成功解决了问题。每当生产线上有空香皂盒通过,两旁的探测器会检测到,并且驱动一只机械手把空皂盒推走。   
 中国南方有个乡镇…
[/Quote]

这个好
lambochan 2009-04-21
  • 打赏
  • 举报
回复
StretchDIBits(pDC->m_hDC,0,0,rect.Width(),rect.Height(),0,0,bmih.biWidth,bmih.biHeight,lpDIBits,(LPBITMAPINFO)lpDIB,DIB_RGB_COLORS,SRCCOPY);

ms应该为:

StretchDIBits(pDC->m_hDC,0,0,rect.Width(),rect.Height(),0,0,bmih.biWidth,bmih.biHeight,lpDIBits,(LPBITMAPINFO)(lpDIB + sizeof(BITMAPFILEHEADER)),DIB_RGB_COLORS,SRCCOPY);

zhouyongku 2009-03-17
  • 打赏
  • 举报
回复
这样还是没有对BITMAPINFO 里面得调色板赋值啊。调色板怎么处理呢?
wnx_u 2009-03-17
  • 打赏
  • 举报
回复
联合利华引进了一条香皂包装生产线,结果发现这条生产线有个缺陷:常常会有盒子里没装入香皂。总不能把空盒子卖给顾客啊,他们只得请了一个学自动化的博士后设计一个方案来分拣空的香皂盒。博士后拉起了一个十几人的科研攻关小组,综合采用了机械、微电子、自动化、X射线探测等技术,花了几十万,成功解决了问题。每当生产线上有空香皂盒通过,两旁的探测器会检测到,并且驱动一只机械手把空皂盒推走。   
 中国南方有个乡镇企业也买了同样的生产线,老板发现这个问题后大为恼火,找了个小工来说:你他妈给老子把这个问题搞定,不然你给老子爬~。小工很快想出了办法:他在生产线旁边放了台风扇猛吹,空皂盒自然会被吹走。

这个故事告诉我们,有时候不要把问题想的太复杂,简单重复做可能就是个妙招



如果你想这么做,BITMAPINFO的数据要自己赋值的,

int panelsize = 0; //记录调色板大小
if (bitmap.bmBitsPixel<16) //判断是否为真彩色位图
panelsize = pow(2,bitmap.bmBitsPixel*sizeof(RGBQUAD));

BITMAPINFO *pBInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
pBInfo->bmiHeader.biBitCount = bitmap.bmBitsPixel;
pBInfo->bmiHeader.biClrImportant = 0;
pBInfo->bmiHeader.biCompression = 0;
pBInfo->bmiHeader.biHeight = height;
pBInfo->bmiHeader.biPlanes = bitmap.bmPlanes;
pBInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
pBInfo->bmiHeader.biSizeImage = bitmap.bmWidthBytes*bitmap.bmHeight;
pBInfo->bmiHeader.biWidth = width;
pBInfo->bmiHeader.biXPelsPerMeter = 0;
pBInfo->bmiHeader.biYPelsPerMeter = 0;

19,464

社区成员

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

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