① 如何通過C++編程實現掃描圖像。
掃描是最基本的特效顯示方式,它沒有劃分圖像塊,只是順序地一行一行或一列一列地顯示圖像。下面的程序是向下掃描的代碼實現。
/***************************************************************************函數名:* Scan(CDC *pDC)**函數參數:* CDC *pDC-指向設備環境的指針,用於顯示點陣圖數據**返回值:* 無**說明:該函數實現了圖像的掃描顯示的效果**************************************************************************/void SpecialEffectShow::Scan(CDC *pDC) //掃描顯示一幅圖像{int bitmapWidth=GetDimensions().cx;//獲得源圖像的寬度,以像素為單位int bitmapHeight=GetDimensions().cy;//獲得源圖像的高度,以像素為單位 CRect rect(0,0,bitmapWidth,bitmapHeight);//以源圖像的尺寸創建一個矩形CBrush brush(RGB(255,255,255)); //設置畫刷為白色pDC->FillRect(&rect,&brush);//將已經顯示出來的原圖像重新設置成白色,達到刷新屏幕的效果 LPBITMAPINFO pBitmapInfo=(BITMAPINFO*)m_lpBmpInfoHead;//為適應StretchDIBits函數的需要,將圖像信息頭指針強制轉換為LPBITMAPINFO類型 for(int j=0;j<bitmapHeight;j++)//掃描特效顯示的具體演算法{::StretchDIBits(pDC->GetSafeHdc(),0, j, bitmapWidth, 1,0, bitmapHeight-j, bitmapWidth, 1,m_pImgData, pBitmapInfo,DIB_RGB_COLORS, SRCCOPY);Sleep(3);//設置延時}}
以上代碼主要調用了StretchDIBits()函數,在SpecialEffectShow類的其他特效顯示中也都調用了該函數。StretchDIBits函數是全局的Win32 API函數,它的作用是拷貝源點陣圖中的一個矩形區域的數據,然後顯示到目標設備環境中的一個矩形中,如果源矩形和目標矩形的大小不一樣,StretchDIBits函數有壓縮或拉伸源點陣圖的功能。以下是該函數參數的說明。
int StretchDIBits(HDC hdc, // handle to DCint XDest, // x-coord of destination upper-left cornerint YDest, // y-coord of destination upper-left cornerint nDestWidth, // width of destination rectangleint nDestHeight, // height of destination rectangleint XSrc, // x-coord of source upper-left cornerint YSrc, // y-coord of source upper-left cornerint nSrcWidth, // width of source rectangleint nSrcHeight, // height of source rectangleCONST VOID *lpBits, // bitmap bitsCONST BITMAPINFO *lpBitsInfo, // bitmap dataUINT iUsage, // usage optionsDWORD dwRop // raster operation code);
HDC hdc:目標設備環境句柄;
XDest:目標矩形左上角的X坐標,坐標是邏輯單位,在MM_TEXT映射模式下,一個邏輯單位為一個像素(有關映射模式的問題,請讀者參考其他圖書或MSDN);
YDest:目標矩形左上角的Y坐標,坐標是邏輯單位;
nDestWidth:目標矩形的寬度,坐標是邏輯單位;
nDestHeight:目標矩形的高度,坐標是邏輯單位;
XSrc:指定源點陣圖圖像矩形的左上角的X坐標,坐標單位是圖像的像素;
YSrc:指定源點陣圖圖像矩形的左上角的Y坐標,坐標單位是圖像的像素;
nSrcWidth:源點陣圖圖像矩形的寬度,坐標單位是圖像的像素;
nSrcHeight:源點陣圖圖像矩形的高度,坐標單位是圖像的像素;
lpBits:源點陣圖數據指針;
lpBitsInfo:指向源點陣圖的BITMAPINFO結構的指針;
iUsage:函數使用方式,詳細參數說明請參考MSDN;
dwRop:當使用壓縮或拉伸功能時所使用的光柵模式,詳細參數說明請參考MSDN。
我們在視圖類CChap1_6View中映射「掃描顯示」菜單事件處理函數OnScan(),程序運行時,點擊「掃描顯示」菜單即可實現圖像的掃描顯示效果。下面是CChap1_6View:: OnScan()的代碼。
void CChap1_6View::OnScan() {//獲取文檔類中m_dib的指針,訪問當前DIB數據CChap1_6Doc *pDoc=GetDocument();ImgCenterDib *pDib=pDoc->GetPDib();
//只處理彩色圖像或灰度圖像
if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
::MessageBox(0,"只處理彩色和灰度圖像",MB_OK,0);
return ;
}
//定義SpecialEffectShow類的對象SpShow,用當前DIB數據為其初始化
SpecialEffectShow SpShow(pDib->GetDimensions(),
pDib->m_nBitCount,pDib->m_lpColorTable,pDib->m_pImgData);
//獲得設備環境變數
CClientDC aDC(this);
//調用掃描程序,傳遞設備環境指針
SpShow.Scan(&aDC);
}