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

📄 showpixview.cpp

📁 在vc++中调试运行通过.可以进行图像几何变换。一个不错的程序哦!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ShowPixView.cpp : implementation of the CShowPixView class
//

#include "stdafx.h"
#include "ShowPix.h"
#include <math.h>

#include "ShowPixDoc.h"
#include "ShowPixView.h"
#include "MoveDialog.h"
#include "StretchDialog.h"
#include "RotateDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CShowPixView

IMPLEMENT_DYNCREATE(CShowPixView, CScrollView)

BEGIN_MESSAGE_MAP(CShowPixView, CScrollView)
	//{{AFX_MSG_MAP(CShowPixView)
	ON_COMMAND(ID_SHOWPIX, OnShowpix)
	ON_COMMAND(ID_SMOOTH, OnSmooth)
	ON_COMMAND(ID_SMOOTH1, OnSmooth1)
	ON_COMMAND(ID_FILTER, OnFilter)
	ON_COMMAND(ID_RUIHUA, OnRuihua)
	ON_COMMAND(ID_SOBLE, OnSoble)
	ON_COMMAND(ID_GAUS, OnGaus)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_MOVE, OnMove)
	ON_COMMAND(ID_XMIRRO, OnXmirro)
	ON_COMMAND(ID_YMIRRO, OnYmirro)
	ON_COMMAND(ID_TRANSPOSE, OnTranspose)
	ON_COMMAND(ID_STRETCH, OnStretch)
	ON_COMMAND(ID_ROTATE, OnRotate)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShowPixView construction/destruction

CShowPixView::CShowPixView()
{
	m_info=NULL;
	m_pData=NULL;
    m_flag=-1;
}

CShowPixView::~CShowPixView()
{
	if( m_info )
	{
		delete [] m_info;
		m_info = NULL;
	}
	
	if( m_pData )
	{
		delete [] m_pData;
		m_pData = NULL;
	}
	
}

BOOL CShowPixView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CShowPixView drawing

void CShowPixView::OnDraw(CDC* pDC)
{
	CShowPixDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	//SetStretchBltMode(COLORONCOLOR);
	if( (m_info != NULL) && (m_pData != NULL) )
	{
		switch(  m_flag )
		{		
		case 0:
			
			::StretchDIBits(this->GetDC()->GetSafeHdc(),0,0,m_info->bmiHeader.biWidth,m_info->bmiHeader.biHeight,
				0,0,m_info->bmiHeader.biWidth,m_info->bmiHeader.biHeight,m_pData,m_info,DIB_RGB_COLORS,SRCCOPY);
			break;
			
		case 1:
			
			// Draw coordinate
			int Areint[256];
			int p=(m_info->bmiHeader.biWidth+3)/4*4;
			for( int index = 0; index < 256; index++ )
				Areint[index] = 0;
			for (int i=0;i<m_info->bmiHeader.biHeight;i++)
			{
				for(int j=0;j<m_info->bmiHeader.biWidth;j++)
				{
					Areint[ m_pData[i*p+j] ]++;
				}
				
			}
			
			int nY = -900;
			int nX = 400;
			
			pDC->MoveTo( nX, nY );
			pDC->LineTo( nX + 500, nY );
			pDC->LineTo( nX + 485, nY+5 );
            pDC->MoveTo( nX + 500, nY);
            pDC->LineTo( nX + 485, nY-5 );
			
			pDC->MoveTo( nX, nY );
            pDC->LineTo( nX ,0);
			pDC->LineTo( nX-5, -15);
			pDC->MoveTo(nX ,0 );
			pDC->LineTo( nX +5, -15);
			
			for( index = 0; index < 256; index++ )
			{
				pDC->MoveTo( nX +index, nY);
				pDC->LineTo( nX+index, nY + Areint[index]);
			}
			
		}
	}
	
}

void CShowPixView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	
	CSize sizeTotal(10000,10000);
	CSize sizeLine=CSize(sizeTotal.cx/100,sizeTotal.cy/100);
	
	// TODO: calculate the total size of this view
	
	SetScrollSizes(MM_LOENGLISH,sizeTotal,sizeTotal,sizeLine );
	
}

/////////////////////////////////////////////////////////////////////////////
// CShowPixView printing

BOOL CShowPixView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CShowPixView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CShowPixView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CShowPixView diagnostics

