C++数字图像处理从零入门

所需积分/C币:50 2014-10-06 11:50:31 1.26MB PDF
30
收藏 收藏
举报

具有一定c++基础后开始从零学习C++数字图像处理,可实现BMP文件的读写,可一个拓展函数处理的案例,一步一步,非常完善,文档中包含所以代码,可以用于开发,而且注释详细
1使用DIB读写BMP文件(一) Dib. cpp的实现。 首先建立C艹的一个名为 DInageProcess的多文档工程,选项默认即可。然后我们创建 DIBH和 DIB. cpp文件,至于BMP图像的各种格式以及之前的很多讲解,随便一本数宁图 像的书都会有所讲解,这里不在赘述,有需求的直接参看图像⊥程输的前两章。下面为CDib 类实现的完整定义即 Dib. cPP这些需要全部复制到文件里。 新建Dib.cp即C++的源文件,系统会自动添加到源文件夹里 #include"sidalx h" #include <math. h> #include "Dib. h #ifdef DEBUG #undef THIs file static char THIS FILE[= FIlE; #de line new DEBUg New #endif *Djb文件头标志(字符串"BM") #define DIB MarKer (WORD)(M<<8)B) / Construction/ Destruction CDib: CD1b0 InitMembers( CDib CDib ClearMemory /*求**率米率****米*半***率***※*半***米求率*半*求半*半率半※*半**米米**米米半率半装米*举半** 函数名称: DrawDib0 参数说明 HDC hDO,输出设备DC LPRECT lpDCRect,绘制矩形区域 hGLOBAL hDIB,DIB对象的句柄 * LPRECT lpDIBRect,DB的输出区域 * PAlette*pal,调色板的指针 函数类型BOOL *函数功能:该函数主要用来绘制DIB对象 水冰水水本冰水冰冰冰来水水冰冰冰冰水冰本水水本冰米水冰冰冰冰来本冰水来水冰冰冰*水本冰水冰冰冰水水冰冰冰水本冰水水冰本/ BOOL CDib: DrawDib(HDC LPRECT lpDCRect HGLOBAL hDIB LPRECT lpDIBRect CPalette* pPal) BOOL b=FALse ∥重画成功标志 HPALETTE holdPal=NULL 〃以前的调色板 if(hDIB= NULL判断是不是有效的DB对象 return False;/不是,则返回 lpdib=( LPSTR): Globallock( HGLOBAL)hDIB);∥锁定DIB IpDIB Bits=( ictbits(pdib);∥找到DB图象像素起始位置 if(pPal!NUL)∥获取DB调色板,并选取到设备环境中它 HPALETTE hPal=(HPALETTE)pPal->m hobject hOldPal=: SelectPalele(hDC, hPal, TRUE) SetStretchBltModer(hDC, COLORONCOLOR)设置显示模式 sUccess=: StretchDIBits(hDC, ∥设备环境句柄 lpDCrect->left /目标Ⅹ坐标 lpDCRect->top, ∥目标Y坐标 GetRect Width(pDCRect) ∥目标宽度 GetRectHeight(lpDCRect) ∥目标高度 lpdiBRect->left 源X丛标 lpDibrect->top ∥源Y坐标 GeLRectWidth(pdiBrect) 源宽度 GetRectHeight(lpDIBRect ∥源高度 lpDIBBits. ∥指向dib像素的指针 LPBITMAPINFOIpdib,∥指向位图信息结构的指针 DIB RGB COLORS ∥使用的颜色数目 SRCCOPY ∥光栅操作类型 GlobalUnlock(hDB);∥解除锁定 if( holdAll!=NUIL∥恢复系统调色板 SelectPalette(hDC, holdPal, TRUE) return sUccess 水非水水水冰水水末水本冰水水水水水水水冰水水本水本水冶末水冰水水水本水本水水水水冶水水水水水水水本水本水冰本水水水来水冰水冰农水本 *函数名称: ConstructPalette( HGLOBAL hDIB, PAlette*pPa) 函数参数: HGLOBAL hDIE,DIB对象的句柄 * PAlette*pPal,调色板的指针 函数类型BOOL *函薮说明:该函数按照DB创建一个逻辑调色板 水本*本岑为本*米本*水本水*冰冰水**本本*米本水本水水水本本水*本水*水水*本水水本水水*本冰*水冰本 BOOL CDib:: ConstructPalette(HGLOBAL hDIB, CPalette* pPal haNDLE hLogPal;逻辑调色板的句柄 int iLoop;循环变量 booL SUccess= FALSE;//创建结果 if(hDB=NULI)判断是否是有效的DB对象 return false;∥返回 FALSE lpdib=(LPSTR): GlobalLock((HGLOBAL) hDIB): //EAE DIB lpbminfo-=(LPBITMAPINFOpdib long w Num colors= GetColorNum( Ipdib);/获取DIB中颜色衣中的颜色数目 if (wNum Colors =0) hLogPal=: Globalalloc(GHND,si∠eo( LOGPALETTE)分配为逻辑调色板內存 sizeof(PALETTEENTRY WNumColors) if( hLogPal=0)如果失败则退出 GlobalUnlock( HGLOBAL)hDIB),解除锁定 return False LPLOGPALETTE lpPal=(LPLOGPALETTE): GlobalLock((hglobal) hLogPal lpal-> pal version=PalⅤ Ersion;/设置调色板版本号 pPa-> paINumEntries=(wORD) nUm colors;设置颜色数目 for( iLoop=0; lLoop<(int) WNum Colors; iLoop++)∥读取调色板 lpPal->palPalEntry[iLoop] peRed=lpbminfo->bmi Colors[i Loop]. rgbRed; / iT EX 三原色分量 IpPal->palPalEntryliLoop pe Green=lpbminfo->bmiColorsiLoop] rgb Green lpPal->palPalEntryIiLoop] pe blue=lpbminfo->bmiColors[iLoop]. rgbBlue apPal-> palPalEntry[ ILoop] peFlags=0;/保留位 sUccess-pPal-s( reatePalette(pPa)∥/按照逻辑调色板创建调色板,并返回指针 GlobalUnlock( HGLOBAL) hLogpal);解除锁定 GlobalFree( HGLOBAL) hLogPal);释放逻辑调色板 GlobalUnlock( HGLOBAL)hDIB);解除锁定 return success;/回结果 本冰本本冰本冰本本本冰本本木本冰冰本本本冰冰本本本本*本本本本冰本本本水本本本水本本本本水本本本冰冰本本本冰冰本本本*水本本本本木水本 *函数名称: Getbits( LPSTR lpdib) 函数参数: * LPSTR Ipdib,指向DIB对象的指针 *函数类型 LPSTR *函数功能:计算DB像素的起始位置,并返回指向它的指针 米宗凇凇於≯冰凇凇*凇冰水凇凇凇凇冰凇凇≯冰水凇*於凇冰尜凇米冰案米非水米案冰凇水冰尜凇凇凇冰凇凇冰棠水米冰冰凇水米凇凇冰水水*凇 LPSTR CDib: GctBits(LPSTR Ipdib return(pdib + LPBITMAPINfohEaDErlpdib)->biSize+ GetPalSize(lpdib)) // return(lpdib +*(LPDWORD)Ipdibt GetPalSize(lpdib)) 半零*米半米半半半半半**半*半半半*半半岑半半半米半求半*半半*半半半*半半米半半*半半半*半半*半半半半半半*半半半*半*半零 *函数名称: Get Width(LPSTR lpdib) *函数参数: * LPSTR lpdib,指向DIB对象的指针 函数类型 DWORD 菜函数功能:该函数返回DB中图象的宽度 冰**水**水*冰事水水冰冰水率水水水**水水冰冰事水率冰*水水*水冰水客水水*事半冰水*水串冰水**冰桌水冰事 DWORD CDib: Get Width(LPSTR lpdib return( LPBITMAPINFOHEADER) lpdi)-> bi width;返回DB宽度 米事水水***冰水率***水水***水**水水**冰**收水冰峰*率*冰*水率***水卓*冰非**冰水水**净*枣*水* 米函数名称: Getheight( LPSTR lpdib *函数参数 * LPSTR lpdib,指向DIB对象的指针 函数类型 DWORD *函数功能该函数返回DB中图象的高度 本***来者**本*本**本**※**************本*本本****※**表***/ DWORD CDib: GetHeight(LPSTR lpdib return( LPBITMAPINFOHEADER)lpdib-> biWeight;/返回DIB高度 本小本冰≯冰水本木本本小本木冰凇本本本冰本木木冰本本木木冰本小本本小本忐冰木本小本本冰本本本木冰本本本冰冰本小本本冰本水本木木本 *函数名称: GetPalsize( LPSTR lpdib) 函数参数: * LPSTR lpdib,指向DB对象的指针 函数类型WORD 函数功能:该函数返回DIB中调色板的大小 半*半*米半岑米半半米*半半米半岑半农米半岑半半半米求**半半半半非客半半半半半半半半半*半半农*半半零半*米半半半半*米半岑米**米零 WORD CDib GetPalSize(LPSTR lpdib rcturn(WORD)( ict colonum( lpdib)*si7cof( RGBQUAD);计算DB中调色板的大小 米冰米米凇冰水米米凇冰米米米水冰米宗水米米水农米冰凇凇米求凇农案米冰凇水**兴凇冰水米米水水米冰水米凇凇冰米凇凇 *函数名称: GelcolorNum( LPSTR lpdib 米函数参数: * LPSTR Ipdib,指向DIB对象的指针 *函数类型:WORD *函数功能:该函数返回DIB中调色板的颜色的种数 半宰半*******半半半***米*半半半***米学半*****学学半******率半*半****学率***/ WORD CDib: Get ColorNum(LPSTR lpdib long dwClrUsed=( LPBITMAPⅠ NFOHEADER) lpdi-> biClrused;∥读取 dw ClaUsed值 if (dw ClrUsed!=0) etum( WORD)dw ClrUsed;如果 dwClrUsed不为0,直接返回该值 WORD wBitCount=( PBITMAP| NFOHEADER)pdib)-> cbiBitcount;∥读取 biBitcount值 switch( wBitCount∥/按照像素的位数计算颜色数日 case 1 return 2 case rcturn case 8 return 256 default return 0 本冰本本冰本冰本本本冰本本木本冰冰本本本冰冰本本本本*本本本本冰本本本水本本本水本本本本水本本本冰冰本本本冰冰本本本*水本本本本木水本 *函数名称: Getbitcounte( LPSTR lpdib 函数参数: * LPSTR Ipdib,指向DIB对象的指针 *函数类型WORD 函数功能该函数返回 DIBBitcount 米宗凇凇於≯冰凇凇*凇冰水凇凇凇凇冰凇凇≯冰水凇*於凇冰尜凇米冰案米非水米案冰凇水冰尜凇凇凇冰凇凇冰棠水米冰冰凇水米凇凇冰水水*凇 WORD CDIb: GetBiLCounl(LPSTR lpdib return( LPBITMAPINFOHEADER) lpdi-> bibitcount;/返回位宽 半*半来**半率半半*半*半半来半米率半来半半率半来*半半半**半半**半来半半*半*米半**半*半半*半*半米**来米米*半*半半率*半*半 函数名称: Copyobject( HGlOBAL gLob) *函数参数: * hGLOBAL hGlob,要复制的内存区域 函数类型 HGlObaL *函数功能:该函数复制指定的内存区域 冰冰本本本冰本本*本省本本本冰本本本本米本冰本表米本本本本本本水本本本本本冰本本米冰本本本米本本本本本本本本米本 HGLOBAL CDib: CopyObject(hGlOBal gLob) if(hGlob--NULL) return null: DWORd daLen=: Globalize( HGLOBALhGlob);′获取指定内存区域大小 hgLOBaL tEmp=: GlobalAlloc(GHID, daLen;分配新内存空间 if( hEmp!=NUIL判断分配是否成功 void"lp Temp=: GlobalLock((HGLOBAL)hTemp); //ET GlobalLock((hglobalyhglob) memcpy( tEmp,lp, daLen);/复制 GlobalUnlock( tEmp);!"解除锁定 GlobalUnlock(gLob) return hTcmp /****浓冰冰**浓***浓冰******本※冰**欢**来※淋米***冰冰来※率** *函数名称: Savefile( HGLOBAL hIb, Cfile&file) 米函数参数 HGLOBAL hIb,要保的DIB *CFie&file,保存文件 CFile 函数类型BOOL *函数功能:将指定的DB对象保存到指定的 CFile中 ≯咔小岑尜**≯岺尜≯≯尜本*≯≯小岑尜咔本岑本本咔卡尜本;本岑凇≯本岑*冰本本本冰本本本本本本本冰本 BOOL CDib: SaveFile(HGLOBAL hDib, CFile& file) if(hIb== NULl) return False;∥/t果DB为空,返回 FALSE lpbmihrd =(LPBITMAPINFOHEADER): GlobalLock((HGLOBAL) hIb); iT EX BITMAPINFO结构,并锁定 if (lpbmihrd- NULL) return false;∥为空,返回 FALSE bmfheader. bfType= DIB MARKER;∥填充文件头 dwdibSize=* LPDWORD)lpbmihrd+ Get Palsize( LPSTR)lpbmihrd);文件头大小+颜 色表大小 DWORd dw BmBils size;!像素的大小 dw BmBits Size GetReq Byte Width((lpbmihrd->bi Width) "((DWORD)Ipbmihrd->biBit Count) lpbmihrd-> biWeight;/大小为 Width* Height dwDIBSize+= dwBm Bits size;∥计算后DIB每行字节数为4的倍数时的大小 lpbmihrd->biSizelmage = dw BmBits Size; / EaT biSizelmage bmfHeader bfSize- dwDIBSize+ sizeof( BITMAPFILEHEADER);文件人小 bmfheader. bfreservedl=0;/两个保留字 bmfheader.bfreserved2=0 bmfHeader. bfoffBits =(DWORD)Sizeof(BITMAPFILEHEADER)+ lpbmihrd->biSize// it 算偏移量 bfoftBits GetPalsize( (LPstr)lpbmihrd) TRY file. Write(& bmfheader, sizeof( BITMAPFILEHEADER)/文件头 il: WriteHuge( lpbmihrd, dw DIBSize);/DB头和像素 CATCH(CFileException, e) GlobalUnlock( HGLOBAL)hDib}!解除锁定 THROW LASTO;∥抛出异常 END CATCH GlobalUnlock( HGLOBAL)hDjb);∥^解除锁定 rcturn TRUF:;/返回TRUE /*****率半**半非举*************兴**率**※率******岸** *函数名称: Loadfilc(CFic&filc) *函数参数 * Cfile&file,要读取得文件文件 CFile 函数类型 CHGLOBAL *函数功能:将指定的文件中的DB对象读到指定的内存区域中 木本本本本水本水本木本者本水冰木本水本冰冰水小冰冰冰水本冰冰冰木水本冰木水本本冰本本水本木本水水木本木冰本小水冰冰本水本水本冰本本木本本 HGLOBAL CDib: LoadFile(CFile& file) dWord dw Filesize dwFile size= file. GetLengtho;∥获取文件大小 if(file Read(LPSTR)&bmfHeader, sizeof(bmfHeader)I= sizeof(bmfHleader)) i: #X DIB 文件头 return NULL;大小不一致,返回NULL if( bmfHeader. bf Type!= DIB MARKER判断是否是DIB对象 return null;∥如果不是则返回NULL m hIb=(hGlobal) GlobalAllOc(GMEM MOVEaBle GMEM ZEROINIT dw filesize- sizeof( BITMAPFILEHEADER);分配DIB内存 if(m hDib-=0) return null;分配失败,返回NULL

...展开详情
试读 52P C++数字图像处理从零入门
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • GitHub

  • 分享精英

关注 私信
上传资源赚钱or赚积分
最新推荐
C++数字图像处理从零入门 50积分/C币 立即下载
1/52
C++数字图像处理从零入门第1页
C++数字图像处理从零入门第2页
C++数字图像处理从零入门第3页
C++数字图像处理从零入门第4页
C++数字图像处理从零入门第5页
C++数字图像处理从零入门第6页
C++数字图像处理从零入门第7页
C++数字图像处理从零入门第8页
C++数字图像处理从零入门第9页
C++数字图像处理从零入门第10页
C++数字图像处理从零入门第11页

试读结束, 可继续读5页

50积分/C币 立即下载 >