关于编写DIB类的问题,请高手指点。顶者有分。

AbnerChai 2003-10-23 09:31:57
现在我正在学习用VC编写DIB类,昨在在书上看到一个类,我就把它的源程序输入进去了,可以正常显示各种BMP图像,显示图像的步骤见下。
用 LoadBmp(LPCSTR filename);把一个bmp文件装入DIB类。
装入后,在DIB类中:
BITMAPINFO *m_pBMI;
BYTE *m_pDIBData;两个变量分别指向DIB文件的BITMAPINFO结构和图像的数据信息。然后调用: pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),nLeft,nTop,nWidth,nHeight,0,0,GetDIBWidth(),GetDIBHeight(),m_pDIBData,m_pBMI,DIB_RGB_COLORS,SRCCOPY);
就可以显示出来了。
但现在我有个问题就是:显示这个图像就可以了,为什么我的那个DIB类中还有什么
FromHandle()、CreateDIB()、G/SetDIBBits()、SaveBMP()、GetDibSection()等等很多函数根本没有用到。我还发现其中有CreateDIBSection等函数的调用。但我不知道它些都有什么用?
我猜测它们是为了对这个图像做一些处理用的。但我很奇怪,处理图像为什么还要这么多,为什么不直接对m_pDIBData所指的数据区直接处理变换就可了,为何还要这么多函数?请指一点一下思路。就是那些函数做什么?这个数字图像处理DIB类的具体思路?
多谢!
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
moon1311 2010-05-28
  • 打赏
  • 举报
回复
给我也发一份

谢谢了

xianlongok@163.com
yangvxin1 2003-10-27
  • 打赏
  • 举报
回复
给我一份.

yangvxin@sohu.com
wangzi163 2003-10-24
  • 打赏
  • 举报
回复
我有完整的代码,我发给你 留个油箱。
mathsword 2003-10-24
  • 打赏
  • 举报
回复
给我一份谢谢
upcstudent@163.com
wangzi163 2003-10-24
  • 打赏
  • 举报
回复
你说的叫垂直镜像,可以这样实现 参看《vc++数字图像处理》

BOOL WINAPI MirrorDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,BOOL bDirection)
{
LPSTR lpSrc;
LPSTR lpDst;
LPSTR lpBits;
HLOCAL hBits;
LONG i;
LONG j;

LONG lLineBytes;
lLineBytes=WIDTHBYTES(lWidth*8);
hBits=LocalAlloc(LHND,lLineBytes);
if(hBits==NULL)
{
return FALSE;
}
lpBits=(char*)LocalLock(hBits);
if(bDirection)
{
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth/2;j++)
{
lpSrc=(char*)lpDIBBits+lLineBytes*i+j;
lpDst=(char*)lpDIBBits+lLineBytes*(i+1)-j;
*lpBits=*lpDst;
*lpDst=*lpSrc;
*lpSrc=*lpBits;
}
}
}
else
{
for(i=0;i<lHeight/2;i++)
{
lpSrc=(char*)lpDIBBits+lLineBytes*i;
lpDst=(char*)lpDIBBits+lLineBytes*(lHeight-i-1);
memcpy(lpBits,lpDst,lLineBytes);
memcpy(lpDst,lpSrc,lLineBytes);
memcpy(lpSrc,lpBits,lLineBytes);
}
}

LocalUnlock(hBits);
LocalFree(hBits);

return TRUE;
}
void CBMPSeeView::OnGeomMirv()
{
CBMPSeeDoc* pDoc=GetDocument();
LPSTR lpDIB;
LPSTR lpDIBBits;

lpDIB =(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
if(::DIBNumColors (lpDIB)!=256)
{
MessageBox("目前只支持256色位图的垂直镜像!","系统提示",MB_ICONINFORMATION|MB_OK);
::GlobalUnlock((HGLOBAL)pDoc->GetHDIB ());
return;
}
BeginWaitCursor();
lpDIBBits=::FindDIBBits(lpDIB);

if(::MirrorDIB (lpDIBBits,::DIBWidth (lpDIB),::DIBHeight(lpDIB),FALSE))
{
pDoc->SetModifiedFlag (TRUE);
pDoc->UpdateAllViews (NULL);
}
else
{
MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);
}
::GlobalUnlock ((HGLOBAL)pDoc->GetHDIB ());
EndWaitCursor();
}
AbnerChai 2003-10-24
  • 打赏
  • 举报
回复
多谢,我的邮箱是abnertsai@sina.com
AbnerChai 2003-10-23
  • 打赏
  • 举报
回复
比如:请给出一个详细过程:将一个bmp图像上下转动过来,具体该如何做?第一步做什么?第二步做什么等?请给出VC中详细步骤.

19,468

社区成员

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

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