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

📄 showpixview.cpp

📁 在vc++中调试运行通过.可以进行图像几何变换。一个不错的程序哦!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//建立临时数组
    int *pix=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
	
	//边缘检测
    for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
	{	 
		for(  j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
		{
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{}
			else
			{ 			
				
				pix[i*p+j]=                          abs(m_pData[((i-1)*p)+j+1]+
					2*m_pData[(i*p)+j+1]+
					m_pData[((i+1)*p)+j+1]-
					m_pData[((i-1)*p)+j-1]-
					2*m_pData[(i*p)+j-1]-
					m_pData[((i+1)*p)+j-1])
					
					+
					
					abs(m_pData[((i+1)*p)+j-1]+
					2*m_pData[((i+1)*p)+j]+
					m_pData[(i+1)*p+j+1]-
					m_pData[((i-1)*p)+j-1]-
					2*m_pData[((i-1)*p)+j]-
					m_pData[((i-1)*p)+j+1]);
				
				
				//灰度超过255按255来计,小于0按0来计
				if( pix[i*p+j]>255)
					pix[i*p+j]=255;
				else
				{
					if( pix[i*p+j]<0)
						pix[i*p+j]=0;
				}
				
			}
			
		}
	}
	
	// 赋值
			 for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
			 {
				 
				 for(  j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )			  
					 m_pData[i*p+j]=pix[i*p+j];			  
			 }
			 free(pix);
			 
			 Invalidate();
}

void CShowPixView::OnGaus() 
{
	// TODO: Add your command handler code here
	m_flag=0;
    int i,j;
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	//建立临时数组
	int *pix1=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
	
    for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
	{	 
		for(  j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
		{
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1
				||j==1||j==m_info->bmiHeader.biWidth-2||i==1||i==m_info->bmiHeader.biHeight-2)
			{}
			
			else
			{
				pix1[i*p+j]=(24*m_pData[i*p+j]+
					8*m_pData[(i+1)*p+j]+
					8*m_pData[(i-1)*p+j]+
					8*m_pData[i*p+j+1]+
					8*m_pData[i*p+j-1]-
					4*m_pData[(i-2)*p+j+1]-
					4*m_pData[(i-2)*p+j-1]-
					4*m_pData[(i-2)*p+j]-
					4*m_pData[(i+2)*p+j+1]-
					4*m_pData[(i+2)*p+j-1]-
					4*m_pData[(i+2)*p+j]-
					4*m_pData[(i-1)*p+j-2]-
					4*m_pData[(i-1)*p+j+2]-
					4*m_pData[(i+1)*p+j-2]-
					4*m_pData[(i+1)*p+j+2]-
					4*m_pData[i*p+j-2]-
					4*m_pData[i*p+j+2]-
					2*m_pData[(i-2)*p+j-2]-
					2*m_pData[(i-2)*p+j+2]-
					2*m_pData[(i+2)*p+j-2]-
					2*m_pData[(i+2)*p+j+2]);
				
				//灰度超过255按255来计,小于0按0来计
				if( pix1[i*p+j]>255)
					pix1[i*p+j]=255;
				else
				{
					if( pix1[i*p+j]<0)
						pix1[i*p+j]=0;
				}           
				
			}
		} 
	}
	
	//赋值
	for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
	{
		
		for(  j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )			  
			m_pData[i*p+j]=pix1[i*p+j];			  
	}
	free(pix1);
	Invalidate();
}

void CShowPixView::OnFileOpen() 
{
	
	//设置标志位
	m_flag=0;
	
	
	// TODO: Add your command handler code here
	//打开文本对话框
	CFileDialog bmp(true,"bmp",NULL,OFN_HIDEREADONLY,"Bitamp Files (*.bmp)|*.bmp|All files (*.*)|*.*||");
	if(bmp.DoModal()==IDOK)
	{
		CString string=bmp.GetPathName();
		
		//打开文件
		CFile file;
		file.Open(string,CFile::modeRead);
		
		//读取位图文件头
		BITMAPFILEHEADER header;
		file.Read(&header,sizeof(BITMAPFILEHEADER));
		
		//读取位图信息
		if( m_info )
		{
			delete [] m_info;
			m_info = NULL;
		}
		
		if( m_pData )
		{
			delete [] m_pData;
			m_pData = NULL;
		}
		m_info=(PBITMAPINFO)new BYTE [40+256*4];
		file.Read(m_info,40+256*4);
		//位图大小
		DWORD dwSizeOfImg = (m_info->bmiHeader.biWidth+3)/4*4*m_info->bmiHeader.biHeight;
		
		//读取数据区
		m_pData=new BYTE[dwSizeOfImg];
		file.Read( m_pData, dwSizeOfImg );
		
		//关闭文件
		file.Close();
		
		//更新视图
		Invalidate();
		
	}
}

