镜象(mirror)分水平镜象和垂直镜象两种。
镜象的变换矩阵很简单。设原图宽为w,高为h,变换后,图的宽和高不变。
水平镜象的变化矩阵为:
垂直镜象的变化矩阵为:
这里代码是在View.cpp里面加的:
void CMyView::OnShuiping()
{
// TODO: Add your command handler code here
CMyDoc* poc=GetDocument();
Bianhuan(poc->bmpdata,poc->m_info.biWidth,poc->m_info.biHeight);
}
void CMyView::Bianhuan(BYTE* shuju,int width,int height)
{
BYTE *data;//临时数据存储
BYTE *yuan;//原来的数据地址
BYTE *bian;//改变后的地址
int x0,y0;//原来的坐标
int x1,y1;//改变后的坐标
LONG zijie;//字节
zijie = WIDTHBYTES(width * 8);
data=(BYTE *)new BYTE[zijie*height];
for(x1=0;x1<height;x1++)
for(y1=0;y1<width;y1++)
{
y0=width-1-y1;//横向改变
x0=x1;//纵向不改变
bian=data+zijie*x0+y0;
yuan=shuju+zijie*x1+y1;
*bian=*yuan;
}
memcpy(shuju,data,zijie*height);
delete [] data;
Invalidate();
}
void CMyView::OnChuizhi()
{
// TODO: Add your command handler code here
CMyDoc* rc=GetDocument();
chuizhi(rc->bmpdata,rc->m_info.biWidth,rc->m_info.biHeight);
}
void CMyView::chuizhi(BYTE* shuju,int width,int height)
{
BYTE *data;//临时数据存储
BYTE *yuan;//原来的数据地址
BYTE *bian;//改变后的地址
int x0,y0;//原来的坐标
int x1,y1;//改变后的坐标
LONG zijie;//字节
zijie = WIDTHBYTES(width * 8);
data=(BYTE *)new BYTE[zijie*height];
for(x1=0;x1<height;x1++)
for(y1=0;y1<width;y1++)
{
y0=y1;
x0=height-1-x1;
bian=data+zijie*x0+y0;
yuan=shuju+zijie*x1+y1;
*bian=*yuan;
}
memcpy(shuju,data,zijie*height);
delete [] data;
Invalidate();
}