圖像預處理第8步:緊縮重排數字字符

//圖像預處理第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;
}

運行結果:函數

相關文章
相關標籤/搜索