?? geotrans.cpp
字號(hào):
LocalFree(hBits); // 返回 return TRUE;}/************************************************************************* * * 函數(shù)名稱: * TransposeDIB() * * 參數(shù): * LPSTR lpDIB - 指向源DIB的指針 * * 返回值: * BOOL - 轉(zhuǎn)置成功返回TRUE,否則返回FALSE。 * * 說明: * 該函數(shù)用來轉(zhuǎn)置DIB圖像,即圖像x、y坐標(biāo)互換。函數(shù)將不會(huì)改變圖像的大小, * 但是圖像的高寬將互換。 * ************************************************************************/BOOL WINAPI TransposeDIB(LPSTR lpDIB){ // 圖像的寬度和高度 LONG lWidth; LONG lHeight; // 指向源圖像的指針 LPSTR lpDIBBits; // 指向源象素的指針 LPSTR lpSrc; // 指向轉(zhuǎn)置圖像對(duì)應(yīng)象素的指針 LPSTR lpDst; // 指向轉(zhuǎn)置圖像的指針 LPSTR lpNewDIBBits; HLOCAL hNewDIBBits; // 指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO結(jié)構(gòu)的指針 LPBITMAPCOREHEADER lpbmc; // 循環(huán)變量 LONG i; LONG j; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 新圖像每行的字節(jié)數(shù) LONG lNewLineBytes; // 獲取指針 lpbmi = (LPBITMAPINFOHEADER)lpDIB; lpbmc = (LPBITMAPCOREHEADER)lpDIB; // 找到源DIB圖像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 獲取圖像的"寬度"(4的倍數(shù)) lWidth = ::DIBWidth(lpDIB); // 獲取圖像的高度 lHeight = ::DIBHeight(lpDIB); // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 計(jì)算新圖像每行的字節(jié)數(shù) lNewLineBytes = WIDTHBYTES(lHeight * 8); // 暫時(shí)分配內(nèi)存,以保存新圖像 hNewDIBBits = LocalAlloc(LHND, lWidth * lNewLineBytes); // 判斷是否內(nèi)存分配失敗 if (hNewDIBBits == NULL) { // 分配內(nèi)存失敗 return FALSE; } // 鎖定內(nèi)存 lpNewDIBBits = (char * )LocalLock(hNewDIBBits); // 針對(duì)圖像每行進(jìn)行操作 for(i = 0; i < lHeight; i++) { // 針對(duì)每行圖像每列進(jìn)行操作 for(j = 0; j < lWidth; j++) { // 指向源DIB第i行,第j個(gè)象素的指針 lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; // 指向轉(zhuǎn)置DIB第j行,第i個(gè)象素的指針 // 注意此處lWidth和lHeight是源DIB的寬度和高度,應(yīng)該互換 lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lWidth - 1 - j) + i; // 復(fù)制象素 *lpDst = *lpSrc; } } // 復(fù)制轉(zhuǎn)置后的圖像 memcpy(lpDIBBits, lpNewDIBBits, lWidth * lNewLineBytes); // 互換DIB中圖像的高寬 if (IS_WIN30_DIB(lpDIB)) { // 對(duì)于Windows 3.0 DIB lpbmi->biWidth = lHeight; lpbmi->biHeight = lWidth; } else { // 對(duì)于其它格式的DIB lpbmc->bcWidth = (unsigned short) lHeight; lpbmc->bcHeight = (unsigned short) lWidth; } // 釋放內(nèi)存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); // 返回 return TRUE;}/************************************************************************* * * 函數(shù)名稱: * ZoomDIB() * * 參數(shù): * LPSTR lpDIB - 指向源DIB的指針 * float fXZoomRatio - X軸方向縮放比率 * float fYZoomRatio - Y軸方向縮放比率 * * 返回值: * HGLOBAL - 縮放成功返回新DIB句柄,否則返回NULL。 * * 說明: * 該函數(shù)用來縮放DIB圖像,返回新生成DIB的句柄。 * ************************************************************************/HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio){ // 源圖像的寬度和高度 LONG lWidth; LONG lHeight; // 縮放后圖像的寬度和高度 LONG lNewWidth; LONG lNewHeight; // 縮放后圖像的寬度(lNewWidth',必須是4的倍數(shù)) LONG lNewLineBytes; // 指向源圖像的指針 LPSTR lpDIBBits; // 指向源象素的指針 LPSTR lpSrc; // 縮放后新DIB句柄 HDIB hDIB; // 指向縮放圖像對(duì)應(yīng)象素的指針 LPSTR lpDst; // 指向縮放圖像的指針 LPSTR lpNewDIB; LPSTR lpNewDIBBits; // 指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO結(jié)構(gòu)的指針 LPBITMAPCOREHEADER lpbmc; // 循環(huán)變量(象素在新DIB中的坐標(biāo)) LONG i; LONG j; // 象素在源DIB中的坐標(biāo) LONG i0; LONG j0; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 找到源DIB圖像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 獲取圖像的寬度 lWidth = ::DIBWidth(lpDIB); // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 獲取圖像的高度 lHeight = ::DIBHeight(lpDIB); // 計(jì)算縮放后的圖像實(shí)際寬度 // 此處直接加0.5是由于強(qiáng)制類型轉(zhuǎn)換時(shí)不四舍五入,而是直接截去小數(shù)部分 lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5); // 計(jì)算新圖像每行的字節(jié)數(shù) lNewLineBytes = WIDTHBYTES(lNewWidth * 8); // 計(jì)算縮放后的圖像高度 lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5); // 分配內(nèi)存,以保存新DIB hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 判斷是否內(nèi)存分配失敗 if (hDIB == NULL) { // 分配內(nèi)存失敗 return NULL; } // 鎖定內(nèi)存 lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB); // 復(fù)制DIB信息頭和調(diào)色板 memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 找到新DIB象素起始位置 lpNewDIBBits = ::FindDIBBits(lpNewDIB); // 獲取指針 lpbmi = (LPBITMAPINFOHEADER)lpNewDIB; lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; // 更新DIB中圖像的高度和寬度 if (IS_WIN30_DIB(lpNewDIB)) { // 對(duì)于Windows 3.0 DIB lpbmi->biWidth = lNewWidth; lpbmi->biHeight = lNewHeight; } else { // 對(duì)于其它格式的DIB lpbmc->bcWidth = (unsigned short) lNewWidth; lpbmc->bcHeight = (unsigned short) lNewHeight; } // 針對(duì)圖像每行進(jìn)行操作 for(i = 0; i < lNewHeight; i++) { // 針對(duì)圖像每列進(jìn)行操作 for(j = 0; j < lNewWidth; j++) { // 指向新DIB第i行,第j個(gè)象素的指針 // 注意此處寬度和高度是新DIB的寬度和高度 lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j; // 計(jì)算該象素在源DIB中的坐標(biāo) i0 = (LONG) (i / fYZoomRatio + 0.5); j0 = (LONG) (j / fXZoomRatio + 0.5); // 判斷是否在源圖范圍內(nèi) if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)) { // 指向源DIB第i0行,第j0個(gè)象素的指針 lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; // 復(fù)制象素 *lpDst = *lpSrc; } else { // 對(duì)于源圖中沒有的象素,直接賦值為255 * ((unsigned char*)lpDst) = 255; } } } // 返回 return hDIB;}/************************************************************************* * * 函數(shù)名稱: * RotateDIB() * * 參數(shù): * LPSTR lpDIB - 指向源DIB的指針 * int iRotateAngle - 旋轉(zhuǎn)的角度(0-360度) * * 返回值: * HGLOBAL - 旋轉(zhuǎn)成功返回新DIB句柄,否則返回NULL。 * * 說明: * 該函數(shù)用來以圖像中心為中心旋轉(zhuǎn)DIB圖像,返回新生成DIB的句柄。 * 調(diào)用該函數(shù)會(huì)自動(dòng)擴(kuò)大圖像以顯示所有的象素。函數(shù)中采用最鄰近插 * 值算法進(jìn)行插值。 * ************************************************************************/HGLOBAL WINAPI RotateDIB(LPSTR lpDIB, int iRotateAngle){ // 源圖像的寬度和高度 LONG lWidth; LONG lHeight; // 旋轉(zhuǎn)后圖像的寬度和高度 LONG lNewWidth; LONG lNewHeight; // 圖像每行的字節(jié)數(shù) LONG lLineBytes; // 旋轉(zhuǎn)后圖像的寬度(lNewWidth',必須是4的倍數(shù)) LONG lNewLineBytes; // 指向源圖像的指針 LPSTR lpDIBBits; // 指向源象素的指針 LPSTR lpSrc; // 旋轉(zhuǎn)后新DIB句柄 HDIB hDIB; // 指向旋轉(zhuǎn)圖像對(duì)應(yīng)象素的指針 LPSTR lpDst; // 指向旋轉(zhuǎn)圖像的指針 LPSTR lpNewDIB; LPSTR lpNewDIBBits; // 指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO結(jié)構(gòu)的指針 LPBITMAPCOREHEADER lpbmc; // 循環(huán)變量(象素在新DIB中的坐標(biāo)) LONG i; LONG j; // 象素在源DIB中的坐標(biāo) LONG i0; LONG j0; // 旋轉(zhuǎn)角度(弧度) float fRotateAngle; // 旋轉(zhuǎn)角度的正弦和余弦 float fSina, fCosa; // 源圖四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn)) float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4; // 旋轉(zhuǎn)后四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn)) float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4; // 兩個(gè)中間常量 float f1,f2; // 找到源DIB圖像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 獲取圖像的"寬度"(4的倍數(shù)) lWidth = ::DIBWidth(lpDIB); // 計(jì)算圖像每行的字節(jié)數(shù) lLineBytes = WIDTHBYTES(lWidth * 8); // 獲取圖像的高度 lHeight = ::DIBHeight(lpDIB); // 將旋轉(zhuǎn)角度從度轉(zhuǎn)換到弧度 fRotateAngle = (float) RADIAN(iRotateAngle); // 計(jì)算旋轉(zhuǎn)角度的正弦 fSina = (float) sin((double)fRotateAngle); // 計(jì)算旋轉(zhuǎn)角度的余弦 fCosa = (float) cos((double)fRotateAngle); // 計(jì)算原圖的四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn)) fSrcX1 = (float) (- (lWidth - 1) / 2);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -