获得位图非屏蔽色/屏蔽色区域的算法
2010-02-13 08:28
190 查看
// 获得图片区域 void CImgBitmap::GetImageRgn(CRgn& fulRgn, COLORREF clrTrans /*= RGB(255, 0, 255)*/, BOOL bCombineTrans /*= FALSE*/, int nCombineMode /*= RGN_OR*/, LPPOINT lpPoint /*= NULL*/) { if( IsNull() ) return ; if( !fulRgn.m_hObject ) { // 创建总区域,初始region为0 fulRgn.CreateRectRgn(0, 0, 0, 0); } // 创建图片区域,初始region为0 CRgn rgnImg; rgnImg.CreateRectRgn(0, 0, 0, 0); // 申请位图数据内存块 DWORD dwWidth = GetWidth(); DWORD dwHeight = GetHeight(); DWORD dwBufBits = dwWidth * dwHeight; COLORREF* btBufBits = new COLORREF[dwBufBits]; dwBufBits *= sizeof(COLORREF) / sizeof(BYTE); // 获得位图数据 GetBitmapBits(dwBufBits, btBufBits); // 判断图像像素点 for(int y = 0; y < (int)dwHeight; y++) { CRgn rgnTemp; int iX = 0; do { if( bCombineTrans ) { // 跳过非透明色找到下一个透明色的点 while( iX < (int)dwWidth && btBufBits[y * dwWidth + iX] != clrTrans ) iX++; // 记住这个起始点 int iLeftX = iX; // 寻找下个非透明色的点 while( iX < (int)dwWidth && btBufBits[y * dwWidth + iX] == clrTrans ) iX++; if( iLeftX == iX ) continue; // 创建一个包含起点与终点间高为1像素的临时"region" rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1); } else { // 跳过透明色找到下一个非透明色的点 while( iX < (int)dwWidth && btBufBits[y * dwWidth + iX] == clrTrans ) iX++; // 记住这个起始点 int iLeftX = iX; // 寻找下个透明色的点 while( iX < (int)dwWidth && btBufBits[y * dwWidth + iX] != clrTrans ) iX++; if( iLeftX == iX ) continue; // 创建一个包含起点与终点间高为1像素的临时"region" rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1); } // 合并到图片"region" rgnImg.CombineRgn(&rgnImg, &rgnTemp, RGN_OR); // 删除临时"region",否则下次创建时和出错 rgnTemp.DeleteObject(); }while( iX < (int)dwWidth ); } // END for(int y = 0; ...) END // 清理内存块 delete [] btBufBits; // 偏移图片区域 if( lpPoint ) rgnImg.OffsetRgn(*lpPoint); // 合并主区域 fulRgn.CombineRgn(&fulRgn, &rgnImg, nCombineMode); }
相关文章推荐
- 【经典算法】:英雄联盟中打字屏蔽系统的实现
- 算法系列之十二:多边形区域填充算法--扫描线种子填充算法
- 区域生长算法 C#
- 计算机图形学 学习笔记(三):多边形的区域填充算法,反走样算法
- JavaScript获得页面区域大小的代码
- 算法系列之十二:多边形区域填充算法--几种边标志填充算法 .
- 区域生长算法:
- 应用程序上屏蔽FLASH控件的右键菜单并获得左键消息
- 给定坐标点,判断是否在某区域范围内 地理围栏算法
- Android屏蔽EditTex获得焦点
- 区域增长算法实现图像分割(网络)
- 多边形区域填充算法--递归种子填充算法
- 算法系列之十二:多边形区域填充算法--扫描线种子填充算法
- java 虚拟机学习笔记整理001--运行时的数据区域+垃圾收集算法
- 区域生长算法原理及MATLAB实现
- jsp获得一个区域内的所有div对象
- 动物所piRNA的高精度预测算法研究获得突破
- 布隆算法Bitmap(位图算法)
- rt-thread的位图调度算法分析
- SLG中搜索某个角色可移动区域的算法