📄 图像镜像.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 + -