#ifdef _DEBUG
void CShowPixView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CShowPixView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CShowPixDoc* CShowPixView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShowPixDoc)));
	return (CShowPixDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CShowPixView message handlers


void CShowPixView::OnShowpix() 
{
	// TODO: Add your command handler code here
	//设置标志位
	m_flag=1;
	
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	AfxMessageBox("此处显示灰度统计直方图,要查看灰度值,请打开项目文件夹中的value.txt");
	
    
	//打开文件
	CFile fileSave;
	fileSave.Open( "Value.txt", CFile::modeWrite | CFile::modeCreate );
	
	
	//读取各个象素点的灰度值
	for( int i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
	{
		CString strValue;
		CString strNum;
		strNum.Format( "R%03d:", i+1 );
		strValue = strNum;
		for( int j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
		{
			CString strRow;
			strRow.Format( "%03d  ", m_pData[i*p+j] );
			strValue += strRow;
		}
		
		strValue += "\r\n";
		
		//每读取完一行数据就写入文件	
		fileSave.Write( strValue, strValue.GetLength());
	}
	
	fileSave.Close();
	Invalidate();
    
}

void CShowPixView::OnSmooth() 
{
	// TODO: Add your command handler code here
	//设置标志位
	m_flag=0;
	
	int i,j;
	
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
    //建立临时数组
	int *smooth=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
    
	//平滑 高斯模版{1,2,1,2,4,2,1,2,1}
    for(  i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
	{		 
		for(  j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
		{
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{} 
			else
			{
				smooth[i*p+j]=(4*m_pData[i*p+j]+
					2*m_pData[i*p+j-1]+
					2*m_pData[i*p+j+1]+
					2*m_pData[(i-1)*p+j]+
					2*m_pData[(i+1)*p+j]+
					m_pData[(i-1)*p+j-1]+
					m_pData[(i-1)*p+j+1]+
					m_pData[(i+1)*p+j-1]+
					m_pData[(i+1)*p+j+1])/16;
				
			}
			
		}// for	       	   	
	}//for
	
	//赋值
	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]=smooth[i*p+j];			  
	}
	free(smooth);
	Invalidate();
}

void CShowPixView::OnSmooth1() 
{
	// TODO: Add your command handler code here
	//设置标志位
	m_flag=0;	
	
	int i,j;int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
	
	
	//建立临时数组
	int *smooth1=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
	
	//平滑 设置Box模版{1,1,1,1,1,1,1,1,1}
    for(  i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
	{	 
		
		for(  j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
		{
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{}
			else
			{
				smooth1[i*p+j]=(m_pData[i*p+j]+
					m_pData[i*p+j-1]+
					m_pData[i*p+j+1]+
					m_pData[(i-1)*p+j]+
					m_pData[(i+1)*p+j]+
					m_pData[(i-1)*p+j-1]+
					m_pData[(i-1)*p+j+1]+
					m_pData[(i+1)*p+j-1]+
					m_pData[(i+1)*p+j+1])/9; 
			}
			
		}// for  	
	}//for
	
	//赋值
	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]=smooth1[i*p+j];			  
	}
    free(smooth1);
	Invalidate();
}


void CShowPixView::OnFilter() 
{
	// 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;
	
    int *middle=(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 )
			  {
				  middle[i*p+j]=m_pData[i*p+j];
			  }
	}
	
	//过滤	
	//水平方向取中值
	for( i = 0; i < m_info->bmiHeader.biHeight; i++ )
	{	 		 
		for(  j = 0; j < m_info->bmiHeader.biWidth; j++ )
		{
			
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{}
			else
			{ 
				//边缘点的灰度值不变
				if(middle[i*p+j]>middle[i*p+j+1]&&
					middle[i*p+j]>middle[i*p+j-1])
				{
					if(middle[i*p+j+1]>middle[i*p+j-1])
						middle[i*p+j]=middle[i*p+j+1];
					else
						middle[i*p+j]=middle[i*p+j-1];
				}
			}
		}
	}
	
	//垂直方向取中值
	for(  j = 0; j < m_info->bmiHeader.biWidth; j++ )
	{
		for(  i = 0; i < m_info->bmiHeader.biHeight; i++ )
		{ 
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{}
			else
			{
				if(middle[i*p+j]>middle[(i-1)*p+j]&&
					middle[i*p+j]>middle[(i+1)*p+j])
				{
					if(middle[(i-1)*p+j]>middle[i*p+j])
						middle[i*p+j]=middle[(i-1)*p+j];
					else
						middle[i*p+j]=middle[(i+1)*p+j];
				}
			}
		}
    }
	
    //赋值
	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]=middle[i*p+j];			  
	}	
	free(middle);
	Invalidate();
}

void CShowPixView::OnRuihua() 
{
	// TODO: Add your command handler code here
	//设置标志位
	m_flag=0;
	int i,j;
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	
    //建立临时数组
	int *pix2=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
	
    //锐化 模板为{-1,-1,-1,-1,9,-1,-1,-1,-1}
    for( i = 0; i < m_info->bmiHeader.biHeight; i++ )
	{	 
		for( j = 0; j < m_info->bmiHeader.biWidth; j++ )
		{
			//边缘点的灰度值不变
			if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
			{}
			else
			{
				
				pix2[i*p+j]    =   9*m_pData[i*p+j]-
					(m_pData[(i+1)*p+j]+
					m_pData[(i+1)*p+j+1]+
					m_pData[(i+1)*p+j-1]+
					m_pData[i*p+j+1]+
					m_pData[i*p+j-1]+
					m_pData[(i-1)*p+j+1]+
					m_pData[(i-1)*p+j-1]+
					m_pData[(i-1)*p+j]);
				
				
				
				
				//灰度超过255按255来计,小于0按0来计
				if( pix2[i*p+j]>255)
					pix2[i*p+j]=255;
				else
				{
					if( pix2[i*p+j]<0)
						pix2[i*p+j]=0;
				}
			}//else
			
		}// for   	
	}//for
	
	//赋值
	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]=pix2[i*p+j];			 
	}
	free(pix2);
	
	Invalidate();
}

void CShowPixView::OnSoble() 
{
	// TODO: Add your command handler code here
	//设置标志位
	m_flag=0;
	
    int i,j;
	
	int p=(m_info->bmiHeader.biWidth+3)/4*4;
	

⌨️ 快捷键说明

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