void CShowPixView::OnMove() 
{
	// TODO: Add your command handler code here
    
    int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	CMoveDialog dlg;
	int move[2]={0,0};
	dlg.m_move1=move[0];
	dlg.m_move2=move[1];
	if(dlg.DoModal()==IDOK)
	{
		move[0]=dlg.m_move1;
		move[1]=dlg.m_move2;	
		
		
		int i,j;
		
		for( i=0; i<m_info->bmiHeader.biHeight; i++)
		{	 
			for( j=m_info->bmiHeader.biWidth-1; j>-1; j--)
			{ 
				if(j>=move[1] && i<(m_info->bmiHeader.biHeight-move[0]))
				{
					m_pData[i*p+j]=m_pData[(i+move[0])*p+(j-move[1])];
				}
			}
		}
		
		for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
		{			 
			for(  j =0; j <m_info->bmiHeader.biWidth; j=j+1 )
			{	 
				if (i>=(m_info->bmiHeader.biHeight-move[0])||j<move[1])
				{
					m_pData[i*p+j]=255;
				}			
			}							    
		}
		
		Invalidate();
	}
	
}

void CShowPixView::OnXmirro() 
{
	// TODO: Add your command handler code here
    m_flag=0;
	int i,j;
	
	int temp=0;
	
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
	{
		
		for(  j =0; j < m_info->bmiHeader.biWidth/2; j=j+1 )
		{
			temp=m_pData[i*p+(m_info->bmiHeader.biWidth-j-1)];
			m_pData[i*p+(m_info->bmiHeader.biWidth-j-1)]=m_pData[i*p+j];
			m_pData[i*p+j]=temp;
			
		}
	}
	Invalidate();
}



void CShowPixView::OnYmirro() 
{
	// TODO: Add your command handler code here
	m_flag=0;
	int i,j;
	
	int temp=0;
	
    int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	for( i = 0; i < m_info->bmiHeader.biWidth; i=i+1 )
	{			 
		for(  j =0; j < (m_info->bmiHeader.biHeight)/2; j=j+1 )
		{
			temp=m_pData[(m_info->bmiHeader.biHeight-j-1)*p+i];
			m_pData[(m_info->bmiHeader.biHeight-j-1)*p+i]=m_pData[j*p+i];
			m_pData[j*p+i]=temp;
			
		}
	}
	Invalidate();
}



void CShowPixView::OnTranspose() 
{
	// TODO: Add your command handler code here
	m_flag=0;
	int i,j;
	
	int nHeight = m_info->bmiHeader.biWidth;
	int nWidth = m_info->bmiHeader.biHeight;
	
    int nPixNew=(nWidth+3)/4*4;
	int nPixOld=(nHeight+3)/4*4;
	
	//建立临时数组
	BYTE *pDataNew = new BYTE[nPixNew*nHeight];
	
	for( i = 0; i <nHeight; i=i+1 )
	{			 
		for(  j =0; j <nWidth; j=j+1 )
		{
			pDataNew[(nHeight-1-i)*nPixNew+j]=
				m_pData[(nWidth-1-j)*nPixOld+i];
			
		}
	}
	if(m_pData)
	{
		delete[] m_pData;
		m_pData=NULL;
	}
    m_pData=pDataNew;
	
	m_info->bmiHeader.biWidth = nWidth;
    m_info->bmiHeader.biHeight = nHeight;
	
	Invalidate();
	
}

void CShowPixView::OnStretch() 
{
	// TODO: Add your command handler code here
	m_flag=0;
	int i,j;
	float stretch[3]={0.0,0.0,0.0};
				
	CStretchDialog dlg;
	dlg.m_stretch1=stretch[1];
    dlg.m_stretch2=stretch[2];

	
	if(dlg.DoModal()==IDOK)
	{

		stretch[1]=dlg.m_stretch1;
		stretch[2]=dlg.m_stretch2;

		int Hnew = int(m_info->bmiHeader.biHeight*stretch[2]+0.5);
		int Wnew = int(m_info->bmiHeader.biWidth*stretch[1]+0.5);
		int Wnew1=(Wnew+3)/4*4;
		int Wold=(m_info->bmiHeader.biWidth+3)/4*4;  

		BYTE *pDataNew =new BYTE[Wnew1*Hnew];

			for( i = 0; i <Hnew; i=i+1 )
			{			 
				for(  j =0; j <Wnew1; j=j+1 )
				{
					int m=i/stretch[2];
					int n=j/stretch[1];
					if(m>0 &&m<m_info->bmiHeader.biHeight && n>0 && n<m_info->bmiHeader.biWidth)
					{
						pDataNew[ i*Wnew1+j]=m_pData[m*Wold+n];
					}
					
				}
			}  
		

		if(m_pData)
		{
			delete[] m_pData;
			m_pData=NULL;
		}
		m_pData=pDataNew;
		
		m_info->bmiHeader.biWidth = Wnew;
		m_info->bmiHeader.biHeight =Hnew;
	   	   
		Invalidate();
		
	}
}

void CShowPixView::OnRotate() 
{
	// TODO: Add your command handler code here

    m_flag=0;
	double pi=3.14159265;
	int i,j,i0,j0;

		// 旋转角度
	int	rotate;
	
	// 旋转角度的正弦和余弦
	float	Sina, Cosa;
	
	// 源图四个角的坐标(以图像中心为坐标系原点)
	float	SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;
	
	// 旋转后四个角的坐标(以图像中心为坐标系原点)
	float	DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;
	
	// 两个中间常量
	float	f1,f2;

	CRotateDialog dlg;
	dlg.m_rotate=0.0;
	
	if (dlg.DoModal() == IDOK)
	{
		
	rotate=dlg.m_rotate;

    double rotate1=rotate*pi/180;

	// 计算旋转角度的正弦
	Sina = (float) sin((double)rotate1);
	
	// 计算旋转角度的余弦
	Cosa = (float) cos((double)rotate1);
	
    int Width=m_info->bmiHeader.biWidth;
	int Height=m_info->bmiHeader.biHeight;
	
	// 计算原图的四个角的坐标(以图像中心为坐标系原点)
	SrcX1 = (float) (- (Width ) / 2);
	SrcY1 = (float) (  (Height ) / 2);
	SrcX2 = (float) (  (Width ) / 2);
	SrcY2 = (float) (  (Height ) / 2);
	SrcX3 = (float) (- (Width ) / 2);
	SrcY3 = (float) (- (Height) / 2);
	SrcX4 = (float) (  (Width  ) / 2);
	SrcY4 = (float) (- (Height) / 2);
	
	// 计算新图四个角的坐标(以图像中心为坐标系原点)
	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;
	
	// 计算旋转后的图像实际宽度
  int NewWidth  = ( int) ( max( abs(DstX4 - DstX1), abs(DstX3 -DstX2) ) +0.5);
	
	
	// 计算旋转后的图像高度
   int	NewHeight = ( int) ( max( abs(DstY4 - DstY1), abs(DstY3 - DstY2) )+ 0.5);
	
	// 两个常数
	f1 = (float) (-0.5 * NewWidth * Cosa - 0.5 * NewHeight  * Sina
		+ 0.5 * Width );
	f2 = (float) ( 0.5 * NewWidth  * Sina - 0.5 * NewHeight  * Cosa
		+ 0.5 * Height );


	BYTE *pDataNew =new BYTE[(NewWidth+3)/4*4*NewHeight];

	
	// 针对图像每行进行操作
	for(i = 0; i < NewHeight; i++)
	{
		// 针对图像每列进行操作
		for(j = 0; j < NewWidth; j++)
		{

			
			// 计算该象素在原图象中的坐标
			i0 = (int) (-((float) j) * Sina + ((float) i) * Cosa + f2 );
			j0 = (int) ( ((float) j) * Cosa + ((float) i) * Sina + f1 );
			
			// 判断是否在源图范围内
			if( (j0 >= 0) && (j0 < Width) && (i0 >= 0) && (i0 < Height))
			{
				pDataNew[ (NewHeight-1-i)*((NewWidth+3)/4*4)+j]=m_pData[(Height-1-i0)*((Width+3)/4*4)+j0];
			}
			else
			{
				// 对于源图中没有的象素,直接赋值为255
				pDataNew[ (NewHeight-1-i)*((NewWidth+3)/4*4)+j]=255;
			}
			
		}
		
	}

		if(m_pData)
		{
			delete[] m_pData;
			m_pData=NULL;
		}

		m_pData=pDataNew;
		
		m_info->bmiHeader.biWidth = NewWidth;
		m_info->bmiHeader.biHeight=NewHeight;
	   	   
		Invalidate();
	}		

}

⌨️ 快捷键说明

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