admin 管理员组

文章数量: 1087674


2024年3月27日发(作者:同步fifo和异步fifo的总结)

实验二图象的几何变换参考资料

1 平移

平移(translation)变换是几何变换中最简单的一种。初始坐标为(x

0

,y

0

)的点经过平移(t

x

,t

y

)(以向

右,向下为正方向)后,坐标变为(x

1

,y

1

)。这两点之间的关系是x

1

=x

0

+t

x

,y

1

=y

0

+t

y

下面给出Translation的源代码。算法的思想是先将所有区域填成白色,然后找平移后显示

区域的左上角点(x

0

,y

0

) 和右下角点(x

1

,y

1

) ,分几种情况进行处理。

先看x方向(width指图象的宽度)

(1)

t

x

≤-width:很显然,图象完全移出了屏幕,不用做任何处理;

(2)

-width

(3)

0< t

x

x

到width,对应原图的范围从0到width - t

x

(4)

t

x

≥width:图象完全移出了屏幕,不用做任何处理。

y方向是对应的(height表示图象的高度):

(1)

t

y

≤-height,图象完全移出了屏幕,不用做任何处理;

(2)

-height

y

≤0,图象区域的y范围从0到height-|t

y

|,对应原图的范围从|t

y

|到height;

(3)

0

y

y

到height,对应原图的范围从0到height-t

y

(4)

t

y

≥height,图象完全移出了屏幕,不用做任何处理。

这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数,

从(x

0

,y

0

)点开始,一次可以拷贝一整行(宽度为x

1

-x

0

),然后将内存指针移到(x

0

,y

0

+1)处,拷

贝下一行。这样拷贝(y

1

-y

0

)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。

Translation的源代码如下:

int xOffset=0,yOffset=0;

BOOL Translation(HWND hWnd)

{

DLGPROC dlgInputBox = NULL;

DWORD OffBits,BufSize;

LPBITMAPINFOHEADER lpImgData;

LPSTR lpPtr;

HLOCAL hTempImgData;

LPBITMAPINFOHEADER lpTempImgData;

LPSTR lpTempPtr;

int SrcX0,SrcY0,SrcX1,SrcY1;

int DstX0,DstY0,DstX1,DstY1;

int RectWidth,RectHeight;

BOOL xVisible,yVisible;

HDC hDc;

HFILE hf;

int i;

//出现对话框,输入x偏移量xOffset,和y偏移量yOffset

dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox,ghInst );

DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox);

FreeProcInstance ( (FARPROC) dlgInputBox );

//OffBits为BITMAPINFOHEADER结构长度加调色板的大小

OffBits=its-sizeof(BITMAPFILEHEADER);

BufSize=OffBits+ht*LineBytes;//要开的缓冲区的大小

//为新产生的位图分配缓冲区内存


本文标签: 图象 范围 位图 内存 不用