⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geotrans.c

📁 该书是图像处理入门C代码解析
💻 C
📖 第 1 页 / 共 2 页
字号:
	SrcY0=DstY0-yOffset;

	SrcY1=DstY1-yOffset;

	RectHeight=DstY1-DstY0;



	if( xVisible && yVisible){

		for(i=0;i<RectHeight;i++){

			lpPtr=(char *)lpImgData+(BufSize-LineBytes-(i+SrcY0)*LineBytes)+SrcX0;

			lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-(i+DstY0)*LineBytes)+DstX0;

			memcpy(lpTempPtr,lpPtr,RectWidth);

		}

	}



	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);



    hf=_lcreat("c:\\translation.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;

}

////////////////////////////////////////////////////////////////

BOOL Rotation(HWND hWnd)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              OffBits,SrcBufSize,DstBufSize,DstLineBytes;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	float			   SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;

	float			   DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;

	DWORD              Wold,Hold,Wnew,Hnew;

	HDC                hDc;

	HFILE              hf;

	DWORD              x0,y0,x1,y1;

	float              cosa,sina; //cos(a),sin(a)

	float			   num1,num2;

	BITMAPFILEHEADER   DstBf;

	BITMAPINFOHEADER   DstBi;



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

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

	FreeProcInstance ( (FARPROC) dlgInputBox );

	

	RotateAngle=(float)RADIAN(RotateAngle);

	cosa=(float)cos((double)RotateAngle);

	sina=(float)sin((double)RotateAngle);



	Wold=bi.biWidth;

	Hold=bi.biHeight;

	SrcX1=(float)(-0.5*Wold);

	SrcY1=(float)(0.5*Hold);

	SrcX2=(float)(0.5*Wold);

	SrcY2=(float)(0.5*Hold);

	SrcX3=(float)(-0.5*Wold);

	SrcY3=(float)(-0.5*Hold);

	SrcX4=(float)(0.5*Wold);

	SrcY4=(float)(-0.5*Hold);



	DstX1=cosa*SrcX1+sina*SrcY1;

	DstY1=-sina*SrcX1+cosa*SrcY1;

	DstX2=cosa*SrcX2+sina*SrcY2;

	DstY2=-sina*SrcX2+cosa*SrcY2;

	DstX3=cosa*SrcX3+sina*SrcY3;

	DstY3=-sina*SrcX3+cosa*SrcY3;

	DstX4=cosa*SrcX4+sina*SrcY4;

	DstY4=-sina*SrcX4+cosa*SrcY4;



	Wnew = (DWORD)(max(fabs(DstX4-DstX1), fabs(DstX3-DstX2))+0.5);

    Hnew = (DWORD)(max(fabs(DstY4-DstY1), fabs(DstY3-DstY2))+0.5);

	num1=(float)( -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold);

	num2=(float)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold);



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);



	ImgWidth=Wnew;

	ImgHeight=Hnew;



	DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);

	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);



	if((hTempImgData=LocalAlloc(LHND,DstBufSize))==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,DstBufSize);

	memcpy(lpTempPtr,lpPtr,OffBits);

	

	//get new bitmapfileheader and bitmapinfoheader

	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

	memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

	DstBi.biWidth=Wnew;

	DstBi.biHeight=Hnew;



	//overwrite bitmapinfoheader with the new one

	memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));



	for(y1=0;y1<Hnew;y1++)

		for(x1=0;x1<Wnew;x1++){

			x0= (DWORD)(x1*cosa+y1*sina+num1);

			y0= (DWORD)(-1.0f*x1*sina+y1*cosa+num2);

			if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))

			{

				lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;

				lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;

				*lpTempPtr=*lpPtr;

			}

	}



	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);



    hf=_lcreat("c:\\rotation.bmp",0);

	_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL Mirror(HWND hWnd,BOOL XDirection)

{

	DWORD              OffBits,BufSize;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	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++){

				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++){

				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;

		}

	}



	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;

}

////////////////////////////////////////////////////////////////

BOOL Transpose(HWND hWnd)

{

	DWORD              OffBits,SrcBufSize,DstBufSize,DstLineBytes;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	DWORD              Wnew,Hnew;

	HDC                hDc;

	HFILE              hf;

	DWORD              x0,y0,x1,y1;

	BITMAPFILEHEADER   DstBf;

	BITMAPINFOHEADER   DstBi;



	Wnew = (DWORD)bi.biHeight;

    Hnew = (DWORD)bi.biWidth;



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);



	ImgWidth=Wnew;

	ImgHeight=Hnew;



	DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);

	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);



	if((hTempImgData=LocalAlloc(LHND,DstBufSize))==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,DstBufSize);

	memcpy(lpTempPtr,lpPtr,OffBits);

	

	//get new bitmapfileheader and bitmapinfoheader

	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

	memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

	DstBi.biWidth=Wnew;

	DstBi.biHeight=Hnew;



	//overwrite bitmapinfoheader with the new one

	memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));



	for(y1=0;y1<Hnew;y1++)

		for(x1=0;x1<Wnew;x1++){

			x0= y1;

			y0= x1;

			lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;

			lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;

			*lpTempPtr=*lpPtr;

		}

	

	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);



    hf=_lcreat("c:\\transpose.bmp",0);

	_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

////////////////////////////////////////////////////////////////

BOOL Zoom(HWND hWnd)

{

	DLGPROC            dlgInputBox = NULL;

	DWORD              OffBits,SrcBufSize,DstBufSize,DstLineBytes;

    LPBITMAPINFOHEADER lpImgData;

	LPSTR              lpPtr;

	HLOCAL             hTempImgData;

	LPBITMAPINFOHEADER lpTempImgData;

	LPSTR              lpTempPtr;

	DWORD              Wold,Hold,Wnew,Hnew;

	HDC                hDc;

	HFILE              hf;

	DWORD              x0,y0,x1,y1;

	float			   num1;

	BITMAPFILEHEADER   DstBf;

	BITMAPINFOHEADER   DstBi;



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

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

	FreeProcInstance ( (FARPROC) dlgInputBox );

	

	num1=(float)(1.0/ZoomRatio);

	Wold=bi.biWidth;

	Hold=bi.biHeight;

	Wnew = (DWORD)(Wold*ZoomRatio+0.5);

    Hnew = (DWORD)(Hold*ZoomRatio+0.5);



	OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

	SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);



	ImgWidth=Wnew;

	ImgHeight=Hnew;



	DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount);

	DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew);



	if((hTempImgData=LocalAlloc(LHND,DstBufSize))==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,DstBufSize);

	memcpy(lpTempPtr,lpPtr,OffBits);

	

	//get new bitmapfileheader and bitmapinfoheader

	memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));

	memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));

	DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

	DstBi.biWidth=Wnew;

	DstBi.biHeight=Hnew;



	//overwrite bitmapinfoheader with the new one

	memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER));



	for(y1=0;y1<Hnew;y1++)

		for(x1=0;x1<Wnew;x1++){

			x0= (DWORD)(x1*num1);

			y0= (DWORD)(y1*num1);

			if( (x0>=0) && (x0<Wold) && (y0>=0) && (y0<Hold))

			{

				lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y0*LineBytes)+x0;

				lpTempPtr=(char *)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1;

				*lpTempPtr=*lpPtr;

			}

	}



	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);



    hf=_lcreat("c:\\zoom.bmp",0);

	_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 

	_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);

	_lclose(hf);



 	ReleaseDC(hWnd,hDc);

	LocalUnlock(hTempImgData);

	LocalFree(hTempImgData);

	GlobalUnlock(hImgData);

	return TRUE;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -