- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
mydiblib.h
资源名称:gujiatiqu.rar [点击查看]
上传用户:yianco
上传日期:2022-07-15
资源大小:2047k
文件大小:19k
源码类别:
图形图象
开发平台:
Visual C++
- #include "dibapi.h"
- #include <iostream>
- #include <deque>
- #include <math.h>
- using namespace std;
- typedef deque<HDIB> HDIBLink;
- HDIB m_hDIB;
- CString strPathName;
- CString strPathNameSave;
- //声明一些必要的全局变量
- int m_lianXuShu;
- bool fileloaded;
- bool gyhfinished;
- /********************************function declaration*************************************/
- //清楚屏幕
- void ClearAll(CDC* pDC);
- //在屏幕上显示位图
- void DisplayDIB(CDC* pDC,HDIB hDIB);
- //将灰度图二值化
- void ConvertGrayToWhiteBlack(HDIB hDIB);
- //判断是否是离散噪声点
- bool DeleteScaterJudge(LPSTR lpDIBBits,WORD lLineBytes, LPBYTE lplab, int lWidth, int lHeight, int x, int y, CPoint lab[], int lianXuShu);
- //细化
- void Thinning(HDIB hDIB);
- void DisplayDIB(CDC* pDC,HDIB hDIB)
- {
- BYTE* lpDIB=(BYTE*)::GlobalLock((HGLOBAL)hDIB);
- // 获取DIB宽度和高度
- int cxDIB = ::DIBWidth((char*) lpDIB);
- int cyDIB = ::DIBHeight((char*)lpDIB);
- CRect rcDIB,rcDest;
- rcDIB.top = rcDIB.left = 0;
- rcDIB.right = cxDIB;
- rcDIB.bottom = cyDIB;
- //设置目标客户区输出大小尺寸
- rcDest = rcDIB;
- //CDC* pDC=GetDC();
- ClearAll(pDC);
- //在客户区显示图像
- //for(int ii=0;ii<10;ii++)
- ::PaintDIB(pDC->m_hDC,rcDest,hDIB,rcDIB,NULL);
- ::GlobalUnlock((HGLOBAL)hDIB);
- }
- void ClearAll(CDC *pDC)
- {
- CRect rect;
- //GetClientRect(&rect);
- rect.left =0;rect.top =0;rect.right =2000;rect.bottom =1000;
- CPen pen;
- pen.CreatePen (PS_SOLID,1,RGB(255,255,255));
- pDC->SelectObject (&pen);
- pDC->Rectangle (&rect);
- ::DeleteObject (pen);
- }
- /****************************************************************
- * 函数名称:
- * Convert256toGray()
- *
- * 参数:
- * HDIB hDIB -图像的句柄
- *
- * 返回值:
- * 无
- *
- * 功能:
- * 将256色位图转化为灰度图
- *
- ***************************************************************/
- void Convert256toGray(HDIB hDIB)
- {
- LPSTR lpDIB;
- // 由DIB句柄得到DIB指针并锁定DIB
- lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
- // 指向DIB象素数据区的指针
- LPSTR lpDIBBits;
- // 指向DIB象素的指针
- BYTE * lpSrc;
- // 图像宽度
- LONG lWidth;
- // 图像高度
- LONG lHeight;
- // 图像每行的字节数
- LONG lLineBytes;
- // 指向BITMAPINFO结构的指针(Win3.0)
- LPBITMAPINFO lpbmi;
- // 指向BITMAPCOREINFO结构的指针
- LPBITMAPCOREINFO lpbmc;
- // 获取指向BITMAPINFO结构的指针(Win3.0)
- lpbmi = (LPBITMAPINFO)lpDIB;
- // 获取指向BITMAPCOREINFO结构的指针
- lpbmc = (LPBITMAPCOREINFO)lpDIB;
- // 灰度映射表
- BYTE bMap[256];
- // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
- int i,j;
- for (i = 0; i < 256; i ++)
- {
- // 计算该颜色对应的灰度值
- bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
- 0.587 * lpbmi->bmiColors[i].rgbGreen +
- 0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);
- // 更新DIB调色板红色分量
- lpbmi->bmiColors[i].rgbRed = i;
- // 更新DIB调色板绿色分量
- lpbmi->bmiColors[i].rgbGreen = i;
- // 更新DIB调色板蓝色分量
- lpbmi->bmiColors[i].rgbBlue = i;
- // 更新DIB调色板保留位
- lpbmi->bmiColors[i].rgbReserved = 0;
- }
- // 找到DIB图像象素起始位置
- lpDIBBits = ::FindDIBBits(lpDIB);
- // 获取图像宽度
- lWidth = ::DIBWidth(lpDIB);
- // 获取图像高度
- lHeight = ::DIBHeight(lpDIB);
- // 计算图像每行的字节数
- lLineBytes = WIDTHBYTES(lWidth * 8);
- // 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
- //逐行扫描
- for(i = 0; i < lHeight; i++)
- {
- //逐列扫描
- for(j = 0; j < lWidth; j++)
- {
- // 指向DIB第i行,第j个象素的指针
- lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
- // 变换
- *lpSrc = bMap[*lpSrc];
- }
- }
- //解除锁定
- ::GlobalUnlock ((HGLOBAL)hDIB);
- }
- /******************************************************************
- *
- * 函数名称ConvertGrayToWhiteBlack()
- *
- * 参数 :HDIB hDIB -原图的句柄
- *
- * 返回值:无
- *
- * 功能: ConvertGrayToWhiteBlack函数采用硬阈值的方法,实现将图像二值化的功能。
- *
- * 说明:
- 要求待处理的图片为256色
- ************************************************************************/
- void ConvertGrayToWhiteBlack(HDIB hDIB)
- {
- // 指向DIB的指针
- LPSTR lpDIB;
- // 由DIB句柄得到DIB指针并锁定DIB
- lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
- // 指向DIB象素数据区的指针
- LPSTR lpDIBBits;
- // 指向DIB象素的指针
- BYTE * lpSrc;
- // 图像宽度
- LONG lWidth;
- // 图像高度
- LONG lHeight;
- // 图像每行的字节数
- LONG lLineBytes;
- // 找到DIB图像象素起始位置
- lpDIBBits = ::FindDIBBits(lpDIB);
- // 获取图像宽度
- lWidth = ::DIBWidth(lpDIB);
- // 获取图像高度
- lHeight = ::DIBHeight(lpDIB);
- // 计算图像每行的字节数
- lLineBytes = WIDTHBYTES(lWidth * 8);
- // 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
- int i,j;
- //逐行扫描
- for(i = 0; i < lHeight; i++)
- {
- //逐列扫描
- for(j = 0; j < lWidth; j++)
- {
- // 指向DIB第i行,第j个象素的指针
- lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j;
- // 二值化处理
- //大于220,设置为255,即白点
- if(*lpSrc>200) *lpSrc=255;
- //否则设置为0,即黑点
- else *lpSrc=0;
- }
- }
- //解除锁定
- ::GlobalUnlock((HGLOBAL)hDIB);
- }
- /************************************************************
- *
- * 函数名称:
- * RemoveScatterNoise()
- *
- * 参数:
- * HDIB hDIB -原图像的句柄
- *
- * 返回值:
- * 无
- *
- * 功能:
- * 通过对连续点长度的统计来去除离散杂点
- *
- * 说明:
- * 只能对2值图像进行处理
- ****************************************************************/
- void RemoveScatterNoise(HDIB hDIB)
- {
- // 指向DIB的指针
- LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
- // 指向DIB象素指针
- LPSTR lpDIBBits;
- // 找到DIB图像象素数据区的起始位置
- lpDIBBits = ::FindDIBBits(lpDIB);
- //获得图像的长度
- LONG lWidth=::DIBWidth ((char*)lpDIB);
- //获得图像的高度
- LONG lHeight=::DIBHeight ((char*)lpDIB);
- //设置判定噪声的长度阈值为15
- //即如果与考察点相连接的黑点的数目小于15则认为考察点是噪声点
- int length=15;
- // 循环变量
- m_lianXuShu=0;
- LONG i;
- LONG j;
- LONG k;
- // 图像每行的字节数
- LONG lLineBytes;
- // 计算图像每行的字节数
- lLineBytes = WIDTHBYTES(lWidth * 8);
- LPSTR lpSrc;
- //开辟一块用来存放标志的内存数组
- LPBYTE lplab = new BYTE[lHeight * lWidth];
- //开辟一块用来保存离散判定结果的内存数组
- bool *lpTemp = new bool[lHeight * lWidth];
- //初始化标志数组
- for (i=0;i<lHeight*lWidth;i++)
- {
- //将所有的标志位设置为非
- lplab[i] = false;
- }
- //用来存放离散点的坐标的数组
- CPoint lab[21];
- //为循环变量赋初始值
- k=0;
- //扫描整个图像
- //逐行扫描
- for(i =0;i<lHeight;i++)
- {
- //逐行扫描
- for(j=0;j<lWidth;j++)
- {
- //先把标志位置false
- for(k=0;k<m_lianXuShu;k++)
- lplab[lab[k].y * lWidth + lab[k].x] = false;
- //连续数置0
- m_lianXuShu =0;
- //进行离散性判断
- lpTemp[i*lWidth+j] = DeleteScaterJudge(lpDIBBits,(WORD)lLineBytes,lplab,lWidth,lHeight,j,i,lab,length);
- }
- }
- //扫描整个图像,把离散点填充成白色
- //逐行扫描
- for(i = 0;i<lHeight;i++)
- {
- //逐列扫描
- for(j=0;j<lWidth;j++)
- {
- //查看标志位,如果为非则将此点设为白点
- if(lpTemp[i*lWidth+j] == false)
- {
- //指向第i行第j个象素的指针
- lpSrc=(char*)lpDIBBits + lLineBytes * i + j;
- //将此象素设为白点
- *lpSrc=BYTE(255);
- }
- }
- }
- //解除锁定
- ::GlobalUnlock ((HGLOBAL)hDIB);
- }
- /*****************************************************************
- *
- * 函数名称
- * DeleteScaterJudge()
- *
- * 参数:
- * LPSTR lpDIBBits -指向象素起始位置的指针
- * WORD lLineBytes -图像每行的字节数
- * LPBYTE lplab -标志位数组
- * int lWidth -图像的宽度
- * int lHeight -图像的高度
- * int x -当前点的横坐标
- * int y -当前点的纵坐标
- * CPoint lab[] -存放议考察过的连续点坐标
- * int lianXuShu -离散点的判定长度
- *
- * 返回值:
- * Bool -是离散点返回false 不是离散点返回true
- *
- * 功能:
- * 利用递归算法统计连续点的个数,通过阈值来判定是否为离散点
- *
- * 说明:
- * 只能对2值图像进行处理
- ******************************************************************/
- bool DeleteScaterJudge(LPSTR lpDIBBits, WORD lLineBytes, LPBYTE lplab, int lWidth, int lHeight, int x, int y, CPoint lab[], int lianXuShu)
- {
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //长度加一
- m_lianXuShu++;
- //设定访问标志
- lplab[lWidth * y +x] = true;
- //保存访问点坐标
- lab[m_lianXuShu-1].x = x;
- lab[m_lianXuShu-1].y = y;
- //象素的灰度值
- int gray;
- //指向象素的指针
- LPSTR lpSrc;
- //长度判定
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //下面进入递归
- else
- {
- //考察上下左右以及左上、右上、左下、右下八个方向
- //如果是黑色点,则调用函数自身进行递归
- //考察下面点
- lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y-1 >=0 && gray == 0 && lplab[(y-1)*lWidth+x] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x,y-1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //左下点
- lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x-1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y-1 >=0 && x-1 >=0 && gray== 0 && lplab[(y-1)*lWidth+x-1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y-1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //左边
- lpSrc=(char*)lpDIBBits + lLineBytes * y + x-1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(x-1 >=0 && gray== 0 && lplab[y*lWidth+x-1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //左上
- lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x-1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y+1 <lHeight && x-1 >= 0 && gray == 0 && lplab[(y+1)*lWidth+x-1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x-1,y+1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //上面
- lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y+1 < lHeight && gray == 0 && lplab[(y+1)*lWidth+x] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x,y+1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //右上
- lpSrc=(char*)lpDIBBits + lLineBytes * (y+1) + x+1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y+1 <lHeight && x+1 <lWidth && gray == 0 && lplab[(y+1)*lWidth+x+1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y+1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //右边
- lpSrc=(char*)lpDIBBits + lLineBytes * y + x+1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(x+1 <lWidth && gray==0 && lplab[y*lWidth+x+1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- //右下
- lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x+1;
- //传递灰度值
- gray=*lpSrc;
- //如果点在图像内、颜色为黑色并且没有被访问过
- if(y-1 >=0 && x+1 <lWidth && gray == 0 && lplab[(y-1)*lWidth+x+1] == false)
- //进行递归处理
- DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y-1,lab,lianXuShu);
- //判断长度
- //如果连续长度满足要求,说明不是离散点,返回
- if(m_lianXuShu>=lianXuShu)
- return TRUE;
- }
- //如果递归结束,返回false,说明是离散点
- return FALSE;
- }
- //细化算法
- BOOL WINAPI ThiningDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
- {
- // 指向源图像的指针
- LPSTR lpSrc;
- // 指向缓存图像的指针
- LPSTR lpDst;
- // 指向缓存DIB图像的指针
- LPSTR lpNewDIBBits;
- HLOCAL hNewDIBBits;
- LONG lLineBytes=WIDTHBYTES(lWidth * 8);
- //脏标记
- BOOL bModified;
- //循环变量
- long i;
- long j;
- int n;
- int m;
- //四个条件
- BOOL bCondition1;
- BOOL bCondition2;
- BOOL bCondition3;
- BOOL bCondition4;
- bool bNotCondition5;
- //计数器
- unsigned char nCount;
- //像素值
- unsigned char pixel;
- //5×5相邻区域像素值
- unsigned char neighbour[5][5];
- // 暂时分配内存,以保存新图像
- hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
- if (hNewDIBBits == NULL)
- {
- // 分配内存失败
- return FALSE;
- }
- // 锁定内存
- lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
- // 初始化新分配的内存,设定初始值为255
- lpDst = (char *)lpNewDIBBits;
- memset(lpDst, (BYTE)255,lLineBytes * lHeight);
- bModified=TRUE;
- while(bModified)
- {
- bModified = FALSE;
- // 初始化新分配的内存,设定初始值为255
- lpDst = (char *)lpNewDIBBits;
- memset(lpDst, (BYTE)255, lLineBytes* lHeight);
- for(j = 2; j <lHeight-2; j++)
- {
- for(i = 2;i <lWidth-2; i++)
- {
- bCondition1 = FALSE;
- bCondition2 = FALSE;
- bCondition3 = FALSE;
- bCondition4 = FALSE;
- bNotCondition5=true;
- //由于使用5×5的结构元素,为防止越界,所以不处理外围的几行和几列像素
- // 指向源图像倒数第j行,第i个象素的指针
- lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
- // 指向目标图像倒数第j行,第i个象素的指针
- lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
- //取得当前指针处的像素值,注意要转换为unsigned char型
- pixel = (unsigned char)*lpSrc;
- //目标图像中含有0和255外的其它灰度值
- if(pixel != 255 && *lpSrc != 0)
- //return FALSE;
- continue;
- //如果源图像中当前点为白色,则跳过
- else if(pixel == 255)
- continue;
- //获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
- for (m = 0;m < 5;m++ )
- {
- for (n = 0;n < 5;n++)
- {
- neighbour[m][n] =(255 - (unsigned char)*(lpSrc + ((4 - m) - 2)*lLineBytes + n - 2 )) / 255;
- }
- }
- // neighbour[][]
- //逐个判断条件。
- //判断2<=NZ(P1)<=6
- nCount = neighbour[1][1] + neighbour[1][2] + neighbour[1][3]+ neighbour[2][1] + neighbour[2][3] +
- + neighbour[3][1] + neighbour[3][2] + neighbour[3][3];
- if ( nCount >= 2 && nCount <=6)
- bCondition1 = TRUE;
- //判断Z0(P1)=1
- nCount = 0;
- if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
- nCount++;
- if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
- nCount++;
- if (neighbour[2][1] == 0 && neighbour[3][1] == 1)
- nCount++;
- if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
- nCount++;
- if (neighbour[3][2] == 0 && neighbour[3][3] == 1)
- nCount++;
- if (neighbour[3][3] == 0 && neighbour[2][3] == 1)
- nCount++;
- if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
- nCount++;
- if (neighbour[1][3] == 0 && neighbour[1][2] == 1)
- nCount++;
- if (nCount == 1)
- bCondition2 = TRUE;
- if(neighbour[1][2]+neighbour[1][1]+neighbour[2][1]+
- neighbour[3][1]+neighbour[3][2]+neighbour[3][3]+
- neighbour[2][3]+neighbour[1][3]==1)
- bNotCondition5=false;
- //判断P2*P4*P8=0 or Z0(p2)!=1
- if (neighbour[1][2]*neighbour[2][1]*neighbour[2][3] == 0)
- bCondition3 = TRUE;
- else
- {
- nCount = 0;
- if (neighbour[0][2] == 0 && neighbour[0][1] == 1)
- nCount++;
- if (neighbour[0][1] == 0 && neighbour[1][1] == 1)
- nCount++;
- if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
- nCount++;
- if (neighbour[2][1] == 0 && neighbour[2][2] == 1)
- nCount++;
- if (neighbour[2][2] == 0 && neighbour[2][3] == 1)
- nCount++;
- if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
- nCount++;
- if (neighbour[1][3] == 0 && neighbour[0][3] == 1)
- nCount++;
- if (neighbour[0][3] == 0 && neighbour[0][2] == 1)
- nCount++;
- if (nCount != 1)
- bCondition3 = TRUE;
- }
- //判断P2*P4*P6=0 or Z0(p4)!=1
- if (neighbour[1][2]*neighbour[2][1]*neighbour[3][2] == 0)
- bCondition4 = TRUE;
- else
- {
- nCount = 0;
- if (neighbour[1][1] == 0 && neighbour[1][0] == 1)
- nCount++;
- if (neighbour[1][0] == 0 && neighbour[2][0] == 1)
- nCount++;
- if (neighbour[2][0] == 0 && neighbour[3][0] == 1)
- nCount++;
- if (neighbour[3][0] == 0 && neighbour[3][1] == 1)
- nCount++;
- if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
- nCount++;
- if (neighbour[3][2] == 0 && neighbour[2][2] == 1)
- nCount++;
- if (neighbour[2][2] == 0 && neighbour[1][2] == 1)
- nCount++;
- if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
- nCount++;
- if (nCount != 1)
- bCondition4 = TRUE;
- }
- if(bCondition1 && bCondition2 && bCondition3 && bCondition4&&bNotCondition5)
- {
- *lpDst = (unsigned char)255;
- bModified = TRUE;
- }
- else
- {
- *lpDst = (unsigned char)0;
- }
- }
- }
- // 复制腐蚀后的图像
- memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
- }
- // 复制腐蚀后的图像
- memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);
- // 释放内存
- LocalUnlock(hNewDIBBits);
- LocalFree(hNewDIBBits);
- // 返回
- return TRUE;
- }
- void Thinning(HDIB hDIB)
- {
- // 指向DIB的指针
- LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
- // 指向DIB象素指针
- LPSTR lpDIBBits;
- // 找到DIB图像象素起始位置
- lpDIBBits = ::FindDIBBits(lpDIB);
- //图像的高度和宽度
- LONG lWidth;
- LONG lHeight;
- //获取图像的宽度
- lWidth=::DIBWidth ((char*)lpDIB);
- //获取图像的高度
- lHeight=::DIBHeight ((char*)lpDIB);
- ThiningDIB(lpDIBBits,lWidth,lHeight);
- //清空内存
- ::GlobalUnlock ((HGLOBAL)hDIB);
- return;
- }