影象幾何變換之影象位置變換之影象映象
映象是兩個物體關於中軸線對稱的一種狀態。
影象的映象分為兩種:水平映象、垂直映象
水平映象:是將影象左半部分和右半部分以影象垂直中軸線為中心進行映象對換
垂直映象:是將影象上半部分和下半部分以影象水平中軸線為中心進行映象對換。
演算法描述:
1)將源影象儲存到緩衝區,並記錄下緩衝區的地址。
2)分配記憶體,以儲存映象後的影象。
3)確定影象的映象方式,是水平映象還是垂直映象。
4)根據設定的映象方式及源圖中每個畫素點的座標值,計算出映象後各畫素點的新座標值,實現影象的映象。
/*************************************************************************
* 函式名稱:Mirror(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
* 函式引數:
LPSTR lpSrcStartBits,指向DIB起始畫素的指標
long lWidth,DIB影象的寬度
long lHeight,DIB影象的高度
long lLineBytes,DIB影象的行位元組數,為4的倍數
* 函式型別:BOOL
* 函式功能:該函式用來映象DIB影象,本程式只實現了水平映象,垂直映象的原理書中也談到。 很容易實現
************************************************************************/
BOOL Mirror(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
{
long i; //行迴圈變數
long j; //列迴圈變數
LPSTR lpSrcDIBBits; //指向源畫素的指標
LPSTR lpDstDIBBits; //指向臨時影象對應畫素的指標
HLOCAL hDstDIBBits; //臨時影象控制代碼
LPSTR lpBits; // 指向中間畫素的指標,當複製影象時,提供臨時的畫素記憶體空間
hDstDIBBits= LocalAlloc(LHND, lLineBytes);// 分配臨時記憶體儲存行影象
if (hDstDIBBits == NULL)
{
return FALSE; // 分配記憶體失敗
}
lpDstDIBBits= (char * )LocalLock(hDstDIBBits);// 鎖定
for(i = 0; i < lHeight; i++)// 水平映象,針對影象每行進行操作
{
for(j = 0; j < lWidth / 2; j++)// 針對每行影象左半部分進行操作
{
lpSrcDIBBits= (char *)lpSrcStartBits + lLineBytes * i + j;// 指向倒數第i行,第j個畫素的指標
lpBits= (char *)lpSrcStartBits + lLineBytes * (i + 1) - j;// 指向倒數第i+1行,倒數第j個畫素的指標
*lpDstDIBBits=*lpBits;//儲存中間畫素
*lpBits = *lpSrcDIBBits;// 將倒數第i行,第j個畫素複製到倒數第i行,倒數第j個畫素
*lpSrcDIBBits=*lpDstDIBBits;// 將倒數第i行,倒數第j個畫素複製到倒數第i行,第j個畫素
}
}
LocalUnlock(hDstDIBBits);// 釋放記憶體
LocalFree(hDstDIBBits);
return TRUE;
}
/*************************************************************************
* 函式名稱:Mirror2(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
* 函式引數:
LPSTR lpSrcStartBits,指向DIB起始畫素的指標
long lWidth,DIB影象的寬度
long lHeight,DIB影象的高度
long lLineBytes,DIB影象的行位元組數,為4的倍數
* 函式型別:BOOL
* 函式功能:該函式用來垂直映象DIB影象
************************************************************************/
BOOL Mirror2(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes)
{
long i; //行迴圈變數
long j; //列迴圈變數
LPSTR lpSrcDIBBits; //指向源畫素的指標
LPSTR lpDstDIBBits; //指向臨時影象對應畫素的指標
HLOCAL hDstDIBBits; //臨時影象控制代碼
LPSTR lpBits; // 指向中間畫素的指標,當複製影象時,提供臨時的畫素記憶體空間
hDstDIBBits= LocalAlloc(LHND, lLineBytes);// 分配臨時記憶體儲存行影象
if (hDstDIBBits == NULL)
{
return FALSE; // 分配記憶體失敗
}
lpDstDIBBits= (char * )LocalLock(hDstDIBBits);// 鎖定
for(i = 0; i < lHeight / 2; i++)// 垂直映象,針對影象每行進行操作
{
//for(j = 0; j < lWidth / 2; j++)// 針對每行影象左半部分進行操作
//{
lpSrcDIBBits= (char *)lpSrcStartBits + lLineBytes * i ;//+ j;// 指向倒數第i行,第j個畫素的指標
lpBits= (char *)lpSrcStartBits + lLineBytes * (lHeight - i + 1);// - j;// 指向倒數第i+1行,倒數第j個畫素的指標
memcpy(lpDstDIBBits, lpBits, lLineBytes);
memcpy(lpBits, lpSrcDIBBits, lLineBytes);
memcpy(lpSrcDIBBits, lpDstDIBBits, lLineBytes);
//*lpDstDIBBits=*lpBits;//儲存中間畫素
//*lpBits = *lpSrcDIBBits;// 將倒數第i行,第j個畫素複製到倒數第i行,倒數第j個畫素
//*lpSrcDIBBits=*lpDstDIBBits;// 將倒數第i行,倒數第j個畫素複製到倒數第i行,第j個畫素
//}
}
LocalUnlock(hDstDIBBits);// 釋放記憶體
LocalFree(hDstDIBBits);
return TRUE;
}
VC程式設計實現(基於VS2010):