//圖像預處理第8步:緊縮重排已經分割完畢的數字字符,並造成新的位圖句柄 void CChildView::OnImgprcShrinkAlign() { m_hDIB=AutoAlign(m_hDIB); //在屏幕上顯示位圖 CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); DrawFrame(pDC,m_hDIB,m_charRect,1,RGB(252,115,27)); }
/******************************************* * * 函數名稱: * AutoAlign() * * 參數: * HDIB hDIB -原圖像的句柄 * * 返回值 * HDIB -緊縮排列後的新圖像的句柄 * * 功能: * 將通過了標準化處理的字符進行規整的排列,以方便下一步的處理 * * 說明: * 緊縮排列的操做必須在標準化操做以後進行 * ********************************************************/ HDIB AutoAlign(HDIB hDIB) { //指向圖像的指針 BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB); //指向象素起始位置的指針 BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB); //指向象素的指針 BYTE* lpSrc; //獲取圖像的寬度 LONG lWidth=::DIBWidth ((char*)lpDIB); //獲取圖像的高度 LONG lHeight=::DIBHeight ((char*)lpDIB); //獲取標準化的寬度 int w=m_charRect.front ().Width() ; //獲取標準化的高度 int h=m_charRect.front ().Height() ; //創建一個新的圖像正好可以將標準化的字符並排放置 HDIB hNewDIB=::NewDIB (digicount*w,h,8); //指向新的圖像的指針 BYTE* lpNewDIB=(BYTE*) ::GlobalLock((HGLOBAL)hNewDIB); //指向象素起始位置的指針 BYTE* lpNewDIBBits=(BYTE*)::FindDIBBits((char*)lpNewDIB); //指向象素的指針 BYTE* lpDst=lpNewDIBBits; //計算原圖像每行的字節數 LONG lLineBytes=(lWidth+3)/4*4; //計算新圖像每行的字節數 LONG lLineBytesnew =(digicount*w+3)/4*4; //將新的圖像初始化爲白色 memset(lpDst,(BYTE)255,lLineBytesnew * h); //映射操做的座標變量 int i_src,j_src; //循環變量 int i,j; //統計字符個數的變量 int counts=0; //存放位置信息的結構體 CRect rect,rectnew; //清空一個新的鏈表來存放新的字符位置信息 m_charRectCopy.clear (); //從頭到尾逐個掃描原鏈表的各個結點 while(!m_charRect.empty() ) { //從表頭上獲得一個矩形框 rect=m_charRect.front (); //將這個矩形框從鏈表上刪除 m_charRect.pop_front (); //計算新的矩形框的位置信息 //左邊界 rectnew.left =counts*w; //右邊界 rectnew.right =(counts+1)*w; //上邊界 rectnew.top =0; //下邊界 rectnew.bottom =h; //將得到的新的矩形框插入到新的鏈表中 m_charRectCopy.push_back (rectnew); //將原矩形框內的象素映射到新的矩形框中 for(i=0;i<h;i++) { for(j=counts*w;j<(counts+1)*w;j++) { //計算映射座標 i_src=rect.top +i; j_src=rect.left +j-counts*w; //進行象素的映射 lpSrc=(BYTE *)lpDIBBits + lLineBytes * i_src + j_src; lpDst=(BYTE *)lpNewDIBBits + lLineBytesnew * i + j; *lpDst=*lpSrc; } } //字符個數加1 counts++; } //將得到的新的鏈表複製到原鏈表中,以方便下一次的調用 m_charRect=m_charRectCopy; //解除鎖定 ::GlobalUnlock (hDIB); ::GlobalUnlock (hNewDIB); return hNewDIB; }
運行結果:函數