?? 圖像鏡像.txt
字號:
////////////////////////////////////////////////////////////////
//函數參數:
//hWnd是窗口句柄
//Xdirection 是鏡像方向
//函數說明:該函數根據輸入的方向參數實現窗口圖像的鏡像處理
BOOL Mirror(HWND hWnd,BOOL XDirection)
{
//偏移和內存大小
DWORD OffBits,BufSize;
//文件信息頭指針
LPBITMAPINFOHEADER lpImgData;
//數據去指針
LPSTR lpPtr;
//局部指針
HLOCAL hTempImgData;
//暫存作用的文件信息頭指針
LPBITMAPINFOHEADER lpTempImgData;
//暫存用的數據區指針
LPSTR lpTempPtr;
//定義DC
HDC hDc;
//文件句柄
HFILE hf;
//計算象素的數據區位置時用
LONG x0,y0,x1,y1;
//得到數據到文件頭的偏移
OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
//得到源文件所需的內存大小
BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
//內存檢查
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
//鎖定數據區
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
//指向數據區
lpPtr=(char *)lpImgData;
lpTempPtr=(char *)lpTempImgData;
//初始化內存
memset(lpTempPtr,(BYTE)255,BufSize);
memcpy(lpTempPtr,lpPtr,OffBits);
//橫向鏡像
if( XDirection){
for(y1=0;y1<bi.biHeight;y1++)
for(x1=0;x1<bi.biWidth;x1++){
//得到當前點的y中軸線對稱點坐標
x0=bi.biWidth-1-x1;
y0=y1;
//得到源數據區位置
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y0*LineBytes)+x0;
//得到目標區位置
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y1*LineBytes)+x1;
//賦值
*lpTempPtr=*lpPtr;
}
}
//縱向鏡像
else{
//掃描整個圖像
for(y1=0;y1<bi.biHeight;y1++)
for(x1=0;x1<bi.biWidth;x1++){
//得到當前點的x中軸線的對稱點坐標
x0=x1;
y0=bi.biHeight-1-y1;
//得到源數據區位置
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y0*LineBytes)+x0;
//得到新數據區位置
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y1*LineBytes)+x1;
//賦值
*lpTempPtr=*lpPtr;
}
}
//得到窗口的DC
hDc=GetDC(hWnd);
if(hBitmap!=NULL)
DeleteObject(hBitmap);
//創建位圖
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
//創建并保存文件
if( XDirection)
hf=_lcreat("c:\\mirrorx.bmp",0);
else
hf=_lcreat("c:\\mirrory.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//釋放資源
ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -